在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目录下的版本号是一致的

由于应用是三方的,反编译也不行,只能通过几组测试来排查:

  1. 删除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升级后应用未更新问题分析相关推荐

  1. Android OTA升级后更新APN参数的实现

    前言:最近在Android8.0的项目中遇到一个新的需求,客户在MR版本中要求我们更改APN参数,然后通过OTA升级的方式来更新APN参数,但是Android系统的设计是只有第一次刷机后开机才会走AP ...

  2. 记录解决Android11 OTA升级后卡死在开机动画页面的问题

    问题描述: Android 11 ota升级后,重启卡死在开机动画界面 问题初步分析: 抓起串口开机日志,发现错误信息: [   50.020526] init: Untracked pid 425 ...

  3. .net framework4.6项目的dll升级后,未找到方法“System.String.GetPathsOfAllDirectoriesAbove”解决

    .net framework4.6项目的dll升级后,未找到方法"System.String.GetPathsOfAllDirectoriesAbove"解决 参考文章: (1). ...

  4. Android 手机OAT升级后应用没有更新问题解析

    介绍: 最近遇到OTA版本手机升级完成后有些应用没有更新问题 遇到这种问题通常情况下按照以下几步: 1.排除ota升级失败(通过设置查看手机最新版本) 2.查看应用版本(版本是否升级到最新) 3.对比 ...

  5. MTK平台ota升级后不删除u盘的update.zip

    又来了.开始苦逼的自追代码出补丁之路.本人辛苦追代码,原创,因此不怕任何侵权等行为. 故障现象: 把update.zip放入U盘根目录,插入普通usb口(看代码发现好像插入OTG口也可以,而且它升级完 ...

  6. 系统应用修改包名,导致OTA升级后用户数据丢失

    背景描述 Android大版本升级,有一个系统应用因为需求修改包名变了,R升S之后,R上的用户操作数据和缓存数据丢失. 问题原因 因为包名改变,导致升级之后系统检测原包名不存在,删除了data/dat ...

  7. 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 ...

  8. AndroidStudio升级后,离线更新Gradle版本失败问题解决

    发现问题   最近项目差不多完结了,赶紧升级了一波我的撸码装备--AndroidStudio.不升级不知道,一升级吓一跳.新建一个项目工程一个劲给我报错. 解决问题   看这样子,应该是Gradle的 ...

  9. 关于pandorabox 安装远程迅雷后 远程未启动的分析

    这几天闲着无聊,自用的小米路由Mini 刷了pandorabox  ,给小米安装了lnmp 搭建自己的web服务器 并且正常启动,看到很多小伙伴们都用万能路由进行远程下载,自己也试了下 结果遇到下列问 ...

最新文章

  1. JUnit4.11 理论机制 @Theory 完整解读
  2. php文件数组,从文件到数组php
  3. 数据标准化处理,data.mean和data.std
  4. 如何攻击Java Web应用【转载】
  5. 《深入理解Java虚拟机》(二)Java虚拟机运行时数据区
  6. 04-课后作业1-字符串加密
  7. Linux下 查找大文件
  8. 【蓝桥杯嵌入式】【STM32】11_2016_第七届_蓝桥杯_省赛_电压测量监控设备
  9. 27岁985女硕,运营商工作三年,迷茫想转型
  10. Windows 10 修改网络名字
  11. 欧几里得算法、扩展欧几里得算法、求逆元、中国剩余定理、扩展中国剩余定理
  12. jQuery源码阅读(一)---jQuery源码整体架构
  13. iNode客户端安装
  14. 小白怎么入行网络安全?看这一篇就够啦!
  15. 开源软件修改的必要性
  16. 如何在论文后面插参考文献
  17. java闰年_编写java程序判断闰年。
  18. mysql的服务被删了怎么办_三、MySQL服务构成、基本操作、误删所有用户后的恢复方法...
  19. php总结与展望_2020 年的 PHP 回顾与展望
  20. 城市级智能网联示范区情况全扫描(2022版)

热门文章

  1. 大端机与小端机介绍及其判断(C)
  2. [51Nod 1185 威佐夫游戏 V2]Wythoff Game+乘法模拟
  3. 亚马逊服务器怎么做系统,使用亚马逊云服务器EC2做深度学习(四)配置好的系统镜像...
  4. linux应用程序设置粘滞位,Linux中的粘滞位
  5. 20150712 We can locate ourselves with the GPS
  6. OpenCV与VS的版本对应关系
  7. windows无法连接打印机共享打印机常见错误码与解决方案
  8. springboot+mysql城市房屋租赁管理系统设计与实现-计算机毕业设计源码01855
  9. eclipse theia_如何在Ubuntu 18.04上设置Eclipse Theia Cloud IDE平台
  10. 最新小储云商城源码Ver1.782版本+无需授权