`

OTA升级中关于update.zip包的一些总结

阅读更多
update.zip包整理
一、 update.zip包的目录结构
          |----boot.img
          |----system/
          |----recovery/
                `|----recovery-from-boot.p
                `|----etc/
                        `|----install-recovery.sh
          |---META-INF/
              `|CERT.RSA
              `|CERT.SF
              `|MANIFEST.MF
              `|----com/
                     `|----google/
                             `|----android/
                                    `|----update-binary
                                    `|----updater-script
                             `|----android/
                                    `|----metadata
二、
boot.img 包含kernel和ramdisk,用来更新boot分区所需要的文件
system 内容升级后放在系统的system分区,主要更新一些apk和so库
recovery/目录中的recovery-from-boot.p是boot.img和recovery.img的补丁(patch),主要用来更新recovery分区,其中etc/目录下的install-recovery.sh是更新脚本
update-binary是一个二进制文件,相当于一个脚本解释器,能够识别updater-script中的描述的操作,该文件在具体的更新包中名字由源码中bootable/recovery/install.c中的
      ASSUMED_UPDATE_BINARY_NAME的值而定
updater-script:此文件是一个脚本文件,具体描述更新过程,在之前可以根据具体情况编写该脚本适应我们的具体需求,该文件的命名由源码中的bootable/recovery/   
      updater/updater.c文件中的SCRIPT_NAME的值而定
metadata文件是描述设备信息及环境变量的元数据,主要包括一些编译选项,签名公钥,时间戳以及设别型号等
uesrdata目录,用来更新系统中的用户数据部分,这部分内容在更新后会存放在系统的data目录下,但是在Android M后data分区默认加密,在OTA的时候不能挂载data分
      区,所以不能进行更新
在update.zip包生成后需要对其进行签名,否则在升级时会出现认证失败的错误提示。而且签名要使用和目标版本一致的加密公钥。加密公钥以及加密所需的三个文件在Android源码编译后生成的具体路径为:
out/host/linux-x86/framework/signapk.jar
build/target/product/security/testkey.x509.pem
build/target/product/security/testkey.pk8
具体的加密方法:$ java -jar out/host/linux-x86/framework/signapk.jar -w build/traget/product/security/tesetkey.x509.pem build/target/product/security/testkey.pk8 update.zip update_signed.zip
MANIFEST.MF :这个manifest文件定义了与包的组成结构相关的数据,类似Android应用的manifest.xml文件
CERT.RSA:与签名文件相关联的签名程序块文件,他存储了用于签名jar文件的公共签名
CERT.SF:这是jar文件的签名文件,其中前缀CERT代表签名者
在具体升级的时候,对update.zip包检查时大致会分成三步:1.检验SF文件与RSA文件是否匹配。2、检验MANIFEST.MF与签名文件中的digest是否一致。3.检验包中的文件与MANIFEST中所描述的是否一致。
三、Android升级包update.zip的生成过程分析
使用make otapackage命令生成update.zip的过程分析。
            在源码根目录下执行make otapackage命令生成update.zip包主要分为两步,第一步是根据Makefile执行编译生成一个update原包(zip格式)。第二步是运行一个python脚本,并以上一步准备的zip包作为输入,最终生成我们需要的升级包。下面进一步分析这两个过程。(简单来说就是,首先生成cota包,在利用cota包生成差分包和整包)
            第一步:编译Makefile。对应的Makefile文件所在位置:build/core/Makefile。从该文件会生成一个zip包,这个包最后会用来制作OTA package 或者filesystem image。
根据Makefile可以分析这个包的生成过程:
            首先创建一个root_zip根目录,并依次在此目录下创建所需要的如下其他目录
            ①创建RECOVERY目录,并填充该目录的内容,包括kernel的镜像和recovery根文件系统的镜像。此目录最终用于生成recovery.img。
            ②创建并填充BOOT目录。包含kernel和cmdline以及pagesize大小等,该目录最终用来生成boot.img。
            ③向SYSTEM目录填充system image。
            ④向DATA填充data image。
            ⑤用于生成OTA package包所需要的额外的内容。主要包括一些bin命令。
            ⑥创建META目录并向该目录下添加一些文本文件,如apkcerts.txt(描述apk文件用到的认证证书),misc_info.txt(描述Flash内存的块大小以及boot、recovery、system、userdata等分区的大小信息)。
            ⑦使用保留连接选项压缩我们在上面获得的root_zip目录。
            ⑧使用fs_config(build/tools/fs_config)配置上面的zip包内所有的系统文件(system/下各目录、文件)的权限属主等信息。fs_config包含了一个头文件#include“private/android_filesystem_config.h”。在这个头文件中以硬编码的方式设定了system目录下各文件的权限、属主。执行完配置后会将配置后的信息以文本方式输出 到META/filesystem_config.txt中。并再一次zip压缩成我们最终需要的原始包。
