OTA升级后应用未更新问题分析
在SD卡版本和ota升级到Q版本的版本差异的时候,发现一个奇怪的问题:
有一个在data/app目录下的apk(com.application.xxxSub),SD卡版本的版本号比OTA升级上来之后的版本号要高
版本之间的差异对比工具可参考:
https://github.com/chadmXiang/CompareVersionDiff/tree/master/tool/start_getdiff.bat
整个分析过程主要解决2个问题:
- apk从哪里来
- apk为什么版本号不一致
1.apk从哪里来
初步分析:通过包名来看,这个应用不是我们预置的apk,应该是预置的某个应用带进来的,通过排查,发现有个apk(com.applicaion.xxx)的包名和data分区下的很像。
刚开始分析的时候,以为是多个apk打包到一个apk,在PMS安装的时候
PackageManagerServices.java文件
http://androidxref.com/9.0.0_r3/xref/frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java
在如下方法里面添加Log打印
/*** Scans a package and returns the newly parsed package.* @throws PackageManagerException on a parse error.*/private PackageParser.Package scanPackageChildLI(PackageParser.Package pkg,final @ParseFlags int parseFlags, @ScanFlags int scanFlags, long currentTime,@Nullable UserHandle user)throws PackageManagerException {// If the package has children and this is the first dive in the function// we scan the package with the SCAN_CHECK_ONLY flag set to see whether all// packages (parent and children) would be successfully scanned before the// actual scan since scanning mutates internal state and we want to atomically// install the package and its children.if ((scanFlags & SCAN_CHECK_ONLY) == 0) {if (pkg.childPackages != null && pkg.childPackages.size() > 0) {scanFlags |= SCAN_CHECK_ONLY;}} else {scanFlags &= ~SCAN_CHECK_ONLY;}// Scan the parentPackageParser.Package scannedPkg = addForInitLI(pkg, parseFlags,scanFlags, currentTime, user);// Scan the childrenfinal int childCount = (pkg.childPackages != null) ? pkg.childPackages.size() : 0;for (int i = 0; i < childCount; i++) {PackageParser.Package childPackage = pkg.childPackages.get(i);addForInitLI(childPackage, parseFlags, scanFlags,currentTime, user);}if ((scanFlags & SCAN_CHECK_ONLY) != 0) {return scanPackageChildLI(pkg, parseFlags, scanFlags, currentTime, user);}return scannedPkg;}
发现没有相关的打印,方向搞错了。
后来把apk解压后,发现在asserts目录下有一个apk文件,包名就是在data目录下安装的那个应用
2.为什么apk版本号不一样
从结果来看,OTA升级上来的apk,版本号没有更新,应该是从升级前继承过来的,通过和升级瓣版本对比,也确认是一致的
SD卡刷机的apk和assert目录下的版本号是一致的
由于应用是三方的,反编译也不行,只能通过几组测试来排查:
- 删除data下的apk后重启
- root后手动删除data下的文件
- 手动卸载apk
现象都一样,没有重新安装,应该是由某个触发条件来控制是否安装的
2.添加多用户
通过查看Log,每次新建一个用户,都会走一次应用安装流程的,都是通过一个action来启动安装
基本上可以确认和系统的某个状态开关和关系,于是把data/system/users/目录下的3个配置文件全部删除了
- global.xml
- secure.xml
- system.xml
测试发现删除文件和apk后重启,apk重新安装了,应该就是这3个文件里面的某一个配置项引起的
首先排查开机向导,因为每次新建一个用户,都会走一次开机向导,手动把
- user_setup_complete
- device_provisioned
2个配置项的值改一下,重新删除apk后重启,应用重新安装了一次,证明就是这2个配置影响了安装流程,进一步排查,确认是如下配置项影响
user_setup_complete
为了从Log层面证实这个,添加Log打印了了所有rigister这个
Settings.Secure.USER_SETUP_COMPLETE
发现有源apk(com.application.xxx)文件里面有注册监听这个状态值的变化,继续对比测试后发现,是否安装这个应用,也和机器里面是否有安装这个应用有关
整理了一下com.application.xxx安装com.appicatation.xxxSub的流程如下:
- 注册监听Settings.Secure.USER_SETUP_COMPLETE,
- 判断com.application.xxxSub是否安装
完成了开机向导且应用未安装的情况下,才会安装
OTA升级后应用未更新问题分析相关推荐
- Android OTA升级后更新APN参数的实现
前言:最近在Android8.0的项目中遇到一个新的需求,客户在MR版本中要求我们更改APN参数,然后通过OTA升级的方式来更新APN参数,但是Android系统的设计是只有第一次刷机后开机才会走AP ...
- 记录解决Android11 OTA升级后卡死在开机动画页面的问题
问题描述: Android 11 ota升级后,重启卡死在开机动画界面 问题初步分析: 抓起串口开机日志,发现错误信息: [ 50.020526] init: Untracked pid 425 ...
- .net framework4.6项目的dll升级后,未找到方法“System.String.GetPathsOfAllDirectoriesAbove”解决
.net framework4.6项目的dll升级后,未找到方法"System.String.GetPathsOfAllDirectoriesAbove"解决 参考文章: (1). ...
- Android 手机OAT升级后应用没有更新问题解析
介绍: 最近遇到OTA版本手机升级完成后有些应用没有更新问题 遇到这种问题通常情况下按照以下几步: 1.排除ota升级失败(通过设置查看手机最新版本) 2.查看应用版本(版本是否升级到最新) 3.对比 ...
- MTK平台ota升级后不删除u盘的update.zip
又来了.开始苦逼的自追代码出补丁之路.本人辛苦追代码,原创,因此不怕任何侵权等行为. 故障现象: 把update.zip放入U盘根目录,插入普通usb口(看代码发现好像插入OTG口也可以,而且它升级完 ...
- 系统应用修改包名,导致OTA升级后用户数据丢失
背景描述 Android大版本升级,有一个系统应用因为需求修改包名变了,R升S之后,R上的用户操作数据和缓存数据丢失. 问题原因 因为包名改变,导致升级之后系统检测原包名不存在,删除了data/dat ...
- QT Creator 使用 design 修改 ui界面编译后界面未更新代码提示
我的开发环境: 1,VS2008 2,qt-win-opensource-4.7.4-vs2008 3,qt-vs-addin-1.1.9 为了开发方便,我也安装了qt-creator-win-ope ...
- AndroidStudio升级后,离线更新Gradle版本失败问题解决
发现问题 最近项目差不多完结了,赶紧升级了一波我的撸码装备--AndroidStudio.不升级不知道,一升级吓一跳.新建一个项目工程一个劲给我报错. 解决问题 看这样子,应该是Gradle的 ...
- 关于pandorabox 安装远程迅雷后 远程未启动的分析
这几天闲着无聊,自用的小米路由Mini 刷了pandorabox ,给小米安装了lnmp 搭建自己的web服务器 并且正常启动,看到很多小伙伴们都用万能路由进行远程下载,自己也试了下 结果遇到下列问 ...
最新文章
- JUnit4.11 理论机制 @Theory 完整解读
- php文件数组,从文件到数组php
- 数据标准化处理,data.mean和data.std
- 如何攻击Java Web应用【转载】
- 《深入理解Java虚拟机》(二)Java虚拟机运行时数据区
- 04-课后作业1-字符串加密
- Linux下 查找大文件
- 【蓝桥杯嵌入式】【STM32】11_2016_第七届_蓝桥杯_省赛_电压测量监控设备
- 27岁985女硕,运营商工作三年,迷茫想转型
- Windows 10 修改网络名字
- 欧几里得算法、扩展欧几里得算法、求逆元、中国剩余定理、扩展中国剩余定理
- jQuery源码阅读(一)---jQuery源码整体架构
- iNode客户端安装
- 小白怎么入行网络安全?看这一篇就够啦!
- 开源软件修改的必要性
- 如何在论文后面插参考文献
- java闰年_编写java程序判断闰年。
- mysql的服务被删了怎么办_三、MySQL服务构成、基本操作、误删所有用户后的恢复方法...
- php总结与展望_2020 年的 PHP 回顾与展望
- 城市级智能网联示范区情况全扫描(2022版)
热门文章
- 大端机与小端机介绍及其判断(C)
- [51Nod 1185 威佐夫游戏 V2]Wythoff Game+乘法模拟
- 亚马逊服务器怎么做系统,使用亚马逊云服务器EC2做深度学习(四)配置好的系统镜像...
- linux应用程序设置粘滞位,Linux中的粘滞位
- 20150712 We can locate ourselves with the GPS
- OpenCV与VS的版本对应关系
- windows无法连接打印机共享打印机常见错误码与解决方案
- springboot+mysql城市房屋租赁管理系统设计与实现-计算机毕业设计源码01855
- eclipse theia_如何在Ubuntu 18.04上设置Eclipse Theia Cloud IDE平台
- 最新小储云商城源码Ver1.782版本+无需授权