編譯rec
A. android源碼怎麼編譯生成recovery.img
recovery.img生成過程
L630-L637 依賴關系
(From: build/core/Makefile)630 $(INSTALLED_RECOVERYIMAGE_TARGET): $(MKBOOTFS) $(MKBOOTIMG) $(MINIGZIP) /631 $(INSTALLED_RAMDISK_TARGET) /632 $(INSTALLED_BOOTIMAGE_TARGET) /633 $(recovery_binary) /634 $(recovery_initrc) $(recovery_kernel) /635 $(INSTALLED_2NDBOOTLOADER_TARGET) /636 $(recovery_build_prop) $(recovery_resource_deps) /637 $(RECOVERY_INSTALL_OTA_KEYS)
INSTALLED_RECOVERYIMAGE_TARGET 為我們的編譯目標:
584 INSTALLED_RECOVERYIMAGE_TARGET := $(PRODUCT_OUT)/recovery.img
它依賴很多其它目標:
1.MKBOOTFS, MINIGZIP, MKBOOTIMG,PC端工具軟體:(From build/core/config.mk)265 MKBOOTFS := $(HOST_OUT_EXECUTABLES)/mkbootfs$(HOST_EXECUTABLE_SUFFIX)266 MINIGZIP := $(HOST_OUT_EXECUTABLES)/minigzip$(HOST_EXECUTABLE_SUFFIX)267 MKBOOTIMG := $(HOST_OUT_EXECUTABLES)/mkbootimg$(HOST_EXECUTABLE_SUFFIX)
2.INSTALLED_RAMDISK_TARGET,標准根文件系統 ramdisk.img:
326 BUILT_RAMDISK_TARGET := $(PRODUCT_OUT)/ramdisk.img328 # We just build this directly to the install location.329 INSTALLED_RAMDISK_TARGET := $(BUILT_RAMDISK_TARGET) 3.INSTALLED_BOOTIMAGE_TARGET, 即boot.img,標准內核及標准根文件系統:362 INSTALLED_BOOTIMAGE_TARGET := $(PRODUCT_OUT)/boot.img
4. recovery_binary, Recovery可執行程序,源碼位於:bootable/recovery
590 recovery_binary := $(call intermediates-dir-for,EXECUTABLES,recovery)/recovery
5. recovery_initrc,recovery模式的init.rc, 位於 bootable/recovery/etc/init.rc
586 recovery_initrc := $(call include-path-for, recovery)/etc/init.rc
6. recovery_kernel, recovery 模式的kernel, 同標准內核
587 recovery_kernel := $(INSTALLED_KERNEL_TARGET) # same as a non-recovery system
7.INSTALLED_2NDBOOTLOADER_TARGET,我們不用。
8. recovery_build_prop, recovery 模式的build.prop, 同標准模式。589 recovery_build_prop := $(INSTALLED_BUILD_PROP_TARGET)
9. recovery_resource_deps, recovery 模式使用的res, 位於:recovery/custom/{proct_name}/res, 以及設備自定義部分(我們沒用到)
591 recovery_resources_common := $(call include-path-for, recovery)/custom/$(TARGET_PRODUCT)/res592 recovery_resources_private := $(strip $(wildcard $(TARGET_DEVICE_DIR)/recovery/res))593 recovery_resource_deps := $(shell find $(recovery_resources_common) 594 $(recovery_resources_private) -type f) 10. RECOVERY_INSTALL_OTA_KEYS, ota 密鑰:
618 # Generate a file containing the keys that will be read by the619 # recovery binary.620 RECOVERY_INSTALL_OTA_KEYS := /621 $(call intermediates-dir-for,PACKAGING,ota_keys)/keysL638-L655 准備內容
638 @echo ----- Making recovery image ------639 rm -rf $(TARGET_RECOVERY_OUT)640 mkdir -p $(TARGET_RECOVERY_OUT)641 mkdir -p $(TARGET_RECOVERY_ROOT_OUT)642 mkdir -p $(TARGET_RECOVERY_ROOT_OUT)/etc643 mkdir -p $(TARGET_RECOVERY_ROOT_OUT)/tmp
准備recovery目錄:out/target/proct/{proct_name}/recovery 及其子目錄:
./root
./root/etc
./root/tmp644 echo Copying baseline ramdisk...645 cp -R $(TARGET_ROOT_OUT) $(TARGET_RECOVERY_OUT)646 echo Modifying ramdisk contents...647 rm -rf $(TARGET_RECOVERY_ROOT_OUT)/res
從標准根文件系統拷貝所有文件, 刪除其res 目錄。
648 cp -f $(recovery_initrc) $(TARGET_RECOVERY_ROOT_OUT)/649 cp -f $(recovery_binary) $(TARGET_RECOVERY_ROOT_OUT)/sbin/ 拷貝recovery 模式的核心文件 init.rc 及 recovery 650 cp -rf $(recovery_resources_common) $(TARGET_RECOVERY_ROOT_OUT)/651 $(foreach item,$(recovery_resources_private), /652 cp -rf $(item) $(TARGET_RECOVERY_ROOT_OUT)/)653 cp $(RECOVERY_INSTALL_OTA_KEYS) $(TARGET_RECOVERY_ROOT_OUT)/res/keys 拷貝資源文件及密鑰文件。 654 cat $(INSTALLED_DEFAULT_PROP_TARGET) $(recovery_build_prop) /655 > $(TARGET_RECOVERY_ROOT_OUT)/default.prop 生成屬性文件 default.prop, 它包含了標准根文件系統的default.prop (out/target/proct/{proct_name}/root/default.prop)以及system分區的build.prop (out/target/proct/{proct_name}/system/build.prop) L656-L661 最終生成recovery.img
656 $(MKBOOTFS) $(TARGET_RECOVERY_ROOT_OUT) | $(MINIGZIP) > $(recovery_ramdisk) 壓縮recovery根文件系統 657 build/quacomm/mkimage $(PRODUCT_OUT)/ramdisk-recovery.img RECOVERY > $(PRODUCT_OUT)/ramdisk_recovery.img 加一個標識頭(RECOVERY) 658 mv $(PRODUCT_OUT)/ramdisk_recovery.img $(PRODUCT_OUT)/ramdisk-recovery.img659 $(MKBOOTIMG) $(INTERNAL_RECOVERYIMAGE_ARGS) --output $@660 @echo ----- Made recovery image -------- $@661 $(hide) $(call assert-max-image-size,$@,$(BOARD_RECOVERYIMAGE_PARTITION_SIZE),raw)
和內核一起,生成recovery.img附:Recovery 根文件系統目錄結構
$ tree
.
├── advanced_meta_init.rc
├── data
├── default.prop
├── dev
├── etc
├── init
├── init.factory.rc
├── init.goldfish.rc
├── init.quacomm.rc
├── init.rc
├── meta_init.rc
├── proc
├── res
│ ├── images
│ │ ├── icon_error.png
│ │ ├── icon_installing.png
│ │ ├── indeterminate1.png
│ │ ├── indeterminate2.png
│ │ ├── indeterminate3.png
│ │ ├── indeterminate4.png
│ │ ├── indeterminate5.png
│ │ ├── indeterminate6.png
│ │ ├── progress_empty.png
│ │ └── progress_fill.png
│ └── keys
├── sbin
│ ├── adbd
│ ├── advanced_meta_init
│ ├── meta_init
│ ├── meta_tst
│ └── recovery
├── sys
├── system
└── tmp
B. 什麼是rec
REC 是計算機術語,全稱是Regional Echomail Coordinator,區內會議信件協調人。
●數學運算符號(求極坐標到直角坐標系的點轉化)與Pol相對。在計算器中一般是shift+Pol
●平面坐標轉化:極坐標系的點轉化到笛卡爾直角坐標系(即平面直角坐標系)。例如:極坐標系(r,θ)轉化到笛卡爾直角坐標系(x,y)
■計算器轉化運算結果為此點的橫坐標x,因為極坐標已知半徑,所以用勾股定理即可求得縱坐標y。
運算方法:例如 Rec(8,60)=8cos60°=4。即Rec(r,θ)=r cos θ。
●三維坐標轉化(難點):球坐標系(r,θ,φ)轉化到笛卡爾仿射坐標系(即空間三維直角坐標系)。本俠剛上初二,自己想了個辦法轉化:分成兩步Rec,先把點到球心的連線投影到仰角φ為零°的平面,形成個射影,Rec(r的射影,θ)(跟極坐標一樣)求出x和y(方法前面已經提到)。然後在【球徑r所在且與φ為零的平面垂直】的平面上建立一個極坐標系,自然,0°—180°那條直線也要在原球坐標系φ=0°那個平面上(建與不建無所謂,就是你們好理解),Rec(r,φ),求出射影進而求出Z【其實也就是把射影利用勾股定理,這里啰嗦了,直觀思維一下吧】,即轉化完畢(x,y,z)其實也就是三步三角函數(射影長度求法:r cos φ)。
●拓展知識:三角函數,sin,cos,tan,cot,sec,csc,Arcsin,Arccos,Arctan,Arccot,Arcsec,Arccsc,射影定理
●其他簡介
簡寫
REC = record,錄制。
REC = receive,收到。
REC = receipt,收據。
REC = recreation,娛樂,僅用於復合詞中。
REC在c++中也有出現,是微軟在MFC中的一種封裝函數類型
其他
REC,二進制資源文件,資源編譯器編譯資源定義後即生成RES文件。
C. 如何構建編譯TWRP touch recovery
目前穩定的的分支是twrp2.4板本2.4.xx代碼基地。如果你使用的CM10.1你*必須*使用twrp2.4分支。主分支代表TWRP2.2和JB-WIP TWRP2.3。選擇任何你喜歡的分支,但唯一的分支越來越活躍的代碼更改twrp2.4。
* CM7 ONLY*
更換整個CM7/build文件夾:
確保您獲得twrp2.3分支和不是主分支。
*開始構建編譯*
注意:如果您添加或更改任何標志,你將需要進行編譯清除,然後再重新編譯或標志更改將不被使用起。
現在,你的源代碼,你需要設置或更改您的設備(S)的一些構建標志。查找BoardConfig.mk為您的設備,CM/devices/manufacturer/codename文件夾(例如CM/devices/hp/tenderloin/BoardConfig.mk)BoardConfig.mk。首先配置BoardConfig.mk的文件為
TARGET_RECOVERY_INITRC:=
如果您的設備有此行,將在恢復中使用一個自定義,預置init.rc的路徑。最有可能的是,你將需要略微更改自定義init.rc。尋找recovery中的init.rc文件,並打開它。頂部附近,你會看到這樣的信息:
on init
export PATH /sbin
export LD_LIBRARY_PATH .:/sbin
添加所需的最後一行。這條線是需要得到的鏈接器運行。 TWRP ClockworkMod不同,是一個動態鏈接的恢復。動態鏈接可以讓我們節省了大量的空間,以幫助確保,TWRP恢復圖像將適合在更多的設備。它也讓我們使用動態鏈接的觸摸屏上看到摩托羅拉Photon與Atrix和惠普的TouchPad,而無需 mount /system 的二進制文件。
還需要包括您的主板配置架構和平台設置。通常情況下,這些都已經包含了,如果你正在使用設備的configs別人創建的,但如果你創建你自己的,你可能需要添加他們。沒有他們,往往會恢復故障段在啟動過程中,你只會看到屏幕上一遍又一遍地典輝簾閃光。
D. 如何修改Recovery的字元串資源
1.recovery_l10n就是谷歌提供的製作字元串圖片的APK,通過源碼下的mmm編譯,可以得到RecoveryLocalizer.apk。
2.打開文件recovery_l10n\res\values-zh-rCN\string.xml
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="recovery_installing" msgid="7864047928003865598">"正在安裝系統更新… 請勿斷電"</string>
<string name="recovery_erasing" msgid="4612809744968710197">"正在清除… 請勿斷電"</string>
<string name="recovery_no_command" msgid="1915703879031023455">"無命令。"</string>
<string name="recovery_error" msgid="4550265746256727080">"出錯了!"</string>
</resources>
3.這里就可以看到需要用到的四個字元串,修改成需要的文字。
4.重新編譯後,安裝到對應的設備。打開apk,選擇相應的字元串,執行Go。
5.通過adb命令既可拿到圖片資源了。
6.拿到資源後,通過執行pngcrush來進行圖片處理,因為讀取pngcrush處理過的png比普通的png快,且內存小。
pugcrush -c 0 text_out.png output.png
至此我們就完成了字元串圖片的創建。
最後,將字元串圖片重新放入到bootable\recovery\res\image目錄下,替換原來的圖片,重新編譯整個工程即可完成修改了。
E. 如何製作自己的recovery.img
首先,把手機硬啟,手機不同其硬啟方法也不同(大多是音量鍵+電源鍵),自己看說明書 1、如果你的手機已經S-OFF,就往下看,如果手機硬啟後顯示S-ON就不用看了,沒戲。 2、用一張質量好的內存卡,在網上下載一個recovery程序(多為PG88IMG.zip) 3、手機硬啟後,用音量鍵選擇recovery,電源鍵確定,後手機自動找到安裝文件,後提示是否安裝,選擇Y,確定,安裝後重啟即可。
F. 第三方刷機包怎樣反編譯在用官方rec刷
官方REC是刷不了第三方ROM的,驗證是通不過的,只有官方出的ROM才能刷進去,你可以刷個第三方REC再刷ROM
G. 如何從源代碼編譯TWRP Recovery
目前穩定的的分支是twrp2.4板本2.4.xx代碼基地。如果你使用的CM10.1你*必須*使用twrp2.4分支。主分支代表TWRP2.2和JB-WIP TWRP2.3。選擇任何你喜歡的分支,但唯一的分支越來越活躍的代碼更改twrp2.4。 * CM7 ONLY* 更換整個CM7/build文件夾
H. 如何針對特定機型,編譯cwm recovery
你必須使用32位或64位Ubuntu系統,關於如何建立編譯環境和同步源碼的指導,請自己查找有關指導的文章。
1,
安裝所需要的包
2,
建立編譯的環境,並同步CWM所需的源碼,CyanogenMod源碼中附帶CWM源碼
CWM
5
-
Gingerbread
CWM
6
-
Jellybean
3,
下面我們進入真正的編譯階段,確保你已經使用「repo
sync
」命令同步了最新的源碼
進入源碼的目錄
放出以下命令:
make
-j4
otatools
3.5,
如果你的機型不被CM10官方支持,請執行這一步
在你的手機終端上執行以下命令,
mp_image
boot
/sdcard/boot.img
這將boot鏡像導出到你手機的sdcard,復制該鏡像至你的home目錄下
為一款新設備編譯android源碼,需要建立相應的配置文件和makefile文件,這通常比較麻煩,如果僅僅編譯recovery鏡像,會容易的多。在android源碼根目錄下(假設已運行envsetup.sh),運行以下命令(使用適當的名稱取代命令中的名稱)
build/tools/device/mkvendor.sh
device_manufacturer_name
device_name
/your/path/to/the/boot.img
例如,你擁有Samsung
Galaxy
Ace這款設備,你應該使用以下這條命令
build/tools/device/mkvendor.sh
Samsung
cooper
~/boot.img
Please
note
that
Cooper
is
the
device
name.
Only
use
"~/boot.img"
if
you
have
the
boot
image
in
your
home
directory.
Or
else
please
specify
the
correct
path.
如果所有都工作正常,你將看到"Done!"這樣的確認信息。mkvendor.sh腳本也將在你的android源碼樹中創建以下目錄:
manufacturer_name/device_name
4,
現在你已經擁有相關的配置文件
在源碼目錄下,在terminal終端下鍵入以下命令
.
build/envsetup.sh
這一步將為你建立編譯環境
現在使用這條命令
lunch
full_device_name-eng
這將為你的設備建立起build
system。用文件管理器或IDE打開目錄,你應該擁有以下文件:
AndroidBoard.mk,
AndroidProcts.mk,
BoardConfig.mk,
device_.mk,
kernel,
system.prop,
recovery.fstab,
和
vendorsetup.sh
對你感興趣的應該是recovery.fstab和kernel這兩個文件,kernel這個文件是你之前從boot.img文件中提取出的。recovery.fstab將適用於大部分擁有
mtd,
emmc,或者其他分區的設備。如果沒有,recovery.fstab將需要優化以支持載入這些點。例如
/sdcard被載入至/dev/block/mmcblk1p1,
你需要將下面這段加入到你的BoardConfig.mk文件中
/sdcard
vfat
/dev/block/mmcblk1p1
一旦recovery.fstab已經適當的裝載,你可以開始下一步了
5,
現在,我們開始編譯Recovery
make
-j4
recoveryimage
這個命令用於編譯recovery鏡像
你能使用這個命令
make
-j4
recoveryzip
用於建立一個臨時的recovery.zip刷機包在你真實的設備上測試
你編譯好的recovery可以在"your_source_directory/OUT/target/proct/device/recovery.img"目錄下找到。而.zip刷機包可以在相同目錄下的utilities文件夾下找到。
如果各項測試正常,就可以有一個成功的recovery
一旦你編譯通過了recovery,通知"koush",在Github上,他就能根據你的編譯文件發放官方版的CWM
Recovery,並使Rom
Manager提供相應的支持。
小貼士:
如果你想編譯CWM6,使用以下命令同步jellybean分支源碼
repo
init
-u
git://github.com/CyanogenMod/android.git
-b
jellybean
repo
sync
如果你改變了BoardConfig.mk文件,在編譯期間運行"make
clobber",否則你做的更改就不會生效。
I. recovery是什麼意思,怎麼進入recovery
recovery
,用 關機鍵+音量+/- (依機型不同而不同,不過有些機型可能沒有刷入recovery,可自行刷入。)即可進入recovery界面,在這個界面你可以直接用sd 卡上的zip格式的rom 升級或者備份你的系統,老版本的recovery
只有三個選項,但是無法備份系統,只能用update.zip這個文件名的文件升級,不能用任何文件名的zip文件升級。新版本已經多出很多選項可以供你操作。
recovery
,用 關機鍵+音量+/- (依機型不同而不同,不過有些機型可能沒有刷入recovery,可自行刷入。)即可進入recovery界面,在這個界面你可以直接用sd 卡上的zip格式的rom 升級或者備份你的系統,老版本的recovery
只有三個選項,但是無法備份系統,只能用update.zip這個文件名的文件升級,不能用任何文件名的zip文件升級。新版本已經多出很多選項可以供你操作。
每部Android設備進入Recovery模式的方法不同。以Milestone為例:若bootloader為90.78,按住鍵盤的「X」鍵,再按電源鍵開機,看到moto的經典logo即可放開此2鍵。等待出現一個三角形圖標,然後按住音量向上鍵+輕按拍照鍵,會出現四個選項。放開按鍵,可以用方向鍵選擇一個選項。作用分別為重啟,應用update.zip,清除所有數據至出廠狀態、清除cache。
recovery模式可以做什麼
您就可以通過這個恢復模式界面刷入或者備份你手機的安卓系統,由於recovery版本更新較快,老版本只有三個選項,因此無法備份系統,也只能通過一個叫做update.zip文件進入系統升級,大部分局限在三星舊機型,例如三星s5660.新版本更新後,舍棄了繁瑣的操作,支持更加強大的備份還原等功能,你可以通過本站其它欄目進行了解。
recovery界面說明
1、Reboot system now——重啟
2、USB-MS toggle——在recovery 模式下直接連接USB而不需要退出該模式
3、Backup/Restore——備份和還原
3-1、Nand backup——Nand 備份
3-2、Nand + ext backup——Nand 備份(系統和ext
分區一同備份)
3-3、Nand restore——還原(就是還原3-1、3-2 的最後一次備份)
3-4、BART backup——BART 備份 (包括系統和ext 分區)
3-5、BART restore——還原最後一次的BART備份
Nand 備份類似於系統的備份 而BART 則像是PC 上ghost 的備份。
Nand 備份 它不會備份ext 分區(就是第二分區 沒有分區的可以不管這個)
所以你的如果app2sd 了 那麼裝在第二分區的程序用Nand
恢復是辦不到的
BAR T則可以備份到ext 分區 用BART 恢復則可以恢復整個系統 可以使它和你備份前一模一樣,
不會有一點文件信息的丟失(包括聯系人、簡訊、圖片、影音等,所以如果你裝的東西比較多,那麼備份和恢復會比較慢)
4、Flash zip from sdcard——從sd卡根目錄的.zip ROM 刷機包刷機
5、Wipe——清除
5-1、Wipe data/factory reset——清除內存數據和緩存數據(刷機前建議清除此項)
5-2、Wipe Dalvik-cache——清除緩存數據 + ext 分區內數據(刷機前建議清除此項)
5-3、Wipe SD:ext partition——只清除ext 分區內數據(刷機前建議清除此項)
5-4、Wipe battery stats——清除電池數據(刷機前建議清除此項)
5-5、Wipe rotate settings——清除感測器內設置的數據(刷機前建議清除此項)
6、Partition sdcard——分區sd 卡
6-1、Partition SD——自動為sd 卡分區
6-2、Repair SD:ext——修復ext 分區
6-3、SD:ext2 to ext3——將ext2 分區轉換為ext3
分區(推薦)
6-4、SD:ext3 to ext4——將ext3 分區轉換為ext4 分區(C4
卡不推薦,C6 卡推薦)
7、Other——其它
7-1、Fix apk uid mismatches——修復apk 程序
7-2、Move apps+dalv to SD——移動程序和虛擬緩存到sd 卡(這個可不是 app2sd)
7-3、Move recovery.log to SD——移動刷機日誌文件到sd 卡
(執行此操作後,sd 卡根目錄會出現一個「recovery.log」 文件 即為刷機日誌文件)
8、Power off——關機
中文觸摸recovery介紹
1、基於CWM 5.0.2.7修改編譯。
2、超大中文字體顯示,美觀大氣。
3、完全兼容按鍵和觸摸屏操作,輕松告別按鍵的束縛。
4、優化recovery功能,去掉了很少用到的功能,使操作更簡單,刷機更輕松。
5、完美支持刷第三方ZIP包,可開啟和關閉rom包驗證功能,可視化顯示,讓你刷機一目瞭然。
6、支持系統備份和恢復,從此不再擔心系統損壞。