第二步:上面的zip包只是一个编译过程中生成的原始包。这个原始zip包在实际的编译过程中有两个作用,一是用来生成OTA update升级包,二是用来生成系统镜像。在编译过程中若生成OTA update升级包时会调用(具体位置在Makefile的1037行到1058行)一个名为ota_from_target_files的Python脚本,位置在/build/tools/releasetools/ota_from_target_files。这个脚本的作用是以第一步生成的zip原始包作为输入,最终生成可用的OTA升级zip包。
用法---Usage: ota_from_target_files [flags] input_target_files output_ota_package
                        -b 过时的。
                        -k签名所使用的密钥
                        -i生成增量OTA包时使用此选项。后面我们会用到这个选项来生成OTA增量包。
                        -w是否清除userdata分区
                        -n在升级时是否不检查时间戳,缺省要检查,即缺省情况下只能基于旧版本升级。
                        -e是否有额外运行的脚本
                        -m执行过程中生成脚本(updater-script)所需要的格式,目前有两种即amend和edify。对应上两种版本升级时会采用不同的解释器。缺省会同时生成两种格式
        的脚 本。
                        -p定义脚本用到的一些可执行文件的路径。
                        -s定义额外运行脚本的路径。
                        -x定义额外运行的脚本可能用的键值对。
                        -v执行过程中打印出执行的命令。
                        -h命令帮助
下面我们分析ota_from_target_files这个python脚本是怎样生成最终zip包的。
主函数main是python的入口函数,我们从main函数开始看,大概看一下main函数(脚本最后)里的流程就能知道脚本的执行过程了。
                       ① 在main函数的开头,首先将用户设定的option选项存入OPTIONS变量中,它是一个python中的类。紧接着判断有没有额外的脚本,如果有就读入到OPTIONS变量中。
                       ② 解压缩输入的zip包,即我们在上文生成的原始zip包。然后判断是否用到device-specific extensions(设备扩展)如果用到,随即读入到OPTIONS变量中。
                       ③ 判断是否签名,然后判断是否有新内容的增量源,有的话就解压该增量源包放入一个临时变量中(source_zip)。自此,所有的准备工作已完毕,随即会调用该 脚本中最主要的函数WriteFullOTAPackage(input_zip,output_zip)
                       ④ WriteFullOTAPackage函数的处理过程是先获得脚本的生成器。默认格式是edify。然后获得metadata元数据,此数据来至于Android的一些环境变量。然后获得设备配置参数比如api函数的版本。然后判断是否忽略时间戳。
                       ⑤ WriteFullOTAPackage函数做完准备工作后就开始生成升级用的脚本文件(updater-script)了。生成脚本文件后将上一步获得的metadata元数据写入到输出包out_zip。
                       ⑥至此一个完整的update.zip升级包就生成了。将升级包拷贝到SD卡中就可以用来升级了。
