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\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卡格式化后再拷贝一般可以解决此问题。

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

OTA升级常见问题的更多相关文章

  1. Android OTA 升级之三:生成recovery.img

    Android OTA 升级之三:生成recovery.img 作者: 宋立新 Email:zjujoe@yahoo.com 前言 得到了ota升级包后,我们就可以用它来升级系统了.Android 手 ...

  2. android 标准OTA升级流程

    标准的OTA升级流程包括一下几个步骤: 1.Android设备首先会与OTA服务器进行交互,如果有更新会推送给客户.推送的信息常常会包含OTA更新包的下载地址和一些版本信息. 2.Update程序会将 ...

  3. ESP8266远程OTA升级

    https://blog.csdn.net/xh870189248/article/details/80095139 https://www.wandianshenme.com/play/arduin ...

  4. ota升级动画修改

    在网上可以搜到很多相关的文章,但是很多文章都是复制粘贴而来的,为了方便后面工作学习,本文会把其中最关键的几个步骤列出来. 首先根据ota升级界面的文字可以确认相关的图片资源的目录在哪里,可以网上搜一下 ...

  5. 乐鑫esp8266基于freeRtos实现私有服务器本地远程OTA升级

    目录 一.前言: 二.回顾下OTA的流程: 三.lwip网络框架的知识的使用: 四.如何处理服务器返回的数据? 五.扇区的擦除和烧写? 六.如何调用? 七.好好享用吧! 八.下载: 九.工程截图: 代 ...

  6. 实现乐鑫esp8266的无线OTA升级,实现远程在线升级固件

    代码地址如下:http://www.demodashi.com/demo/12994.html 一.前言: 写了这么多的8266博文,一直以满意100%的心态去敲写代码固件烧录,以致很少出现 bug ...

  7. OTA升级

    除了云端平台这部分,还要有通讯协议层面.云端和汽车端之间指令的接口和协议的制定,不同车厂会有不同诉求.艾拉比既可以支持车厂私有化定制协议的要求,也可以提供基于OMA标准的协议. 第一,它既是云端的工具 ...

  8. OTA升级中关于update.zip包的一些总结【转】

    本文转载自:http://429564140.iteye.com/blog/2337165 update.zip包整理 一. update.zip包的目录结构           |----boot. ...

  9. Android Recovery OTA升级(一)—— make otapackage

    文件夹 文件夹 概述 make otapackage BUILT_TARGET_FILES_PACKAGE ota_from_target_files WriteFullOTAPackage Sign ...

随机推荐

  1. IDEA配置自己的注释

    File-->Setting-->Live Templates,点击+,选择2.Template Group... 创建Group,我的命名为MyAnnotation,然后选中MyAnnt ...

  2. Spire.Doc 生成pdf业务运营报告

    需求:每天向全国各运营大区钉钉运营群定时发送pdf业务运营报告: 通过对各Office操作组件对比,选择Spire.Doc.它专门为开发人员进行创建,读取,写入.转换打印 word 文档文件提供便利, ...

  3. MySQL存储过程02

    这次接着说MySQL存储过程: 我们先看它的多分支控制结构case: case的语句很简单: case 变量名 when 条件1 then 输出结果1; when 条件2 then 输出结果2; .. ...

  4. java继承 、方法重写、重写toString方法

    1.Java的继承,关键词Extends package cn.mwf.oo; public class TextExtends { public static void main(String[] ...

  5. 解决windows下合上、掀开笔记本盖子后屏幕黑屏的问题

    我在macbook上安装了windows10,但是由于驱动问题,虽然我设置的是关闭盖子仅息屏,但是在关闭盖子后一段时间,再掀开,屏幕就怎么样都唤不醒了. 我找到一个方法,虽然治标不治本,但是起码能解决 ...

  6. rhce 考试题目总结

    rhce 考试题目总结归类 开机需要做的事: 检查系统版本 配置yum源 修改selinux的模式 ping一下server机器 1.分区类题目 1.1 rhcsa 第十五题 添加swap分区 要点: ...

  7. win10设置以管理员身份开机启动

    首先是右键程序,然后设置了管理员权限启动.但是在这样设置之后原先的开机机启动就失效了. 在谷歌之后发现有人通过计划任务开机启动.于是就试了试.别人设置的是用户登录时,我改成了开机就启动.就是这样一改, ...

  8. springmvc接收List型参数长度

    springmvc默认接收list参数长度为256,过长则报越界异常,添加 @InitBinder public void initBinder(WebDataBinder binder) { // ...

  9. vue中引入.svg图标,使用iconfont图标库

    阿里巴巴的iconfont是一个很好的图标库,海量的素材可以快速满足开发人员日常对图标的诉求,我们采用symbol引用,官方介绍 创建SvgIcon组件 <template> <sv ...

  10. 修改idea,webstrom,phpstrom 快捷键double shift 弹出search everywhere

    这个问题很困惑,因为这个功能很好用,查找什么很方便,but! 我用了十年的搜狗输入法,大家都知道搜狗输入法按shift中英文切换很方便,特别在写代码时候...所以就和这个double shift功能冲 ...