当前位置: 首页 > news >正文

安卓应用启动崩溃的问题排查记录

文章目录

    • 场景一
      • 启动崩溃的报错信息:Caused by: java.lang.NoClassDefFoundError: Failed resolution of: Lcom/google/android/gms/ads/identifier/AdvertisingIdClient
      • 问题排查
    • 场景二
      • 启动崩溃的报错信息:android.content.res.Resources$NotFoundException: String resource ID #0xffffffff
      • 问题排查
    • 场景三
      • 启动崩溃的报错信息:java.lang.NoClassDefFoundError: Failed resolution of: Landroidx/lifecycle/ReportFragment$ActivityInitializationListener
      • 问题排查

场景一

启动崩溃的报错信息:Caused by: java.lang.NoClassDefFoundError: Failed resolution of: Lcom/google/android/gms/ads/identifier/AdvertisingIdClient

--------- beginning of crash
Caused by: java.lang.NoClassDefFoundError: Failed resolution of: Lcom/google/android/gms/ads/identifier/AdvertisingIdClient;

问题排查

问题比较明显,错误信息表明是类加载失败问题,特别是与Google Play服务广告标识符相关的类找不到。
这种问题最常见的原因是两个:
​1. ​缺少 Google Play 服务依赖​​
AdvertisingIdClient 属于 play-services-ads-identifier 库。若未在项目中引入该依赖,运行时无法找到该类。
​2. ​混淆配置错误​​
若启用代码混淆(ProGuard/R8),未正确保留 AdvertisingIdClient 相关类,导致类被意外移除。

查看构建APK的工程,确实缺少了依赖,添加依赖后可以解决。

dependencies {implementation 'com.google.android.gms:play-services-ads-identifier:18.0.1' // 使用最新稳定版
}

场景二

启动崩溃的报错信息:android.content.res.Resources$NotFoundException: String resource ID #0xffffffff

--------- beginning of crash
05-26 15:15:09.940 E/AndroidRuntime(25589): FATAL EXCEPTION: pool-5-thread-1
05-26 15:15:09.940 E/AndroidRuntime(25589): Process: com.company.demo, PID: 25589
05-26 15:15:09.940 E/AndroidRuntime(25589): android.content.res.Resources$NotFoundException: String resource ID #0xffffffff
05-26 15:15:09.940 E/AndroidRuntime(25589): 	at android.content.res.Resources.getText(Resources.java:471)
05-26 15:15:09.940 E/AndroidRuntime(25589): 	at android.content.res.Resources.getString(Resources.java:564)
05-26 15:15:09.940 E/AndroidRuntime(25589): 	at android.content.Context.getString(Context.java:762)
05-26 15:15:09.940 E/AndroidRuntime(25589): 	at com.heytap.mcssdk.manage.NotificatonChannelManager$1.run(ProGuard:29)
05-26 15:15:09.940 E/AndroidRuntime(25589): 	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1137)
05-26 15:15:09.940 E/AndroidRuntime(25589): 	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:637)
05-26 15:15:09.940 E/AndroidRuntime(25589): 	at java.lang.Thread.run(Thread.java:1012)

问题排查

这个 String resource ID #0xffffffff肯定是有问题的,0xffffffff 在Android中表示 ​​无效资源ID​​(十六进制值为 -1),正常的资源ID不会是这个样子。
当代码尝试通过 getString() 或其他资源获取方法传入此值时,系统会抛出 Resources$NotFoundException,因为该ID未关联任何有效字符串资源。
再详细看一下堆栈,除开系统库以外,搞破坏的对象就呼之欲出了。从at com.heytap.mcssdk.manage.NotificatonChannelManager$1.run(ProGuard:29)去网上查一下,发现这个是OPPO推送SDK的组件库。
回过头来查询我用到的OPPO推送SDK,查了下相关的jar包,确实有调用getString。再进一步看传入的参数是否无效,最后发现传入的参数取决于下述代码

Class<?> clazz = Class.forName(pkgName + ".R$string");
Field field = clazz.getField("app_name");
return field.getInt(null);

到这里我们基本可以确认,该问题是因为找不到我们应用包名下的app_name资源。查看apk的话,其实是有这个app_name的,所以我就在考虑是不是包名出现了什么问题。进一步查看,包名倒也是正常。
回过来重新捋一下,我近期主要的改动是使用了高版本的Unity引擎,导出的android工程结构有所改变。这大概率导致了这个问题的引入。
此时我反编译apk进行搜索R类的资源,发现app_name确实只出现在com.unity3d.launchers而没有在我自己的测试包名com.company.demo
去看android工程的build.gradle,发现确实是多了一个android.namespace被配置为了com.unity3d.launchers,把此处改成我自己的测试包名即可解决问题。


场景三

启动崩溃的报错信息:java.lang.NoClassDefFoundError: Failed resolution of: Landroidx/lifecycle/ReportFragment$ActivityInitializationListener