四、 Android OTA增量包update.zip的生成
在上面的过程中生成的update.zip升级包是全部系统的升级包,而在实际升级中,我们只希望能够升级我们改变的那部分内容。这就需要使用增量包来升级。生成增量包的过程也需要上文中提到的ota_from_target_files.py的参与。
         下面是制作update.zip增量包的过程。
          ① 在源码根目录下依次执行下列命令
           $ . build/envsetup.sh
           $ lunch XXX
           $ make
           $ make otapackage
           执行上面的命令后会在out/target/product/tcc8800/下生成我们第一个系统升级包。我们先将其命名为A.zip
          ② 在源码中修改我们需要改变的部分,比如修改内核配置,增加新的驱动等等。修改后再一次执行上面的命令。就会生成第二个我们修改后生成的update.zip升级包。将其命名为B.zip。
          ③ 在上文中我们看了ota_from_target_files.py脚本的使用帮助,其中选项-i就是用来生成差分增量包的。使用方法是以上面的A.zip 和B.zip包作为输入,以update.zip包作  为输出。生成的update.zip就是我们最后需要的增量包。
              具体使用方式是:将上述两个包拷贝到源码根目录下,然后执行下面的命令。
              $ ./build/tools/releasetools/ota_from_target_files -i A.zip B.zip update.zip。(还可以加入其他参数,例如-x,-k,-p等等)
              在执行上述命令时会出现未找到recovery_api_version的错误。原因是在执行上面的脚本时如果使用选项i则会调用WriteIncrementalOTAPackage会从A包和B包中的META目录下搜索misc_info.txt来读取recovery_api_version的值。但是在执行make  otapackage命令时生成的update.zip包中没有这个目录更没有这个文档。
              此时我们就需要使用执行make otapackage生成的原始的zip包。这个包的位置在out/target/product/XX/obj/PACKAGING/target_files_intermediates/目录下(cota包),它是在用命令make otapackage之后的中间生产物,是最原始的升级包。我们将两次编译的生成的包分别重命名为A.zip和B.zip,并拷贝到SD卡根目录下重复执行上面的命令:
               $ ./build/tools/releasetools/ota_form_target_files -i A.zip B.zip update.zip。
             
另:
生成差分包调用的是文件./build/tools/releasetools/ota_from_target_files中的WriteIncrementalOTA方法,调用时需要将两个版本的差分资源包作为参数传进来,形如:
./build/tools/releasetools/ota_from_target_files –n –i ota_v1.zip ota_v2.zip update.zip
其中,参数n表示忽略时间戳;i表示生成增量包(即差分包);ota_v1.zip与ota_v2.zip分别代表前后两个版本的差分资源包;而update.zip则表示最终生成的差分包。
WriteIncrementalOTA函数会计算输入的两个差分资源包中版本的差异,并将其写入到差分包中;同时,将updater及生成脚本文件udpate-script添加到升级包中。


























分享到:
评论

