做这个研究的初衷说来惭愧,与OTA后台接口之间存在个bug,即终端获取MD5值的时候,如果首位是0,会被自动舍去,导致版本校验不过,这个概率是1/16. 怎么办呢,就想到了手动直接改一下OTA版本,避免了整机重编译,要知道Android 整编是很耗时间的。
方法:
1,将OTA升级包重新压缩,并随便添加一个小文件,比如添加version.txt.
2,在Android根目录下重新签名,使用如下命令(标红处根据你项目的实际情况设置):
签名的key的选择依赖你的android的编译版本,你也可以用自己创建的key,不过需要与打包ota的时候统一起来。如下示例,因为我是debug版本,所以打包ota的时候会使用了testkey。
后面的两个参数一个是ota包签名前文件路径,一个是签名后文件路径。
java -Xmx1024m -jar out/host/linux-x86/framework/signapk.jar -w build/target/product/security/testkey.x509.pem build/target/product/security/testkey.pk8 ../920/update_signed.zip ../920/sign/update_signed.zip
3,打包生成的zip文件即为重新签名后的OTA升级包文件。
如果手动修改过OTA升级包,不重新进行签名,使用BeyondConpare工具比较是无差别的,如下,但是仍然无法通过系统的校验进行升级。
修改了内容,重新签名以后,签名文件会跟原来的有所不同,是否说明签名文件的目录中有对当前包中的内容的时间或者列表等的描述??这时候是能够通过系统的验证的,如下。
自测步骤:
1,使用原生设置:设置-》设备-》关于-》System Local update,版本验证通过,能够启动升级。
2,升级成功以后,验证基本功能正常。Launcher轮播,CIBN高清影视视频播放,爱奇艺播放正常。
3,升级成功以后,再次通过System Local update 升级正常的OTA升级包,能够验证通过并正常升级。升级以后基本功能正常。
参考文献:
https://source.android.google.cn/devices/tech/ota/sign_builds.html
https://blog.csdn.net/mu0206mu/article/details/7399822 |