zoukankan      html  css  js  c++  java
  • OTA升级常见问题

    OTA升级常见问题

    问题现象:在进行 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
    ", 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卡格式化后再拷贝一般可以解决此问题。



    原文链接:https://blog.csdn.net/nwpushuai/article/details/79706722

  • 相关阅读:
    10 种保护 Spring Boot 应用的绝佳方法
    Redis 如何分析慢查询操作?
    Spring Boot 主类及目录结构介绍
    Redis 再牛逼,也得设置密码!!
    Spring Data Redis 详解及实战一文搞定
    Spring Boot Redis Cluster 实战干货
    超详细的 Redis Cluster 官方集群搭建指南
    Redis Linux 安装运行实战全记录
    hdu 4790 Just Random (思路+分类计算+数学)
    poj 1328 Radar Installation(贪心)
  • 原文地址:https://www.cnblogs.com/111testing/p/11863278.html
Copyright © 2011-2022 走看看