相关推荐

    系统更新包制作 update.zip

    ./build/tools/releasetools/ota_from_target_files -x pagesize=2048 -n -i update1.zip update2.zip update.zip 3、recovery执行系统更新 adb push SystemUpdate.apk /system/app 运行SystemUpdate.apk 完成...

    A/B分区系统ota更新客户端代码 SystemUpdate.zip

    system_update.xml:这是一个XML配置文件,可能包含了关于更新过程的元数据或设置。例如,它可能定义了更新的URL、更新的权限设置、更新的优先级或者特定的设备标识等。XML文件结构清晰,易于读取和解析,适合作为...

    stm32f10 ota 串口升级BootLoader.zip

    6. **安全机制**:BootLoader还需要一些安全措施,如防止非法固件的写入,或者在升级失败时能恢复到之前的版本。 7. **跳转执行**:当整个固件更新完成并且验证无误后,BootLoader会修改程序计数器(PC)寄存器,...

    掌讯gongban_YT9216CJAUTOTEST-ota-v6.5.zip

    掌讯gongban_YT9216CJAUTOTEST-ota-v6.5.zip是一个针对掌讯6216cj设备的卡刷包,主要用于更新或恢复设备的固件。在Android设备的定制和维护中,卡刷包扮演着重要的角色,它允许用户通过特定的工具(如Odin或Fastboot...

    OtaUpdate.zip

    "OtaUpdate.zip"文件很可能是某个Android设备的OTA更新包,用于通过无线网络对设备进行升级。 多线程下载是现代互联网下载技术中的一个重要概念。它将一个大文件分割成多个部分,同时从服务器下载这些部分,从而...

    AB-OTA升级补丁.zip

    AB-OTA升级补丁.zip是一个专门针对Android系统的软件更新补丁包,主要目的是为了实现Over-the-Air(OTA)无线升级功能。在Android系统中,OTA更新是一种方便用户通过网络下载并安装系统更新的方式,无需连接电脑或...

    广西电信IPTV中兴B860A1.1 的OTA.ZIP

    综上所述,这个OTA.ZIP文件是一个针对广西电信IPTV中兴B860A1.1设备的2015年系统更新备份,包含文件权限设置、启动镜像、更新包元数据以及系统分区的数据。同时,由于涉及到root,可能还包含获取设备管理员权限的...

    STM32F205VB在远程系统升级中的应用.zip

    本篇文章将深入探讨STM32F205VB如何在远程系统升级中实现这一功能。 首先,了解STM32F205VB的基本特性是必要的。该芯片拥有72MHz的工作频率,内置浮点运算单元(FPU),提供高效的处理能力。它有高达1MB的闪存和128...

    update.zip

    "update.zip" 文件是一个压缩包,通常用于软件...总的来说,"update.zip" 是一个全面的系统更新包,旨在升级或修复Hi3798MV300H平台设备的启动组件和操作系统。正确应用这个更新需要对设备的固件和更新过程有深入理解。

    自动部署ota升级服务源码.zip

    本项目提供的"自动部署ota升级服务源码.zip"文件,显然是一个用于实现这一功能的Java代码库。以下是基于这个主题的详细知识点解释: 1. **OTA升级**:OTA升级是一种远程更新技术,主要用于移动设备如智能手机、平板...

    YT9216B_ui1-9.1-HP1024x600-ota-v6.5.zip

    掌讯官方更新包9216B 更新到Android9.1音质有质的提升 横屏 1024x600 UI1_v6.5 把固件压缩包复制到U盘根目录,进入车机设置>系统信息>Android升级即可,全程不要断电!!!(U盘需FAT32格式,16G以下)

    RKUpdateService,ota本地升级源码

    例如,`checkForUpdates()`函数负责检测更新,`downloadUpdate()`函数处理下载任务,`verifyUpdatePackage()`函数验证更新包,而`applyUpdate()`函数则用于应用更新。这些函数通常会配合使用意图(Intent)和服务...

    OTA_UPDATE.rar

    在本例中,"OTA_UPDATE.rar" 提供的是一个用于广升(Gosuncn)FOTA(Firmware Over The Air)升级的工具包。FOTA是针对固件级别的更新,允许用户无需通过电脑或其他物理媒介,直接通过网络下载并安装设备的系统更新...

    A12_OTA-20210605.zip(众泰T500导航升级系统修复)

    【标题】"A12_OTA-20210605.zip"是一个针对众泰T500车型的导航系统升级包。这个压缩文件是专为2021年6月5日设计的,旨在解决众泰T500汽车内置导航系统的可能存在的问题和性能优化。 【描述】描述中的"A12_OTA-...

    rockchip ota升级服务源码

    rockchip ota升级服务源码,可支持update.img,update.zip整包或差分包识别和升级接口,供参考

    758153783191653Update.zip

    总结起来,“758153783191653Update.zip”是一个全面的Android系统更新包,涵盖了从引导到用户数据的各个层面,旨在改善设备性能、修复漏洞或添加新功能。对于熟悉Android系统和刷机流程的用户来说,这个包是升级...

    esp8266 ota native_ota.zip

    "native_ota.zip"文件包含了实现这一功能所需的代码示例。 OTA更新允许开发者远程更新ESP8266上的固件,而无需物理接触设备。这对于部署在难以触及位置或数量庞大的设备集群中尤其方便。在这个例子中,我们将关注...

    9218C-dubi+viper4-ZL-ota-ymqn.zip

    此增量卡刷包只为掌讯系列车机增加:杜比音效+蝰蛇音效,刷入...刷入方法:将9218C-dubi+viper4-ZL-ota-ymqn.zip放U盘根目录,打开车载设置-系统信息-安卓升级,即可。 用户下载后只可自己使用,不可在网上传播。

    9218D-dubi+viper4-ZL-ota-ymqn.zip

    此增量卡刷包只为掌讯系列车机增加:杜比音效+蝰蛇音效,刷入...刷入方法:将9218D-dubi+viper4-ZL-ota-ymqn.zip放U盘根目录,打开车载设置-系统信息-安卓升级,即可。 用户下载后只可自己使用,不可在网上传播。

    仪表OTA升级流程图.zip

    "仪表OTA升级流程图.zip"文件提供了一个详细的汽车仪表通过车机进行OTA升级的过程,这对于理解该技术及其开发至关重要。下面将详细阐述这个流程以及涉及的关键知识点。 首先,OTA升级流程通常分为几个主要阶段: 1...

Global site tag (gtag.js) - Google Analytics