在build/tools/releasetools文件夹中提供的 ota_from_target_files工具可以构建两种包:全镜像包和增量包.这些工作把Android构建系统提供的目标文件.zip文件作为他们的输入.
全更新
全更新就是把编译后设备的所有的状态(system,boot和recovery分区)都被包含到包里.只要设备能够接受更新包并且启动recovery系统,不管当前设备的状态是什么样的,包就能够安装整个系统.
例子:使用release工具为假设的tardis设备构建一个完整的更新包:
# first, build the target-files .zip
% . build/envsetup.sh && lunch tardis-eng
% mkdir dist_output
% make dist DIST_DIR=dist_output
[...]
% ls -l dist_output/*target_files*
-rw-r----- 1 user eng 69965275 Sep 29 15:51 tardis-target_files.zip
目标文件.zip包含你需要的构建OTA包的所有东西.
% ./build/tools/releasetools/ota_from_target_files \
dist_output/tardis-target_files.zip ota_update.zip
unzipping target target-files...
done.
% ls -l ota_update.zip
-rw-r----- 1 user eng 62236561 Sep 29 15:58 ota_update.zip
ota_update.zip现在已经可以用于测试设备了.对于用户设备来说,要生成和使用你自己的密钥.(后面介绍)
增量更新
一个增量更新包含着要应用到设备中已存在的数据的补丁.这会使得更新包比较小:
- 没有被改变的文件不必包含在更新包中
- 被改变的文件如果和之前版本比较相似的话,更新包仅仅需要包含两个文件不同部分的编码即可.
- 你仅仅可以在使用之前版本构建的设备上安装增量更新包.为了构建一个增量更新包,你需要来自上一个版本的目标文件.zip和新要构建的目标文件.zip.
% ./build/tools/releasetools/ota_from_target_files \
-i PREVIOUS-tardis-target_files.zip \ # make incremental from this older version
dist_output/tardis-target_files.zip incremental_ota_update.zip
unzipping target target-files...
unzipping source target-files...
[...]
done.
% ls -l incremental_ota_update.zip
-rw-r----- 1 user eng 1175314 Sep 29 16:10 incremental_ota_update.zip
这次构建和上一个非常相似,增量更新包比相应的全更新包要小的多.
注意:为了为后续的更新包生成基于块的OTA,向ota_from_target_files中传递–block选项.
仅仅向运行相同的上一个版本包的设备发行增量包才能正常运行.如果在运行其他构建版本的设备中尝试安装增量包的花就会导致在recovery模式中的错误.在这个时候重启设备就会返回用户之前的系统;在创建他们的时候,更新包验证所有文件的之前的状态,如果发生这种情况,该设备不会留在半升级状态。
更新包
一个更新包(ota_update.zip,incremental_ota_update.zip)是一个.zip文件,他包含可执行二进制文件META-INF/com/google/android/update-binary.在验证完成更新包的签名之后,recovery将这个二进制文件提取到/tmp目录下并运行该程序,同时,将下面的参数传递过去:
- 更新二进制API版本号.如果传递到更新二进制的参数改变了,这个号就会被增加
- 命令管道的文件描述符.更新程序可以使用这个管道来想recovery二进制发送命令(大多数都是UI改变,例如更新进度条等)
-
更新包.zip文件的文件名
一个recovery包可以使用任何静态链接的二进制文件作为更新二进制包.OTA包构建工具使用updater程序(源码位于bootable/recovery/updater),该文件提供了一个简单的可以做任何安装工作的脚本语言.你可以替代任何运行在设备上的其他二进制程序.
对于updater程序的细节,编写语法和内置函数,后面会有详细介绍.