--------- beginning of crash
07-09 11:16:43.048 E/AndroidRuntime(  960): FATAL EXCEPTION: main
07-09 11:16:43.048 E/AndroidRuntime(  960): Process: com.company.demo, PID: 960
07-09 11:16:43.048 E/AndroidRuntime(  960): java.lang.RuntimeException: Unable to get provider androidx.startup.InitializationProvider: androidx.startup.StartupException: androidx.startup.StartupException: java.lang.NoClassDefFoundError: Failed resolution of: Landroidx/lifecycle/ReportFragment$ActivityInitializationListener;
07-09 11:16:43.048 E/AndroidRuntime(  960): 	at android.app.ActivityThread.installProvider(ActivityThread.java:7975)
07-09 11:16:43.048 E/AndroidRuntime(  960): 	at android.app.ActivityThread.installContentProviders(ActivityThread.java:7481)
07-09 11:16:43.048 E/AndroidRuntime(  960): 	at android.app.ActivityThread.handleBindApplication(ActivityThread.java:7239)
07-09 11:16:43.048 E/AndroidRuntime(  960): 	at android.app.ActivityThread.-$$Nest$mhandleBindApplication(Unknown Source:0)
07-09 11:16:43.048 E/AndroidRuntime(  960): 	at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2292)
07-09 11:16:43.048 E/AndroidRuntime(  960): 	at android.os.Handler.dispatchMessage(Handler.java:106)
07-09 11:16:43.048 E/AndroidRuntime(  960): 	at android.os.Looper.loopOnce(Looper.java:240)
07-09 11:16:43.048 E/AndroidRuntime(  960): 	at android.os.Looper.loop(Looper.java:351)
07-09 11:16:43.048 E/AndroidRuntime(  960): 	at android.app.ActivityThread.main(ActivityThread.java:8423)
07-09 11:16:43.048 E/AndroidRuntime(  960): 	at java.lang.reflect.Method.invoke(Native Method)
07-09 11:16:43.048 E/AndroidRuntime(  960): 	at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:584)
07-09 11:16:43.048 E/AndroidRuntime(  960): 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1013)

问题排查

这个表面看跟场景一就很像。根据提供的错误日志,崩溃原因是 ​​androidx.lifecycle.ReportFragment$ActivityInitializationListener 类未找到​​(java.lang.NoClassDefFoundError)。但是我看了一下,依赖是正常添加的,我的Demo也没有开混淆。
还是得靠万能的谷歌,搜到两个相关的内容。
(1)https://stackoverflow.com/questions/78503480/after-ranaming-package-in-android-studio-from-com-example-travelapp-to-com-compa
(2)https://issuetracker.google.com/issues/341688001

看起来跟依赖库的版本或者AGP的版本是相关的。尝试升级到更高的AGP版本之后,果然问题解决了。

http://www.dtcms.com/a/271944.html

相关文章:

  • 《Effective Python》第十三章 测试与调试——使用 Mock 测试具有复杂依赖的代码
  • 【笔记分享】集合的基数、群、环、域
  • Python毕业设计232—基于python+Django+vue的图书管理系统(源代码+数据库)
  • EXCEL_单元格中图片调整代码留存
  • 什么是Kibana
  • 【C++】第十四节—模版进阶(非类型模版参数+模板的特化+模版分离编译+模版总结)
  • 保姆级搭建harbor私有仓库与docker-ce教程与使用教程
  • 机器学习基础:从理论到实践的完整指南
  • 解锁医疗新视界:医患共决策时间轴AI可视化工具
  • Linux面试问题-软件测试
  • Web前端:table标签的用法与属性
  • 酒店IPTV系统:重塑数字化时代的宾客体验生态
  • 图计算怎么用?从数据到关系的魔力
  • 实时风险监控系统工具设计原理:2025异常检测算法与自动化响应机制
  • 深度学习中的激活函数
  • window显示驱动开发—XR_BIAS 和 BltDXGI
  • RISC-V:开源芯浪潮下的技术突围与职业新赛道 (二) RISC-V架构深度解剖(上)
  • 【网络】Linux 内核优化实战 - net.ipv4.tcp_moderate_rcvbuf
  • 文件系统子系统 · 核心问题问答精要
  • Redis持久化机制深度解析:数据安全的双保险
  • 机器学习12——支持向量机中
  • ElementUI:高效优雅的Vue.js组件库
  • Rust 简介
  • 工厂的神经进化—工业智能体重塑制造本质的技术革命与文明挑战
  • 【Linux】Rocky Linux 清华镜像源安装 GitLab
  • IT运维:远程协助工具TrustViewer,简单好用,免费用不受限制
  • Qt 信号槽的扩展知识
  • libimagequant 在 mac 平台编译双架构
  • 在 Mac 上安装 Java 和 IntelliJ IDEA(完整笔记)
  • CMD,PowerShell、Linux/MAC设置环境变量