-
解析输入参数(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的生成
? [Android]构建boot.img(二):kernel的拷贝与打包
? [Android]构建boot.img(三):boot.img的生成与结构