不积跬步,无以致千里;python
不积小流,无以成江海。算法
出自荀子《劝学篇》编程
一、概念解释微信
OTA是何物? 英文解释为 Over The Air,既空中下载的意思,具体指远程无线方式,OTA 技术能够理解为一种远程无线升级技术;网络
FOTA:Firmware OverThe Air/固件空中升级,经过云端为具备连网功能的设备:例如手机、平板电脑、移动互联网设备等提供固件升级服务,手机中的固件升级便可称为 FOTA;app
在3G、4G网络广泛的今天,不少时候仍是要考虑流量限制,若是步入5G时代,虽然流量已不在是瓶颈,可是由于功能小可是重要的版本升级相比总体固件升级来讲仍是至关不错的选择。函数
二、基础知识工具
作了有一段时间的OTA升级了,主要是基于Android的差分及全量升级,计划对当前掌握的知识在作一个系统的梳理与总结,在进行正式的流程讲解前我会先对OTA的一些原始包结构、目标包结构作详细说明,本节算是一个基础章节,为理解、消化后面的主要流程作铺垫。优化
包结构ui
制做升级包具备必定的格式,生成它须要原始包,原始包也有固定的格式,基本都是经过系统工程编译出来,结构以下:
目录说明
升级包结构
目录说明
生成升级包的工具
用于生成OTA差分包的须要使用到python脚本、C源码编译的可执行文件,这些都是开源的,以下
文件功能
ota_from_target_files:为一个python脚本,作包入口从这里开始,生成包的主要工做也是在这里完成。
bsddiff:此可执行文件主要用户计算非压缩的文件的差别,好比咱们计算rootfs文件的差别,就使用的此脚本。
imgdiff:此可执行文件主要用户计算压缩文件的差别,支持的格式有*.gz,*.zip,*.apk,*.jar,*.img。
fs_config:此可执行文件主要用户计算原始文件的gid、uid、mode,可是此种方式有一个弊端就是,fs_config实际上是硬编码的,若是咱们新增一个文件,有可能在进行添加后,不能将其权限进行添加。
common.py:主要定义了一些公用的函数,如:获取分区类型、计算文件差分、生成patch文件等。
edify_generator.py:主要是生成updater-script文件的内容,还包括将文件添加到升级包中。
以上就是OTA升级所要了解的基本知识,下一章我会详细讲解如何由两个不一样的基本包使用脚本生成差分升级包,敬请关注哦。。。
青,取之于蓝,而青于蓝;
冰,水为之,而寒于水。
出自荀子《劝学篇》
本章说明
上篇 OTA升级详解(一)主要讲到OTA的一些基本知识,本篇主要内容为详解OTA升级包的制做过程,梳理作包关键细节,因为作包脚本较长,文件较多。暂不按照脚本注释的方式进行展现,主要按照调用函数顺序图+关键步骤文字描述的方式来说解,重复内容会自动省略。讲解中的脚步是基于 Android OTA Update 进行的,若是流程与读者全部的有差别,不要着急,总体流程就是下面的样子,增长的只是一些细节优化而已,按照实际脚步流程为准就好。
制做流程说明
制做升级包 ota_from_target_files为入口,能够传入参数,如:是不是差分包,原始包、目标版本包(包结构在一中有详细讲解,以zip包的形式传入)。如下是main函数的基本过程
一、ota_from_target_files-main大体流程,这里主要是作了一些准备工做,核心工做在最后一个函数中:
二、ota_from_target_files - WriteIncrementalOTAPackage()
这里参数有4个,分别是:
input_zip -> 基础包
source_zip -> 目标包
output_zip -> 升级包(即将生成)
OPTIONS.fota -> fota标记
WriteIncrementalOTAPackage--流程以下:
重点说明:
一、updater-script 的生成:是由script(列表)而来,此列表的内容来自于各类生成过程当中不断的添加,每一条是一条执行命令。
二、ComputePatch计算差分:这里对若是文件类型是一些压缩文件,如:.img、.apk、.jar、.zip、.gz,会使用imgdiff可执行文件来计算,若是是普通文件则会使用到bsdiff进行计算。
三、文件的权限问题: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
四、update-binary:来自于目标包中位置以下 OTA/bin/updater
五、sha值从何而来:原始文件与目标文件是经过has1值去匹配的 在LoadSystemFiles 函数中计算而来
通过以上步骤就能够生成一个差分包,结构以下(样例):
对应的updater-script以下(样例):
以上就是使用脚本进行OTA差分包制做的所有过程。
本人自己不是作专业python,有些地方讲解的可能不是很合理,还但愿同行高人批评指点。对于bsdiff与imgdiff算法并无仔细研究过。当前重点关注主要流程。
了解了以上内容,就能够对此工具进行个性化的修改了,如添加其余新文件到升级包中、添加流程关键字说明等等。可是知道了这些内容,不少人仍是对OTA升级比较困惑,
那咱们下一节就能够基于本章内容进行OTA升级过程的详细讲解,下一章以后你们就会明白,升级包中的每个文件的做用及存在的意义,以及recovery使用核心组件updater-script
与update-binary完成整个差分包的升级,敬请期待。。。
关注微信公众号【嵌入式C部落】,获取更多精华文章,海量编程资料,让咱们一块儿进步,一块儿成长。