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\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升级常见问题的更多相关文章
- Android OTA 升级之三:生成recovery.img
Android OTA 升级之三:生成recovery.img 作者: 宋立新 Email:zjujoe@yahoo.com 前言 得到了ota升级包后,我们就可以用它来升级系统了.Android 手 ...
- android 标准OTA升级流程
标准的OTA升级流程包括一下几个步骤: 1.Android设备首先会与OTA服务器进行交互,如果有更新会推送给客户.推送的信息常常会包含OTA更新包的下载地址和一些版本信息. 2.Update程序会将 ...
- ESP8266远程OTA升级
https://blog.csdn.net/xh870189248/article/details/80095139 https://www.wandianshenme.com/play/arduin ...
- ota升级动画修改
在网上可以搜到很多相关的文章,但是很多文章都是复制粘贴而来的,为了方便后面工作学习,本文会把其中最关键的几个步骤列出来. 首先根据ota升级界面的文字可以确认相关的图片资源的目录在哪里,可以网上搜一下 ...
- 乐鑫esp8266基于freeRtos实现私有服务器本地远程OTA升级
目录 一.前言: 二.回顾下OTA的流程: 三.lwip网络框架的知识的使用: 四.如何处理服务器返回的数据? 五.扇区的擦除和烧写? 六.如何调用? 七.好好享用吧! 八.下载: 九.工程截图: 代 ...
- 实现乐鑫esp8266的无线OTA升级,实现远程在线升级固件
代码地址如下:http://www.demodashi.com/demo/12994.html 一.前言: 写了这么多的8266博文,一直以满意100%的心态去敲写代码固件烧录,以致很少出现 bug ...
- OTA升级
除了云端平台这部分,还要有通讯协议层面.云端和汽车端之间指令的接口和协议的制定,不同车厂会有不同诉求.艾拉比既可以支持车厂私有化定制协议的要求,也可以提供基于OMA标准的协议. 第一,它既是云端的工具 ...
- OTA升级中关于update.zip包的一些总结【转】
本文转载自:http://429564140.iteye.com/blog/2337165 update.zip包整理 一. update.zip包的目录结构 |----boot. ...
- Android Recovery OTA升级(一)—— make otapackage
文件夹 文件夹 概述 make otapackage BUILT_TARGET_FILES_PACKAGE ota_from_target_files WriteFullOTAPackage Sign ...
随机推荐
- Android笔记(七十六) 点菜DEMO
一个朋友让看一下他的代码,一个点菜的功能,他和我一样,初学者,代码比我的都混乱,也是醉了,干脆想着自己写个demo给他看,原本想着听简单,半个小时应该就可以搞定,真正写的时候,画了3h+,汗颜... ...
- python的map和reduce函数
map函数时python的高级内置函数 语法为:map(function, iterable, ...) 参数:function -- 函数iterable -- 一个或多个序列 将function作 ...
- Linux 修改文件目录权限
修改文件目录权限 chmod chmod u+x b.txt chmod 777 a.txt 修改文件的所有者和所属组 修改所有者chown beifeng a.txt 修改所属组chgrp b ...
- evpp tcp server服务端
// netserver.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <evpp/tcp_server.h> ...
- GO语言开发之路
Go语言开发之路 介绍 为什么学习Go语言? 开发环境准备 从零开始搭建Go语言开发环境 VS Code配置Go语言开发环境 基础 Go语言基础之变量和常量 Go语言基础之基本数据类型 Go语言基础之 ...
- OLED液晶屏幕(0)自动获取12ic地址液晶屏幕
. 烧录 串口可以看到输出的地址 #include <Wire.h> void setup(){ Wire.begin(); Serial.begin(9600); Serial.prin ...
- [Security] Always use parameterized queries
SQL databases are commonly used to store data; for example - your application could store user profi ...
- RESTful API Design: 13 Best Practices to Make Your Users Happy
RESTful API Design: 13 Best Practices to Make Your Users Happy First step to the RESTful way: make s ...
- LOJ P10008 家庭作业 题解
每日一题 day45 打卡 Analysis 这道题跟LOJ P10004 一样,但是数据范围不同,不允许O(n²) 的贪心算法通过. 我们可以加一个limit 来判断这个截止期限已经不行了,所以以后 ...
- jsp解决大文件断点续传
我们平时经常做的是上传文件,上传文件夹与上传文件类似,但也有一些不同之处,这次做了上传文件夹就记录下以备后用. 这次项目的需求: 支持大文件的上传和续传,要求续传支持所有浏览器,包括ie6,ie7,i ...