制作target_files
make otapackage
可以将编译的全部命令打出来跟踪详细编译中间包的过程
制作差分包
ota_from_target_files.py制作全量包、或者增量包
./build/tools/releasetools/ota_from_target_files -v -p out/host/linux-x86 -k device/****/***Key -n -i A.zip B.zip
- 覆盖所有分支情况
版本A的target_file到版本B的target_file中,会有下面四种情况
(1)版本A中没有分区custom,版本B中没有分区custom
(2)版本A中没有分区custom,版本B中有分区custom
(3)版本A中有分区custom,版本B中没有分区custom
(4)版本A中有分区custom,版本B中有分区custom
因而对应这四种情况都需要考虑,参考《代码大全》中防御式编程
直接读取版本A,版本B中相关的文件,然后进行比较,如果不一样则进行更新,如果一样则不需要更新
制作差分包比较文件差异是,如果遇到解压文件找不到临时文件的情况,需要制定python解压时不要删除临时文件
对zip签名
-
替换zip中updater
unzip -o -q AtoB_update.zip -d AtoB cd AtoB zip -r ../AtoB_modified.zip ./
修改updater后,需要进行手动签名
java -Xms2048m -jar out/host/linux-x86/framework/signapk.jar -w device/AAAA/common/keys/AAAAKey.x509.pem device/AAAA/common/keys/AAAAKey.pk8 I1029toJ0601_unsigned.zip update.zip
执行updater
-
updater中读取机型名称,同样需要防御式编程
机型名称属性是否存在
机型名称属性值是否有异常字符,前后是否有空格,参考如下
C语言去除字符串首尾空格,trim()函数实现 -
解压zip中文件到data分区
参考install.cpp中代码解压文件到/data/分区,这样就得要求此时/data分区已挂载
利用现有函数挂载分区
load_volume_table()
ensure_path_mounted()
调用execl执行想要执行的命令
在updater.c中fork出一个进程后,调用execl("/sbin/busybox", "sh", "-c", cmd, (char *) 0));
区分execl与system——应用程序中执行命令
./updater 1 /tmp/update.log AtoB_signed.zip
参考:
https://www.cnblogs.com/cxchanpin/p/7020315.html
https://blog.csdn.net/huangyabin001/article/details/43965307