问题现象:在进行 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 分区容量<number>,则是原因版本中某个被修改的文件很大,该大文件一般是版本中的 iso影像,因此在项目中若产品量产后,是不允许修改 iso 影像的。

问题现象:内核升级失败,报错提示: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卡上。


MTP方式的内置T卡其实就是DATA区,所以在重启之后会提示检测不到SD card。


需要修改更新包路径,把/sdcard改为/data/media,recovery.cpp文件main函数


char *inPath = NULL; 

if (update_package) { 

inPath = (char*)malloc(strlen(update_package)+sizeof(char) * 5); 

memset(inPath, 0, strlen(update_package)+sizeof(char) * 5); 

if (strncmp(update_package, "/sdcard", 7) == 0) { 

if (ensure_path_mounted(update_package) != 0) { 

strcat(inPath, "/data/media"); 

strcat(inPath, update_package + sizeof(char) * 7); 

if (ensure_path_mounted(inPath) == 0) { 

update_package = inPath; 

                } 

LOGI("Change mount path to:%s\n", update_package); 

            } 

        } 

}



2.2当MTK_2SDCARD_SWAP == no


内置sd卡为主卡,插不插外置sd卡ota包都下载到内置sd卡上。


内置sd卡的路径不再是/data/media,具体通过adb shell查看后确定,例如:/data/media/0。


strcat(inPath, "/data/media");改为——〉strcat(inPath, "/data/media/0");


问题现象:OTA升级之后部分apk丢失


问题描述:


在当前版本恢复出厂设置,通过OTA升级到下一版本,开机查看有些应用桌面快捷方式无法打开,主菜单中找不到该应用。


在当前版本不做恢复出厂设置,通过OTA升级到下一版本,开机查看应用运行正常。


问题分析:


分析丢失的这些应用为两个版本之间更新的第三方apk,因为这些apk的名字变更了,名字中大都有版本号日期等信息,更新的方式是删除旧的apk,重新添加新的apk。问题出在当前版本是否恢复出厂设置,那么我们看看恢复出厂设置对这些apk有什么影响?



 


可见,恢复出厂设置之后data/app下的apk只是一个链接,指向system/appjar下面备份的apk,也就是说恢复出厂设置的时候擦data区之后并没有像我们预期的那样把system/apppjar下的apk拷贝到data/app下,而只是创建了一个链接。为了确定apk被删除可以查看一下恢复出厂设置前后data区的已用空间有什么变化,你会发现下载完版本直接恢复出厂设置data区已用空间少了几百兆。让我们把思路理一下,在当前版本恢复出厂设置,把data/app下apk删除,创建链接指向system,升级到新版本,system下面的apk更新,升级不会擦除data区,所以链接不变,因为它名字变了,那么显然找不到新的apk。至于恢复出厂设置为什么不拷贝apk,而创建链接,这是MTK的一个data区优化方案。如果平台上没有这个优化方案也就不存在这样的问题。


解决方案:


针对apk丢失的情况,我们如何解决?


1、    向MTK申请关闭data区优化方案;


2、    在恢复出厂设置只保存链接的情况下,集成apk的时候始终保持apk的名字不变。



四、包不完整导致升级失败


SD卡升级经常会遇到升级失败,log如下:


-- Install /sdcard ... 

I:Finding update package... 

I:Update location: /sdcard/huaqin82_tb_b2b_tdd-ota.zip 

I:Opening update package... 

I:read key e=3 

I:1 key(s) loaded from /res/keys 

I:Verifying update package... 

I:comment is 1682 bytes; signature 1664 bytes from end 

E:failed to verify whole-file signature 

I:verify_file returned 1 

E:signature verification failed 

Installation aborted.



导致包不全的原因可能是拷贝之后没有安全退出,如果出现这种情况,首先把包删掉,重新拷贝完成之后稍等片刻安全退出,如果还是不行,那就要把sd卡格式化后再拷贝一般可以解决此问题。