2020-09-30
关键字:增量升级包、差分升级包、升级包签名
update.zip 就是Android系统的升级包文件。一般在编译系统镜像的时候会顺带打包一个 update.zip 出来以方便OTA升级。但 update.zip 的一个特点就是默认会打包完整的升级文件,即默认情况下使用它来升级将会是“全分区”升级,这里打个引号是因为它通常只是相对的全分区,我们可以根据编译脚本来控制要将哪些分区打包进去。但通常都是除了用户使用数据以外的所有分区都会升级的。
但有时难免会有需要“增量升级”的需求。增量升级有时又称“差分升级”。尤其是在维护阶段,增量升级的优点可太多了。本文就记录一下海思平台Android系统如何制作update.zip的差分升级包。
1、前期准备
在制作差分升级包之前我们肯定要先准备好待升级的文件,包括但不限于程序、分区镜像、普通文件以及升级包描述信息等。
升级包描述信息相对会麻烦一点,它会包含一些二进制信息,在编译大包时会自动生成。因此最常用也最高效的做法就是先编译一个或者直接找之前编译好的完整的update.zip出来,然后将它解压到一个目录中。
所使用的解压命令为:
unzip update.zip
2、整理增量文件
笔者演示使用的update.zip解压后的主目录结构如下图所示:
其中,'META' , 'META-INF' 两个目录下的即是升级包描述信息。这两个目录必须保留,其余目录根据实际情况增删处理。
例如,笔者这边只想增加两个文件 system/app/DDemo.apk 与 system/etc/ad.ogg ,则可以有如下所示的打包方式:
$ ll total 20 drwxr-xr-x 5 1001 1001 4096 Sep 30 11:02 ./ drwxr-xr-x 3 1001 1001 4096 Sep 30 09:43 ../ drwxr-xr-x 2 1001 1001 4096 Sep 30 09:44 META/ drwxr-xr-x 3 1001 1001 4096 Sep 30 09:44 META-INF/ drwxr-xr-x 4 1001 1001 4096 Sep 30 11:04 system/ $ find system/ system/ system/app system/app/DDemo.apk system/etc system/etc/ad.ogg $
3、定制升级信息
然后我们再打开升级脚本定制升级程序:
META-INF/com/google/android/updater-script
升级脚本的语法不在本文的范畴之内,就不作解释了。这里只列出适应笔者需求的脚本代码,如下所示:
1 ui_print("start......"); 2 open_led(); 3 set_progress("1"); 4 show_progress("1","90"); 5 6 ui_print("update system......"); 7 #format("ext4", "EMMC", "/dev/block/platform/soc/by-name/system", "0", "/system"); 8 mount("ext4", "EMMC", "/dev/block/platform/soc/by-name/system", "/system"); 9 package_extract_dir("system", "/system"); 10 unmount("/system"); 11 12 13 ifelse(isexistupdatepackage(/cache), 14 ui_print("update.zip in cache......"); 15 delete_recursive("/cache"), 16 ui_print("format cache......"); 17 wipe_cache(); 18 ); 19 20 close_led(); 21 ui_print("update ok.....");
这份脚本的意思就是在进入升级模式时,挂载 system 分区,然后将升级包中的 system 目录下的所有内容提取到 system 分区中去。上述脚本第7行的格式化操作是被注释掉了的,这段必须注释掉,否则的话升级过后将会只剩下你新增的两个文件。不过这些都属于脚本语法的知识了,不在本文讨论范围之内。
除了升级脚本,还有几个很重要的升级包信息需要修改:
META-INF/com/google/android/update-info
这个文件主要修改版本号信息。
META-INF/com/android/metadata
修改升级包描述信息。
system/build.prop
这个是系统属性文件。这里面有三个属性记载了当前版本号。我们最好在做了增量升级以后同步更新版本号。因此通常还要将这个文件更新一下。
不过由于这个文件是已经存在于设备文件系统中的,直接解压提取的话会失败。因此我们需要在升级脚本中将 system 分区挂载以后即删掉现存的 build.prop 文件,然后再去解压它。这个代码在上面的脚本中没有体现出来。删除文件可以调用函数 delete(file1, file2...)来实现。在本例中是为:
delete("/system/build.prop");
更多详细的函数及用法还需要同学自行搜索。
4、打包
在将所有的增量升级文件都准备好以后就只剩下打包了。
首先将这些文件打包进一下zip中,可以使用以下命令:
zip -qry udapte_tmp.zip ./myupdate/
关于 zip 命令的详细用法有需要的同学请自行查阅文档。
接下来便是将 update_tmp.zip 临时升级包文件进行签名了。
签名需要用到三种文件:
1、升级包;
2、签名文件;
3、密钥文件。
升级包不用说。签名文件和密钥文件在不同的系统中可能会有不同。
我们可以参考一下编译大包时的签名代码是怎样的:
./device/hisilicon/bigfish/build/emmc.mk
$(SIGNAPK_JAR) 就是签名文件。$(DEFAULT_SYSTEM_DEV_CERTIFICATE) 就是两个密钥文件的前缀。
这两个变量在 config.mk 中定义:
./build/core/config.mk
笔者这边的签名文件位于以下目录:
./out/host/linux-x86/framework/signapk.jar
密钥文件为以下两个:
./build/target/product/security/testkey310.pk8
./build/target/product/security/testkey310.x509.pem
万事俱备,最终的签名命令如下:
java -jar signapk.jar -w test310.x509.pem test310.pk8 update_tmp.zip update.zip
等待片刻,命令执行完毕后所生成的 update.zip 就是我们所需要的增量升级包了。