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

作者: 宋立新

Email[email protected]

前言

得到了ota升级包后,我们就可以用它来升级系统了。Android 手机开机后,会先运行 bootloader Bootloader 会根据某些判定条件(比如按某个特殊键)决定是否进入 recovery 模式。Recovery 模式会装载 recovery 分区, 该分区包含recovery.imgrecovery.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

它依赖很多其它目标:

1MKBOOTFS, MINIGZIP, MKBOOTIMGPC端工具软件:
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)

2INSTALLED_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)
3INSTALLED_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_initrcrecovery模式的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_proprecovery 模式的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)/keys

L638-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 [email protected]
660 @echo ----- Made recovery image -------- [email protected]
661 $(hide) $(call assert-max-image-size,[email protected],$(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

更多相关文章

  1. Android涉及到的设计模式
  2. Android: JAVA和C# 3DES加密解密
  3. 简单介绍Android中Activity的四种启动模式
  4. Android(安卓)四大组件--activity 的 启动模式和生命周期
  5. Android的联通性---USB的主机模式和从属模式
  6. android中singleTask的home键的问题
  7. Android(安卓)MVP开发模式 google 官方Mvp架构详解(转)
  8. Android手机AP模式下本机IP
  9. 【Android】19.1 SharedPreferences类

随机推荐

  1. Android获取手机信息
  2. 2013.01.03 (2)——— android开发实例之仿
  3. Android通过http协议POST传输方式
  4. 仿照Android的池化技术
  5. Android(安卓)- 设置带滚动条的TextView
  6. Android(安卓)源码 修改系统默认横屏
  7. Android(安卓)Bluetooth Code
  8. Android(安卓)中使用自定义字体的方法
  9. android SQLite
  10. Android(安卓)studio gradle 生成字段属