问题现象:在进行 OTA 升级测试时,下载成功了升级包,在点击立即更新后,手机一直处于提示“正在更新中”,没能重启进行升级。
问题分析:经过分析发现,因为OTA 应用不具备系统权限。导致其无法在目录/cache/recovery 中创建command 文件并在该文件中写入命令,从而导致 OTA 应用无法通过这种预定的方式重启机器并进入recovery 模式,无法实现正常 OTA 升级。
解决方案:通过在 init.rc 文件中增加 mkdircache/recovery 命令,使该目录默认具备写权限,确保 OTA应用可以正常进行系统升级。
问题现象: 下载完升级包后,进入 recovery 模式进行升级时, 系统提示升级失败,手机无法成功升级。
问题分析:通过分析日志,升级失败系在对系统文件进行校验时无法通过校验。跟踪编译流程,发现生成的版本文件和用于生成 OTA 升级包的目录文件不一致。根本原因是在生成版本文件后的编译目标文件的过程中,许多模块重新进行了编译。从而导致版本文件和目标文件中存在有着差异的文件。从而导致升级因校验失败而无法正常升级。
解决方案:针对这种情况,在编译完目标文件后重新打包生成版本文件,就可以解决两者不一致的问题。
问题现象:差分包签名校验失败,报错提示:signature verification failed,Installation aborted。
解决方案:(有三种情况):
1. 差分包签名和版本中签名不一致。开发流版本使用 google 原生签名,故差分包也必须使用
google 原生签名。集成流和发布流版本使用公司签名,故差分包也必须使用公司签名。
2. 差分包导入到 sd卡时,有时会出现导入失败,原因是从命令提示符中看到已经导入成功,实际上差分包的部分数据还在缓存中,没有完全导入 SD卡,所以会出现 SD卡的数据不完整而校验失败,解决方法:将升级包(update.zip包)导入 SD卡后,需要执行 adb shell sync。
3. 在制作差分包过程中,差分包的压缩文件损坏,CRC 校验失败。验证方法:将差分包解压,此时会提示解压失败,正常的差分包应该是能正常解压的。
问题现象:升级过程中失败,报错提示:assert failed: getprop("ro.product.device")
问题分析:由于升级过程中需要校验ro.product.device,若新版本中修改了该属性值,则使用前向版本升级时,由于 ro.product.device 不一致,则将会导致升级认为机器手机类型不同而升级失败。
解决方案:将assert(getprop("ro.product.device")的脚本语句屏蔽。
问题现象:版本号不对应,报错提示:assertfailed: file_getprop("/system/build.prop", "ro.build.fingerprint")
问题分析:由于差分包是基于前后两个版本进行差分后升级,若使用的源版本不对应,便会导致差分包不匹配而升级失败。
解决方案: 进入系统设置,查看手机版本是否与差分包的ro.build.fingerprint 对应,重新使用正确的版本进行升级。
问题现象:版本的文件被手动修改,报错提示:script aborted: assert failed: apply_patch_check
问题分析: 可能开发人员或中试人员对源版本获取了root 权限,对手机中的文件进行了修改,而升级中刚好会升级这些文件,便会出现升级被改动文件失败的情况。
解决方案: 获取手机版本中 system 目录所有文件和用于制作差分包的源版本包中的文件进行比对,找出该文件为何被修改的原因。如果是版本集成问题,需要重新编译版本。
问题现象:cache 分区空间不足,报错提示:scriptaborted: assert failed: apply_patch_space
问题分析:由于差分包升级过程中是需要将需差分包的文件放置在 cache分区下,若需差分的最大文件容量大于 cache 分区的最大容量,则会导致无法放置而升级失败。
解决方案:查看差分包中updater-script 脚本中的以下语句:assert(apply_patch_space(number)),通过计算 cache 分区容量
问题现象:内核升级失败,报错提示:scriptaborted: assert failed: apply_patch("EMMC:…
问题分析:多种情况下都可能导致内核升级失败:
1. 由于版本中若修改了内核的起始地址,将会导致制作出来的差分包在校验内核时 sha 校验失败。
2. 在制作差分包时,若需要升级modem 文件,其正确顺序为先做 AP 侧的差分包和整包,然后把要升级的 MP 侧文件放进去,再签名。若顺序反了:如先放置 MP 侧文件,再制作 AP 侧的差分包和整包,这种也会导致升级内核失败。
解决方案:对于第一种情况,则对内核不能使用差分的形式,而要使用整体的形式进行升级,即将对内核的 apply_patch 语句去除,而使用以下方法。emmc 文件系统:package_extract_file("boot.img","/dev/block/mmcblk0p8")或 MTD 文件系统:assert(package_extract_file("boot.img","/tmp/boot.img"),write_raw_image("/tmp/boot.img","boot"),delete("/tmp/boot.img"));
问题现象:升级 boot.img 时,拔电池重启后,会一直进入 recovery 模式,并且不能正常升级。
问题分析:由于差分包升级过程中是需要校验的,恢复到一半的时候断电,会导致差分包与源文件对不上号而导致升级失败。
解决方案:升级中提示用户不能拔电池,或者使用整包升级而不是差分升级包。
问题现象:MTP方式不插T卡升级问题(android4.4系统才有此问题)
解决方案:
当MTK_2SDCARD_SWAP == yes
外置sd卡为主卡,插入外置sd卡ota包下载到外置卡上,拔掉sd卡下载到内置sd卡上。导致包不全的原因可能是拷贝之后没有安全退出,如果出现这种情况,首先把包删掉,重新拷贝完成之后稍等片刻安全退出,如果还是不行,那就要把sd卡格式化后再拷贝一般可以解决此问题。