本章说明
      上篇 OTA升级详解(一)主要讲到OTA的一些基本知识,本篇主要内容为详解OTA升级包的制作过程,梳理做包关键细节,由于做包脚本较长,文件较多。暂不按照脚本注释的方式进行展示,主要按照调用函数顺序图+关键步骤文字描述的方式来讲解,重复内容会自动省略。讲解中的脚步是基于  Android OTA Update 进行的,如果流程与读者所有的有差异,不要着急,整体流程就是下面的样子,增加的只是一些细节优化而已,按照实际脚步流程为准就好。

制作流程说明

       制作升级包 ota_from_target_files为入口,可以传入参数,如:是否是差分包,原始包、目标版本包(包结构在一中有详细讲解,以zip包的形式传入)。以下是main函数的基本过程

1、ota_from_target_files-main大致流程,这里主要是做了一些准备工作,核心工作在最后一个函数中:

IOT的OTA升级 ota升级流程_Android OTA

2、ota_from_target_files - WriteIncrementalOTAPackage()

这里参数有4个,分别是:

input_zip     ->    基础包

source_zip   ->    目标包

output_zip   ->    升级包(即将生成)

OPTIONS.fota    ->   fota标记

WriteIncrementalOTAPackage--流程如下:

IOT的OTA升级 ota升级流程_升级_02

重点说明:

1、updater-script 的生成:是由script(列表)而来,此列表的内容来自于各种生成过程中不断的添加,每一条是一条执行命令。

2、ComputePatch计算差分:这里对如果文件类型是一些压缩文件,如:.img、.apk、.jar、.zip、.gz,会使用imgdiff可执行文件来计算,如果是普通文件则会使用到bsdiff进行计算。

3、文件的权限问题:system分区来说,它是有文件系统的,要对文件系统下的每个文件计算的差分,在zip包中并没有保存新增或者变更文件的gid、uid、mode等属性,所以需要对新增文件、或者权限变更文件进行权限修改。保证系统正常运行或者app拥有执行权限。两种文件权限的获取方式一种是fs_config(是一种硬编码方式,比较死板),读取文件绝对路径,获取这些信息,另一种方式是来自于原始包中,位于META/filesystem_config.txt,这就要求在生成原始包时,将文件的权限保存到此文件中,文件格式与使用fs_config生成的一致。最后使用set_perm_recursive/set_perm对目录与文件来进行权限恢复。

格式   绝对路径  gid  uid  mode

样例:   system/etc/dbus.conf 1000 1000 440        

4、update-binary:来自于目标包中位置如下 OTA/bin/updater

5、sha值从何而来:原始文件与目标文件是通过has1值去匹配的 在LoadSystemFiles 函数中计算而来

IOT的OTA升级 ota升级流程_差分升级_03

经过以上步骤就可以生成一个差分包,结构如下(样例):

IOT的OTA升级 ota升级流程_差分升级_04

对应的updater-script如下(样例):

IOT的OTA升级 ota升级流程_IOT的OTA升级_05

以上就是使用脚本进行OTA差分包制作的全部过程。