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

2024-04-22 17:58

本文主要是介绍Android OTA 升级之三:生成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 为我们的编译目标:

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)/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


这篇关于Android OTA 升级之三:生成recovery.img的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/926473

相关文章

Java使用Javassist动态生成HelloWorld类

《Java使用Javassist动态生成HelloWorld类》Javassist是一个非常强大的字节码操作和定义库,它允许开发者在运行时创建新的类或者修改现有的类,本文将简单介绍如何使用Javass... 目录1. Javassist简介2. 环境准备3. 动态生成HelloWorld类3.1 创建CtC

Debian 13升级后网络转发等功能异常怎么办? 并非错误而是管理机制变更

《Debian13升级后网络转发等功能异常怎么办?并非错误而是管理机制变更》很多朋友反馈,更新到Debian13后网络转发等功能异常,这并非BUG而是Debian13Trixie调整... 日前 Debian 13 Trixie 发布后已经有众多网友升级到新版本,只不过升级后发现某些功能存在异常,例如网络转

Ubuntu如何升级Python版本

《Ubuntu如何升级Python版本》Ubuntu22.04Docker中,安装Python3.11后,使用update-alternatives设置为默认版本,最后用python3-V验证... 目China编程录问题描述前提环境解决方法总结问题描述Ubuntu22.04系统自带python3.10,想升级

解决升级JDK报错:module java.base does not“opens java.lang.reflect“to unnamed module问题

《解决升级JDK报错:modulejava.basedoesnot“opensjava.lang.reflect“tounnamedmodule问题》SpringBoot启动错误源于Jav... 目录问题描述原因分析解决方案总结问题描述启动sprintboot时报以下错误原因分析编程异js常是由Ja

Python从Word文档中提取图片并生成PPT的操作代码

《Python从Word文档中提取图片并生成PPT的操作代码》在日常办公场景中,我们经常需要从Word文档中提取图片,并将这些图片整理到PowerPoint幻灯片中,手动完成这一任务既耗时又容易出错,... 目录引言背景与需求解决方案概述代码解析代码核心逻辑说明总结引言在日常办公场景中,我们经常需要从 W

Android协程高级用法大全

《Android协程高级用法大全》这篇文章给大家介绍Android协程高级用法大全,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友跟随小编一起学习吧... 目录1️⃣ 协程作用域(CoroutineScope)与生命周期绑定Activity/Fragment 中手

C#使用Spire.XLS快速生成多表格Excel文件

《C#使用Spire.XLS快速生成多表格Excel文件》在日常开发中,我们经常需要将业务数据导出为结构清晰的Excel文件,本文将手把手教你使用Spire.XLS这个强大的.NET组件,只需几行C#... 目录一、Spire.XLS核心优势清单1.1 性能碾压:从3秒到0.5秒的质变1.2 批量操作的优雅

Python使用python-pptx自动化操作和生成PPT

《Python使用python-pptx自动化操作和生成PPT》这篇文章主要为大家详细介绍了如何使用python-pptx库实现PPT自动化,并提供实用的代码示例和应用场景,感兴趣的小伙伴可以跟随小编... 目录使用python-pptx操作PPT文档安装python-pptx基础概念创建新的PPT文档查看

在ASP.NET项目中如何使用C#生成二维码

《在ASP.NET项目中如何使用C#生成二维码》二维码(QRCode)已广泛应用于网址分享,支付链接等场景,本文将以ASP.NET为示例,演示如何实现输入文本/URL,生成二维码,在线显示与下载的完整... 目录创建前端页面(Index.cshtml)后端二维码生成逻辑(Index.cshtml.cs)总结

Python实现数据可视化图表生成(适合新手入门)

《Python实现数据可视化图表生成(适合新手入门)》在数据科学和数据分析的新时代,高效、直观的数据可视化工具显得尤为重要,下面:本文主要介绍Python实现数据可视化图表生成的相关资料,文中通过... 目录前言为什么需要数据可视化准备工作基本图表绘制折线图柱状图散点图使用Seaborn创建高级图表箱线图热