android ota 升级包制作分析 (3 打包流程)

来源:互联网 发布:软件著作权 源代码 编辑:程序博客网 时间:2024/04/30 09:05

主流程(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)

ota1

  • 创建升级脚本生成器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)

ota2

ota3

ota4

  • 创建升级脚本生成器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的生成与结构

0 0