`

OTA升级包制作工具处理过程分析

OTA 
阅读更多
OTA升级包制作工具处理过程分析

1、概述
OTA升级包制作工具是一个用python实现的命令行工具。工具位于source_root/ \build\tools\releasetools目录下,入口文件是ota_from_target_files。此工具可对编译生成的源或目标软件版本包进行处理,生成最终的OAT完整升级包(默认),或通过参数-i控制,生成OTA增量升级包(差分包)。
源或目标软件版本包的来源是通过向版本编译配置文件main.mk中添加编译OTA版本编译选项$(INTERNAL_OTA_PACKAGE_TARGET)来完成的。这个不在本文档中不做详细说明。
位置:
# Build files and then package it into the rom formats
# add to output $INTERNAL_OTA_PACKAGE_TARGET
.PHONY: droidcore
droidcore: files \
systemimage \
$(INSTALLED_BOOTIMAGE_TARGET) \
$(INSTALLED_RECOVERYIMAGE_TARGET) \
$(INSTALLED_USERDATAIMAGE_TARGET) \
$(INSTALLED_CACHEIMAGE_TARGET) \
$(INSTALLED_VENDORIMAGE_TARGET) \
$(INSTALLED_SYSTEMOTHERIMAGE_TARGET) \
$(INSTALLED_FILES_FILE) \
$(INSTALLED_FILES_FILE_VENDOR) \
$(INSTALLED_FILES_FILE_SYSTEMOTHER) \
$(INTERNAL_OTA_PACKAGE_TARGET)


2、运行环境
工具直接提供了python源码,需要在执行环境上安装python解析器(python运行环境,类似于java的JRE)。工具对python的版本做了要求,需要在2.4或更高以上的python版本上执行,否则可能会在处理过程中出错。
3、命令行参数
工具的命令行参数因版本不同有微小的变化,现列举一些常见参数说明:
-b  (--board_config)  <file>
在代码中用pass处理这一参数匹配,不做处理。
-k (--package_key) <key>
指定签名用的密钥。如果缺省,会从指定的源或目标版本包的META/misc_info.txt文件中获取,或使用"build/target/product/security/testkey"。对于制作增量升级包,默认的密钥是基于源版本包文件META/misc_info.txt中的指定的路径下的密钥对,而不是从目标版本包里的文件中获取,这点应该注意到。
-i  (--incremental_from)  <file>
-i参数后指定的zip将作为差分包制作的源版本包处理
-w  (--wipe_user_data)
生成在安装时擦除user date分区的升级包
-n  (--no_prereq)
忽略时间戳检查,用于开发过程中的OTA包的经常升降级
-e  (--extra_script)  <file>
在制作的升级包中的升级脚本中插入外部的脚本。
-a  (--aslr_mode)  <on|off>
指定是否打开升级包的aslr模式,默认为on状态
-p  (--path)  <dir>
指定一个路径,作为工具在运行过程中搜索二进制可执行文件的路径。在升级包制作中,我们一般指定/out/host/linux-x86目录,作为搜索签名工具的路径。
-f  (--fota) <fota>
指定是否使用 fota升级方式,默认为不使用。
4、制作增量或完整升级包
制作升级包时,需要在产品代码编译环境上进行。需要指定签名工具和密钥文件所在路径。其中,签名工具所在路径用参数-p指定,这个路径是/out/host/linux-x86。密钥文件所在路径可以不指定,这样会采用默认值,由工具自动从新旧升级包中的文件解析出来。
4.1 制作增量升级包
$Source_root/build/tools/releasetools/ota_from_target_files –p $soure_root/out/host/linux-x86 –i $old_OTA_zip $new_OTA_zip $Out_diff.zip
其中,-p $soure_root/out/host/linux-x86指定一个path,是工具处理过程中对签名工具的搜索范围目录
-I $old_OTA_zip $new_OTA_zip指定从$old_OTA_zip文件到$new_OTA_zip的增量升级包制作
最后的$Out_diff.zip指定输出的增量升级包文件路径和名称。
4.2 制作完整升级包
$Source_root/build/tools/releasetools/ota_from_target_files –p $soure_root/out/host/linux-x86 $new_OTA_zip $Out_full.zip
其中,只需要指定签名工具的搜索范围、新的版本包zip文件和输出的完整升级包的文件路径和名称。
5、工具处理过程
用文本编辑器或ecliipe等集成开发环境打开工具入口ota_from_target_files文件,可以看到,工具导入了和其在同一目录的其它两个模块common.py和edify_generator.py。其中,common.py中包含一些工具的通用处理过程,edify_generator.py放置recovery模式的脚本生成处理过程。
转跳到文件的末尾,if __name__ == ‘__main__’是代码入口,如下:

5.1 平台差异处理
首先调用Common.py模块中的common.CloseInheritedPipes()进行平台差异处理。由于在Mac OS上有file descriptor (PIPE) 泄露情况,所以先进行预处理。此过程对Windows或Linux平台不做处理,处理过程如下:
  if platform.system() != "Darwin":
    return
5.2 入参传递
main(sys.argv[1:])
在运行平台差异化处理后,调用main(sys.argv[1:])进入制作OAT包的处理过程。其中,main(sys.argv[1:])接受从命令行传入的所有参数。
5.3 参数解析处理
option_handler()、common.ParseOptions()
对命令行传入的参数分析处理,存储到OPTIONS.的全局变量中。如果参数个数不为2,将直接输出工具的文档字串,然后退出,如下:

5.4 载入外部脚本(参数-e处理)
如果有入参指定了外部脚本,则首先打开外部脚本待用。外部脚本文件将附加到增量升级包或完整升级包的安装脚本末尾。如下:

5.5 源或目标版本zip包解析
不管是进入增量升级包处理流程,还是完整升级包处理流程,都是先对目标版本包 (new_zip)进行解析,这是符合合理处理过程的流程。如果用户指定了-i参数,再对源版本包(old_zip)进行解析。
版本包解析后,会将结果存到变量OPTIONS. info_dict或OPTIONS. source_info_dictk中。这个数据结构体中存储的数据参考如下:

附 解析的OPTIONS. info_dict参考:

5.6 WriteFullOTAPackage()完整升级包处理过程
5.6.1 完整升级包处理假定
完整升级包的生成处理,存在一个问题:不确定上一版本的recovery_api_version,有可能很早。所以就假定recovery_api_version不会经常变动,否则将会影响正常升级。这一点在增量升级机制中是不存在的。
5.6.2 增量升级包中文件生成原则
包中其它文件生成过程是一个复制文件的和打包的过程:将system/下文件复制过输出zip包,获取boot.img,recovery.img打包的过程。
5.6.3 其它处理过程
包括生成完整升级包的安装脚本,文件大小超限判断等。升级脚本位于完整升级包zip文件\META-INF\com\google\androi\updater-script。
根据版本zip解析出的OPTIONS. info_dict里fstab/yaffs2,判断boot.img大小是否超限。
5.7 WriteIncrementalOTAPackage()增量升级包处理过程
5.7.1增量升级包处理

解压source 版本包,解析zip包中文件,将结果在存储到变量,此过程请参考5.5节。
5.7.2 相关参数处理
OPTIONS.package_key:获得密钥文件路径,如果用户不指定-k参数,将默认从source_zip包中的文件里提取。
OPTIONS.verbose:处理过程可见到STD_OUT。
5.7.3 增量升级包处理封装
WriteIncrementalOTAPackage(input_zip, source_zip, output_zip, OPTIONS.fota)
其中,Input_zip、source_zip、out_zip分别传入target_zip,source_zip和输出zip包对像的ID/地址,OPTIONS.fota指定fota模式的ture或false。
1、判断从源版本zip包中获得到的recovery_api_version值,如果为0,给出warning指示:

2、装载源和目标版本zip包中的system/目录下文件到内存文件对像待处理。


3、比较源和目标版本中的文件,分类处理,代码如下:

verbatim_targets = [] #存储不需要处理或必须原封不动地包含和保留的文件列表,这些需要保护的或不需要保护的文件在代码中可以指定,如下:

如果在此过程中,碰到需要保护的文件,就原封不动地添加到输出zip文件中。
diffs = [] #存储差异文件的列表,通过比较file.sha1值。如果sha1值不同,就附加到差异文件列表中,待后续处理。如果sha1值相同,则认为源版本zip中的此文件和目标版本zip中的相应文件是完全相同的。
4、计算上述差异列表中的文件之间的差异,生成并最终的差异文件(patch),这些文件都是以.p后缀名结尾的文件。这个封装里还会统计出生成patch的时候,patch文件与原文件的百分比大小,并将这些信息输出到STD_OUT上供用户参考。
差异文件处理入口:

差分文件生成封装:

输出到STD_OUT效果:

5、差异文件添加到增量升级包规则,如下:

如果差异文件不存在(None)即新增,或差异文件的与原文件相差不大(一定比例%95的阈值为判断标准),那这个文件将不做处理,也直接添加到将到生成的增量升级包中。
6、进入后续的其它处理,主要是增量升级脚本生成。最终生成的升级脚本可参考增量升级zip包\META-INF\com\google\android\updater-script。
5.8 关闭输出zip包和签名输出
关闭打开状态的输出增量升级包或完整升级,然后对其签名,输出到args[1]定义的目录位置。签名key位置由全局变量OPTIONS.package_key定义。处理过程下:


5.9 清理环境
清理在处理过程中用到的,生成的临时目录。
5.10 Done
OTA分析之updater

升级包里的updater-binary
1、OTA升级包中的updater-binary
2、Android_4.4/build/tools/releasetools/edify_generator.py中第283行

3、update-binary作为update-script的解析器,升级执行的实现
Recovery接受升级包简要流程:

1、进入到OTA ——手动通过recovery UI指定OTA升级包
   ——通过/cache/recovery/command入口文件指定OTA包
2、Recovery接受外部参数:recovery  --update-zip =/cache/update.zip –locale=lz_CN
3、Recovery进程进入升级包安装处理
4、Recovery进程从1022行开始处理update包

5、Recovery中安装逻辑开始之后的跳转
Recovery.cpp 1023:
status = install_package(update_package, &wipe_cache, TEMPORARY_INSTALL_FILE);
install.cpp 244:
result = really_install_package(path, wipe_cache);
install.cpp 226
return try_update_binary(path, &zip, wipe_cache);
install.cpp 48 真正执行update-binary解析update-script文件的时候
// If the package contains an update binary, extract it and run it.
static int
try_update_binary(const char *path, ZipArchive *zip, int* wipe_cache) {
0
0
分享到:
评论

相关推荐

    超大内存OTA文件生成工具.zip

    1. **更新包制作**:能够将新的固件、应用程序或系统更新打包成适配大内存设备的OTA文件。这通常涉及到将新版本的系统镜像、应用代码、资源文件等整合,并进行适当的压缩和优化,以便在目标设备上快速高效地安装。 ...

    mkotazip工具

    MKOtaZip在这一过程中扮演着至关重要的角色,它能够帮助开发者将system.img文件转换为适应OTA升级流程的特定格式。 **系统映像转换** 在Android系统中,`system.img`是一个包含操作系统核心组件和应用程序的镜像...

    xyauto_ui1_9213AJ-ota-20200806.zip

    标题“xyauto_ui1_9213AJ-ota-20200806.zip”揭示了这是一个针对掌迅YT9213AJ设备的软件更新包,该更新通常被称为OTA(Over-the-Air)升级包。"ota"在IT领域中通常指的是设备通过无线网络接收的固件或软件更新。而...

    nexus 镜像解包工具 2 提取 IMG

    这些工具帮助开发者和爱好者处理OTA(Over-the-Air)升级包或系统映像,以便进行自定义修改、调试或恢复。 OTA升级是设备通过网络接收软件更新的一种方式,对于Android系统来说,它通常以ZIP格式提供,包含各种文件...

    中兴B860AV2.1-T固件包升级包 刷机后可以装APP

    标题提到的“中兴B860AV2.1-T固件包升级包 刷机后可以装APP”意味着通过此次升级,用户将能够安装应用程序,这可能是在原厂固件中被限制的功能。 首先,让我们了解一下固件包升级的过程。固件通常以二进制格式存在...

    小米Recovery线刷工具

    1. 电脑上已安装了小米官方的MiFlash工具,这是线刷过程的基础。 2. 你的手机已经解锁Bootloader,因为安装自定义Recovery通常需要解锁。 3. 下载对应手机型号的Recovery镜像文件,确保与你的设备兼容。 4. 电脑上...

    Nexus 5 OTA update-binary 和 update-script

    在Android设备的系统更新过程中,OTA(Over-the-Air)更新是一种常见的方式,允许用户通过无线网络接收并安装系统升级。在本主题中,我们将深入探讨"OTA update-binary"和"update-script"在Nexus 5 recovery刷机包...

    卡刷工具包

    "卡刷工具包"主要指的是用于对智能设备,如电视盒子、机顶盒等进行系统升级或恢复的软件工具。在这个特定的情况下,我们讨论的是"开博尔卡刷工具包",它包含了名为"PhoenixCard_V310.zip"的压缩文件。这个工具通常被...

    Ota_OtaDemo_android_zip_

    4. **制作OTAs包**:将新版本的系统镜像打包成ZIP文件,称为OTA更新包。这个ZIP文件包含新系统分区的映像、更新脚本和其他必要文件。 5. **服务器部署**:更新包会被上传至服务器,等待用户设备检测到有可用更新。 ...

    3560-root-ZL-20200301-ota-ymqn.zip

    标题 "3560-root-ZL-20200301-ota-ymqn.zip" 提供的信息表明这是一款针对掌讯3560设备的系统更新或升级包,其中包含了root权限的获取。"ota"通常代表Over-the-Air更新,是通过网络对设备进行软件升级的方式。"ymqn...

    中兴ZTE联通版B860AV1.2(晶晨S905L芯片、1+8G、Wifi、安卓4.4)原厂分区(非二维码)备份和官方升级包

    中兴ZTE北京联通版B860AV1.2(晶晨S905L芯片、1+8G、Wifi、安卓4.4)原厂分区(非...字母+5个随机数,可用计算工具开adb)备份和官方升级包(ota.zip),原创。可用于救砖、刷回原厂、恢复IPTV、恢复三码。网盘下载,约880M。

    nrfutil.exe

    nrfutil version 6.0.1 nrfutil 是nordic soc 制作OTA升级包的工具! 本软件是windows上的可执行文件,不需要安装python! 直接放到文件夹下,添加windows的path路径后就可以使用了!

    杰赛s65中星微ZX296716.zip

    【杰赛S65中星微ZX296716.zip】是一个...总的来说,【杰赛S65中星微ZX296716.zip】是一个针对特定型号电视盒的第三方OTA升级包,包含了固件和ADB工具,旨在提升用户体验,同时也要求用户具备一定的技术知识和风险意识。

    一加3_3T工具箱.rar

    3. **OTA更新包**:Over-The-Air更新文件,可直接在现有系统上升级到新版本。对于想要快速获取最新官方系统更新的用户来说非常有用。 4. **ROM镜像**:第三方开发者制作的完整系统文件,包括Android开源项目(AOSP...

    易语言-易语言制作的手机刷机工具

    通过分析这款易语言制作的手机刷机工具源码,开发者可以学习到易语言如何处理上述各种操作,以及如何与其他系统组件(如硬件驱动、操作系统服务)进行交互。同时,这也是一个实践计算机系统底层知识、提升编程技能的...

    一加手机-老版刷机工具箱

    3. **OTA更新文件**:Over-The-Air更新文件是官方发布的系统升级包,用户可以通过工具箱下载并安装,以更新到最新版本的系统。 4. **Zip刷机包**:这是第三方开发者制作的系统ROM,包含了完整的Android系统,用户...

Global site tag (gtag.js) - Google Analytics