主流程(main)
- 解析输入参数(common.ParseOptions)
- 解压输入zip文件(input_zip,common.UnzipTemp)
- 读入META信息字典(common.LoadInfoDict)
- META/misc_info.txt
- 其他可选的META目录下的文件:mkyaffs2-extra-flags.txt、recovery-api-version.txt、tool-extensions.txt、imagesizes.txt
- 读入recovery分区表(LoadRecoveryFSTab,从RECOVERY/RAMDISK/etc/ recovery.fstab)
- 读入build属性(LoadBuildProp,从SYSTEM/build.prop)
- 如果META字典中有selinux_fc,selinux_fc=”BOOT/RAMDISK/file_contexts”
- 创建输出zip文件(output_zip,zipfile.ZipFile),如果需要签名,使用临时文件中转
- 根据是否有增量源OPTIONS.incremental_source(-i参数指定)
- 写完整升级包(WriteFullOTAPackage)
- 创建增量源文件(source_zip),写增量升级包(WriteIncrementalOTAPackage)
- 如果需要,进行签名(SignOutput)
完整升级包(WriteFullOTAPackage)
- 创建升级脚本生成器edify_generator.EdifyGenerator
- 定义metadata:{post-build: ro.build.fingerprint, pre-device: ro.product.device, post-timestamp: ro.build.date.utc}
- 创建升级包制作干预common.DeviceSpecificParams对象
- 【升级脚本】检查时间(没有--omit_prereq)、版本一致性
- 【升级脚本】格式化/data分区(如果wipe_user_data)
- 如果META字典中有selinux_fc,写入selinux_fc(文件路径)到zip文件(WritePolicyConfig)
- 【升级脚本】格式化并挂载/system分区
- 【升级脚本】解压recovery、system目录到/system
- 从输入zip拷贝文件到输出zip
- 【升级脚本】创建符号链接
- 获取boot.img、recovery.img(common.GetBootableImage)
- 生成recovery image相对boot image增量patch,以及recovery升级脚本
- 解析文件属性定义(Item.GetMetadata)
- 【升级脚本】修改system目录下文件属性
- 写入boot.img到输出zip
- 【升级脚本】解压boot.img到boot分区
- 【升级脚本】卸载分区
- 将升级脚本写入到输出zip(script.AddToZip,META-INF/com/google/android/updater-script)
- 将metadata写入到输出zip(WriteMetadata,META-INF/com/android/metadata)
增量升级包(WriteIncrementalOTAPackage)
- 创建升级脚本生成器edify_generator.EdifyGenerator
- 定义metadata:{post-build: ro.build.fingerprint, pre-device: ro.product.device, post-timestamp: ro.build.date.utc}
- 创建升级包制作干预common.DeviceSpecificParams对象
- 加载源、目标zip文件中的SYSTEM目录文件(LoadSystemFiles)
- 构建源、目标文件对应关系(算法在ClosestFileMatch中),分成“重命名组”、“覆盖组(包括源文件不存在的文件)”,“差异组”,“覆盖组”文件写入到输出zip文件
- 计算所有“差异组”文件的差别
- 写入目标文件(如果差量反而更大移动到“覆盖组”)或者增量文件到输出zip文件
- 【升级脚本】挂载/system分区
- 【升级脚本】检查Fingerprint是否一致
- 从源zip、目标zip中分别获取boot.img、recovery.img(common.GetBootableImage)
- 【升级脚本】校验所有源文件的SHA1(script.PatchCheck)
- 【升级脚本】如果boot有更新,校验boot的SHA1
- 【升级脚本】检验cache剩余空间是否足够(至少largest_source_size)
- 【升级脚本】删除“覆盖组”文件(包括被直接替换的文件)
- 【升级脚本】应用patch(“差异组”,但是system/build.prop延后)
- 【升级脚本】如果boot有更新,应用boot patch升级
- 如果recovery有更新,生成recovery image相对boot image增量patch,以及recovery升级脚本
- 【升级脚本】如果recovery有更新,删除老的recovery增量patch和升级脚本
- 提取源、目标zip中的所有符号链接
- 解析文件属性定义(Item.GetMetadata)
- 【临时升级脚本】修改system目录下文件属性
- 【升级脚本】删除不再需要的符号链接
- 【升级脚本】解压system目录到/system
- 【升级脚本】如果recovery有更新,解压recovery目录到/system
- 【升级脚本】重命名绑定的那些文件
- 【升级脚本】删除并重建目标符号链接
- 【升级脚本】增加【临时升级脚本】
- 【升级脚本】对一些延后处理的文件,应用patch
- 【升级脚本】设置/system/build.prop的属性
- 【升级脚本】卸载分区
- 将升级脚本写入到输出zip(script.AddToZip,META-INF/com/google/android/updater-script)
- 将metadata写入到输出zip(WriteMetadata,META-INF/com/android/metadata)
参考:
Ø [Android]构建boot.img(一):root目录与ramdisk.img的生成