您的位置:首页 > 移动开发 > Android开发

Android OTA 升级之三:生成recovery.img

2013-05-06 10:17 316 查看
AndroidOTA升级之三:生成recovery.img

前言

得到了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为我们的编译目标:

584INSTALLED_RECOVERYIMAGE_TARGET:=$(PRODUCT_OUT)/recovery.img


它依赖很多其它目标:

1.MKBOOTFS,MINIGZIP,MKBOOTIMG,PC端工具软件:

(Frombuild/core/config.mk)

265MKBOOTFS:=$(HOST_OUT_EXECUTABLES)/mkbootfs$(HOST_EXECUTABLE_SUFFIX)

266MINIGZIP:=$(HOST_OUT_EXECUTABLES)/minigzip$(HOST_EXECUTABLE_SUFFIX)

267MKBOOTIMG:=$(HOST_OUT_EXECUTABLES)/mkbootimg$(HOST_EXECUTABLE_SUFFIX)


2.INSTALLED_RAMDISK_TARGET,标准根文件系统ramdisk.img:

326BUILT_RAMDISK_TARGET:=$(PRODUCT_OUT)/ramdisk.img

328#Wejustbuildthisdirectlytotheinstalllocation.

329INSTALLED_RAMDISK_TARGET:=$(BUILT_RAMDISK_TARGET)


3.INSTALLED_BOOTIMAGE_TARGET,即boot.img,标准内核及标准根文件系统:

362INSTALLED_BOOTIMAGE_TARGET:=$(PRODUCT_OUT)/boot.img


4.recovery_binary,Recovery可执行程序,源码位于:bootable/recovery

590recovery_binary:=$(callintermediates-dir-for,EXECUTABLES,recovery)/recovery


5.recovery_initrc,recovery模式的init.rc,位于bootable/recovery/etc/init.rc

586recovery_initrc:=$(callinclude-path-for,recovery)/etc/init.rc


6.recovery_kernel,recovery模式的kernel,同标准内核

587recovery_kernel:=$(INSTALLED_KERNEL_TARGET)#sameasanon-recoverysystem


7.INSTALLED_2NDBOOTLOADER_TARGET,我们不用。


8.recovery_build_prop,recovery模式的build.prop,同标准模式。

589recovery_build_prop:=$(INSTALLED_BUILD_PROP_TARGET)


9.recovery_resource_deps,recovery模式使用的res,位于:recovery/custom/{product_name}/res,以及设备自定义部分(我们没用到)

591recovery_resources_common:=$(callinclude-path-for,recovery)/custom/$(TARGET_PRODUCT)/res

592recovery_resources_private:=$(strip$(wildcard$(TARGET_DEVICE_DIR)/recovery/res))

593recovery_resource_deps:=$(shellfind$(recovery_resources_common)

594$(recovery_resources_private)-typef)


10.RECOVERY_INSTALL_OTA_KEYS,ota密钥:

618#Generateafilecontainingthekeysthatwillbereadbythe

619#recoverybinary.

620RECOVERY_INSTALL_OTA_KEYS:=/

621$(callintermediates-dir-for,PACKAGING,ota_keys)/keys

L638-L655准备内容

638@echo-----Makingrecoveryimage------

639rm-rf$(TARGET_RECOVERY_OUT)

640mkdir-p$(TARGET_RECOVERY_OUT)

641mkdir-p$(TARGET_RECOVERY_ROOT_OUT)

642mkdir-p$(TARGET_RECOVERY_ROOT_OUT)/etc

643mkdir-p$(TARGET_RECOVERY_ROOT_OUT)/tmp


准备recovery目录:out/target/product/{product_name}/recovery及其子目录:

./root

./root/etc

./root/tmp

644echoCopyingbaselineramdisk...

645cp-R$(TARGET_ROOT_OUT)$(TARGET_RECOVERY_OUT)

646echoModifyingramdiskcontents...

647rm-rf$(TARGET_RECOVERY_ROOT_OUT)/res


从标准根文件系统拷贝所有文件,删除其res目录。


648cp-f$(recovery_initrc)$(TARGET_RECOVERY_ROOT_OUT)/

649cp-f$(recovery_binary)$(TARGET_RECOVERY_ROOT_OUT)/sbin/


拷贝recovery模式的核心文件init.rc及recovery


650cp-rf$(recovery_resources_common)$(TARGET_RECOVERY_ROOT_OUT)/

651$(foreachitem,$(recovery_resources_private),/

652cp-rf$(item)$(TARGET_RECOVERY_ROOT_OUT)/)

653cp$(RECOVERY_INSTALL_OTA_KEYS)$(TARGET_RECOVERY_ROOT_OUT)/res/keys


拷贝资源文件及密钥文件。



654cat$(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根文件系统


657build/quacomm/mkimage$(PRODUCT_OUT)/ramdisk-recovery.imgRECOVERY>$(PRODUCT_OUT)/ramdisk_recovery.img


加一个标识头(RECOVERY)


658mv$(PRODUCT_OUT)/ramdisk_recovery.img$(PRODUCT_OUT)/ramdisk-recovery.img

659$(MKBOOTIMG)$(INTERNAL_RECOVERYIMAGE_ARGS)--output$@

660@echo-----Maderecoveryimage--------$@

661$(hide)$(callassert-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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: