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 parent
        PackageParser.Package scannedPkg = addForInitLI(pkg, parseFlags,
                scanFlags, currentTime, user);

        // Scan the children
        final 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是否安装

完成了开机向导且应用未安装的情况下,才会安装

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android OTA(Over-The-Air)升级是指通过网络传输直接在设备上进行系统升级的一种方法。下面简要介绍Android OTA升级的流程以及常见问题分析Android OTA升级流程通常包括以下几个步骤: 1. 系统准备:开发者根据新版本的要求,为设备准备升级所需的系统文件。这些文件包括操作系统文件、应用程序文件以及升级脚本等。 2. 设备请求:设备通过连接到网络,并向服务器请求最新的系统升级。服务器根据设备的型号和当前系统版本,判断是否需要进行升级。 3. 传输升级文件:如果服务器确认设备需要进行升级,那么就会将升级文件传输给设备。这通常是通过HTTP或FTP等协议进行数据传输。 4. 升级验证:设备接收到升级文件后,会进行文件校验,以确保文件的完整性和一致性。 5. 升级安装:设备在校验通过后,会进行系统升级安装。这通常会涉及到文件解压、系统分区扩展等操作。 6. 安装后处理:升级完成后,设备会重新启动并进行一些后期处理工作,例如数据迁移、应用优化等。 常见问题分析: 1. 升级失败:升级过程中可能出现各种原因导致升级失败,如网络中断、升级文件损坏、设备存储空间不足等。解决方法可以包括重新尝试升级、检查网络连接、清理设备存储空间等。 2. 兼容性问题:新版本的系统可能对设备硬件或软件要求更高,而一些老旧设备可能无法满足这些要求。这可能导致升级后设备性能下降或功能不可用。解决方法可以是提供适配的系统版本更新设备硬件。 3. 数据丢失:升级过程中可能导致设备的数据丢失,包括联系人、短信、应用程序数据等。为了避免这种问题,可以提醒用户备份数据或提供数据迁移工具。 4. 升级时间过长:升级过程可能需要较长时间,尤其是在升级文件较大或设备性能较低的情况下。解决方法可以是优化升级文件的大小和传输速度,或提供快速升级选项。 总结:Android OTA升级通过网络直接在设备上进行系统升级,流程包括准备、请求、传输、验证、安装和处理。常见问题包括升级失败、兼容性问题、数据丢失和升级时间过长等,需要通过合适的解决方法来处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值