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

作者: 宋立新

Emailzjujoe@yahoo.com

前言

       得到了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 $@
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

更多相关文章

  1. Ubuntu共享WiFi(AP)给Android方法【修正版】
  2. Android开启/关闭/监听 飞行模式
  3. Android特色开发--情景模式
  4. Android(安卓)使activity以模式对话框的形式弹出
  5. Android情景模式、文件管理器 完整示例编程详解
  6. Android(安卓)播放声音
  7. android 写入data/data/包名/file/中
  8. 也谈Android的学习和利用Android来赚钱
  9. Android(安卓)ORM框架 GreenDao 的使用详解

随机推荐

  1. 分析Mysql大量数据导入遇到的问题以及解
  2. Windows系统下mysql5.7.21安装详细教程
  3. win10下mysql5.7.21安装详细过程
  4. mysql 5.7.21 安装配置方法图文教程(wind
  5. 详解Linux终端 MySQL常用操作指令
  6. mysql 5.7.21解压版安装配置方法图文教程
  7. mysql5.7.21安装配置教程
  8. mysql 5.7.21 winx64安装配置方法图文教
  9. mysql max 与 where 间的执行问题小结
  10. mysql5.7.21.zip安装教程