android OTA升级之后,apk崩溃无法启动

2024-06-14 13:36

本文主要是介绍android OTA升级之后,apk崩溃无法启动,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

硬件平台:QCS6125

软件平台:Android 11

  问题背景:系统版本从低版本升级到高版本后,apk崩溃启动失败。启动失败的activity为apk新增加的组件,报错的信息为:

ActivityNotFoundException: Unable to find explicit activity class {com.yuanfudao.android.megrez.system.settings/com.yuanfudao.android.megrez.launcher.upgrade.activity.AutoUpgradeActivity}; have you declared this activity in your AndroidManifest.xml? - sentry - megrez-app-s2-launcher

表面意思是找不到这个新添加的activity,但是从系统升级之后的apk源文件dump信息看,apk文件是升级成功的,而且如果不是最新的话就不会启动这个新添加的activity,怀疑是此apk的数据缓存未更新,导致系统不识别新增的组件;

  1、在PKMS和PackageParser、PackageCacher等类加日志,发现在复现问题的场景下,data分区下apk对应的cache缓存是不更新的,日志线索:

18:33:04.661990  1402  1402 D PackageManager: Keeping known cache f440076f74442ad4fdc9b67da03a644a795c4079

这行日志之所以打印出来,从代码上下文来看,就是升级之后系统fingerprint的hash值较之前旧版本无变化所致,正常情况下,Android每个版本都会对应唯一的fingerprint,不会有高低版本的fingerprint 哈希值一样的情况,即都会打印上述日志的else情况:

08:05:39.665153  1241  1241 D PackageManager: Destroying unknown cache e0ba64a1887994e81e808eab35d295e97ea17523

这样的话系统应用在data分区创建的cache目录就会被删除而从新创建,那新增的组件就会解析成功并写入新的缓存文件,就不会报错;

缓存目录:/data/system/package_cache/指纹哈希值/

也就是说,我们这个高低版本是fingerprint相同的情况,这个问题追述到jenkins编译,启动job时会初始化一个BUILD_NUMBER值,这个值正好跟Android的build系统的名称重复,这就导致Android build系统那一套拼接时间戳的值不会走,因为jenkins一启动就会定义该值,而我们jenkins服务器迁移过,这个值又会从1开始累计,导致前后版本都是16,从而导致fingerprint一致。

2、还有一种情况是,这个问题并不是必现,比如A、B、C从低到高依次三个版本,B、C的fingerprint一致,那么1说的情况就是A->B->C必现更新失败,如果直接刷B,升级C却没有问题,那么这个原因是什么呢?这种情况理论上并不会删除cache跟目录,通过加日志,跟代码,发现fingerprint只是第一道关卡,后边即使cache目录不重建,apk也会逐个比对apk源文件和当前cache文件的时间戳先后,如果源文件更新则更新cache,因此这种情况就解释了为什么fingerprint一致,但也会apk更新成功的问题。

Mark it~~~~

这篇关于android OTA升级之后,apk崩溃无法启动的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1060554

相关文章

如何解决yum无法安装epel-release的问题

《如何解决yum无法安装epel-release的问题》:本文主要介绍如何解决yum无法安装epel-release的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不... 目录yum无法安装epel-release尝试了第一种方法第二种方法(我就是用这种方法解决的)总结yum

IDEA下"File is read-only"可能原因分析及"找不到或无法加载主类"的问题

《IDEA下Fileisread-only可能原因分析及找不到或无法加载主类的问题》:本文主要介绍IDEA下Fileisread-only可能原因分析及找不到或无法加载主类的问题,具有很好的参... 目录1.File is read-only”可能原因2.“找不到或无法加载主类”问题的解决总结1.File

宝塔安装的MySQL无法连接的情况及解决方案

《宝塔安装的MySQL无法连接的情况及解决方案》宝塔面板是一款流行的服务器管理工具,其中集成的MySQL数据库有时会出现连接问题,本文详细介绍两种最常见的MySQL连接错误:“1130-Hostisn... 目录一、错误 1130:Host ‘xxx.xxx.xxx.xxx’ is not allowed

无法启动此程序因为计算机丢失api-ms-win-core-path-l1-1-0.dll修复方案

《无法启动此程序因为计算机丢失api-ms-win-core-path-l1-1-0.dll修复方案》:本文主要介绍了无法启动此程序,详细内容请阅读本文,希望能对你有所帮助... 在计算机使用过程中,我们经常会遇到一些错误提示,其中之一就是"api-ms-win-core-path-l1-1-0.dll丢失

ubuntu系统使用官方操作命令升级Dify指南

《ubuntu系统使用官方操作命令升级Dify指南》Dify支持自动化执行、日志记录和结果管理,适用于数据处理、模型训练和部署等场景,今天我们就来看看ubuntu系统中使用官方操作命令升级Dify的方... Dify 是一个基于 docker 的工作流管理工具,旨在简化机器学习和数据科学领域的多步骤工作流。

Python的pip在命令行无法使用问题的解决方法

《Python的pip在命令行无法使用问题的解决方法》PIP是通用的Python包管理工具,提供了对Python包的查找、下载、安装、卸载、更新等功能,安装诸如Pygame、Pymysql等Pyt... 目录前言一. pip是什么?二. 为什么无法使用?1. 当我们在命令行输入指令并回车时,一般主要是出现以

防止SpringBoot程序崩溃的几种方式汇总

《防止SpringBoot程序崩溃的几种方式汇总》本文总结了8种防止SpringBoot程序崩溃的方法,包括全局异常处理、try-catch、断路器、资源限制、监控、优雅停机、健康检查和数据库连接池配... 目录1. 全局异常处理2. 使用 try-catch 捕获异常3. 使用断路器4. 设置最大内存和线

Android NDK版本迭代与FFmpeg交叉编译完全指南

《AndroidNDK版本迭代与FFmpeg交叉编译完全指南》在Android开发中,使用NDK进行原生代码开发是一项常见需求,特别是当我们需要集成FFmpeg这样的多媒体处理库时,本文将深入分析A... 目录一、android NDK版本迭代分界线二、FFmpeg交叉编译关键注意事项三、完整编译脚本示例四

Android与iOS设备MAC地址生成原理及Java实现详解

《Android与iOS设备MAC地址生成原理及Java实现详解》在无线网络通信中,MAC(MediaAccessControl)地址是设备的唯一网络标识符,本文主要介绍了Android与iOS设备M... 目录引言1. MAC地址基础1.1 MAC地址的组成1.2 MAC地址的分类2. android与I

使用easy connect之后,maven无法使用,原来需要配置-Djava.net.preferIPv4Stack=true问题

《使用easyconnect之后,maven无法使用,原来需要配置-Djava.net.preferIPv4Stack=true问题》:本文主要介绍使用easyconnect之后,maven无法... 目录使用easGWowCy connect之后,maven无法使用,原来需要配置-DJava.net.pr