Android OTA 升级之三:生成recovery.img
Android OTA?升級之三:生成recovery.img
作者: 宋立新
Email:zjujoe@yahoo.com
前言
???????得到了ota升級包后,我們就可以用它來升級系統了。Android?手機開機后,會先運行?bootloader。?Bootloader?會根據某些判定條件(比如按某個特殊鍵)決定是否進入?recovery?模式。Recovery?模式會裝載?recovery?分區,?該分區包含recovery.img。recovery.img?包含了標準內核(和boot.img中的內核相同)以及recovery?根文件系統。下面我們看一下它是如何生成的。
?
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.img 328 # 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/{product_name}/res,?以及設備自定義部分(我們沒用到)
591 recovery_resources_common := $(call include-path-for, recovery)/custom/$(TARGET_PRODUCT)/res 592 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 the 619 # 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)/etc 643???????? mkdir -p $(TARGET_RECOVERY_ROOT_OUT)/tmp?
準備recovery目錄:out/target/product/{product_name}/recovery?及其子目錄:
./root
./root/etc
./root/tmp
?
644???????? 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/product/{product_name}/root/default.prop)以及system分區的build.prop (out/target/product/{product_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.img 659???????? $(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
總結
以上是生活随笔為你收集整理的Android OTA 升级之三:生成recovery.img的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 理解 Android Build 系统
- 下一篇: Android启动过程以及各个镜像的关系