问题场景如下:

       产品已经上市,由于销量太好了,某个硬件连二供都供应不上,没办法,只能用三供的硬件,但是之前量产版本的软件(软件A)不支持三供的硬件,所以为兼容三供硬件,需要出软件B,软件A和软件B版本号一样(为了使所有用户在表面上看拿到都是了一样的产品)。但是使用的三方OTA升级软件是通过软件版本号去区分版本的,现在软件A和软件B版本号一样,那么以后如果需要出售后版本C,如何使得软件A和软件B都能正常升级到软件C呢?


基本思路:

  1.  先认识两个很很重要的文件

\META-INF\com\google\android\update-binary

updater-script 是升级脚本,这个脚本指出了相关文件要更新到某个分区以及升级包和软件版本的匹配关系。update-binary 负责解析updater-script 脚本和执行升级动作。

update-binary 和 updater-script 。

 2. 有了前提(1),我们就可以实现把两个升级包合成一个,然后去升级。 


具体解决方法:

   1.  很显然,软件A已经发到用户手中,无法再去修改软件A。而在出软件B的时候,还是可以做些需要的改动的,因为它还在自己的控制中。首先需要做个标志,只得软件B能和软件A区分开,比如编译时间,一个属性值,只要在升级时能获取到就行。

 2. 做软件A 到软件C的差分包AC, 做软件B到软件C的差分包BC。

updater-script , 软件B升级时解析差分包BC的updater-script 。

update-binary (编译完对应到obj\PACKAGING\target_files_intermediates\xxxtarget_files\OTA\bin\updater 文件)

AC的updater-script 文件里面需要修改成对应AC包的升级文件,BC的updater-script 文件里面需要修改成对应BC包的升级文件。用编译出来的update-binary 替换到整合包里。

patch.dat 为后缀的升级文件不能压缩,否则升级失败。

java -Xmx1024m -jar out/host/linux-x86/framework/signapk.jar -w android_keys/testkey.x509.pem   android_keys/testkey.pk8 temp/temp.zip update.zip

  8. 这样得到的update.zip 在软件A和软件B上就都能升级了。