BaseDexClassLoader 中意外崩溃

2023-11-21

这次崩溃发生在我们应用程序的 1800 个用户身上,每月活跃用户数为 1.2(根据 Google 开发者控制台)。 相当罕见,但它确实发生了。

Android 4.1 高达 6,但报告中没有 Android 7。

BaseDexClassLoader 中的 ClassNotFoundException 的本质是什么? 我们能避免吗?

java.lang.RuntimeException: 在 android.app.LoadedApk.makeApplication(LoadedApk.java:572) 处 android.app.ActivityThread.handleBindApplication(ActivityThread.java:4831) 在 android.app.ActivityThread.access 1500 美元(ActivityThread.java:178)
在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1531)
在 android.os.Handler.dispatchMessage(Handler.java:111) 处 android.os.Looper.loop(Looper.java:194) 位于 android.app.ActivityThread.main(ActivityThread.java:5637) 在 java.lang.reflect.Method.invoke(Method.java:0) 在 java.lang.reflect.Method.invoke(Method.java:372) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:959) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:754)

引起原因:java.lang.ClassNotFoundException:at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56) 在 java.lang.ClassLoader.loadClass(ClassLoader.java:511) 处 java.lang.ClassLoader.loadClass(ClassLoader.java:469) at android.app.Instrumentation.newApplication(Instrumentation.java:985)
在 android.app.LoadedApk.makeApplication(LoadedApk.java:567)


注意:下面的答案可能不准确且无法验证, 因为这个异常在测试中几乎不可能模拟 环境。如果有人有关于该主题的更多信息或者可能 最终解决方案请将其发布在这里。 如果这些信息被证明是错误的,我提前道歉,但它们是基于我的经验和对此事的理解

有多种变体java.lang.ClassNotFoundException在 Android 中,大多数是由错误的 Proguard 配置、IDE 在构建期间未正确关闭设备先前启动的实例等引起的......

这一切都是“正常”的ClassNotFoundException是可以区分的,因为在异常的某些部分有一些与应用程序本身相关的内容,例如:

java.lang.RuntimeException: Unable to instantiate application com.my.package.CustomApplication: java.lang.NullPointerException

or

java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.my.package/com.my.package.MyClass}: java.lang.ClassNotFoundException: Didn't find class "com.my.package.MyClass" on path: DexPathList[[zip file "/data/app/com.my.package-1.apk"],nativeLibraryDirectories=[/data/app-lib/com.my.package-1, /vendor/lib, /system/lib]]

虽然您面临的问题与您的应用程序完全无关,因为很明显没有引用您的应用程序组件。这是当您的应用因更新而卸载并重新安装时,系统加载 APK 并尝试执行某些代码(如接收器)的错误。

我认为这里发生的是:

  1. 该应用程序已安装
  2. 系统想要启动您的某个组件(例如<receiver>)
  3. 由于新的更新,该应用程序被卸载(此步骤应该只持续几秒钟)
  4. 系统无法再找到您的应用程序并抛出您发布的错误
  5. 更新已安装,您的应用程序再次开始运行

这些因素的结合可以解释为什么考虑到活跃用户总数,您只有“很少”的崩溃。

对此你能做什么?我认为没什么,因为这是系统处理这种特殊情况的错误。这条评论在多个相关问题之一具有相同的结论。

您可以尝试创建一个自定义ClassLoader您可以自己处理异常并默默地终止应用程序进程而不会使应用程序崩溃,这样您的用户不应该注意到任何事情(我不知道用户是否真的注意到这一点,也许这是由系统和用户什么也看不到)

您没有遇到 Android 7 的报告这一事实可能表明他们在最新的 Android 版本中修复了该问题加载的Apk class

PS:真诚地,我认为这与多重索引无关,但您可以执行一些测试来确定

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

BaseDexClassLoader 中意外崩溃 的相关文章

随机推荐

  • Android 测试分片

    谁能解释一下 android 中的测试分片意味着什么 如果有人可以分享任何教程将会非常有帮助 碎片这个词的意思是整体的一小部分 仅凭一个数字如何进行分片 我应该在什么基础上指定 shardIndex 定义如开发人员文档中所示 测试分片 测试
  • 如何在 Eclipse 中编辑 Maven 依赖项中的“.class”文件

    好的 我有我的 Java 项目 在项目资源管理器的 Maven 依赖项项目文件夹下 我遇到了jar文件夹 里面有一个 class文件 现在 我点击了Download Sources我可以查看 class文件作为 Java 文件 但我无法在
  • COM 如何选择如何编组接口?

    据我了解 在 COM 中实现编组的方法有以下三种 类型库编组 代理 存根编组 通过对象实现 IMarshal 现在该组件如何consumer 用户 选择使用哪一个 它是自行决定并使用首选方式 还是调用某些内置函数并为其解决问题 我目前遇到以
  • 从必需的文件扩展 Node.js 中的 Array.prototype

    我将以下内容保存在 test js 中 它成功地在浏览器中扩展了Array 但它似乎不适用于node和require 有人可以解释这里出了什么问题吗 function Array prototype max function return
  • Angularjs 中的记住我功能和令牌

    我正在寻找更好的方法来解决我的问题 我的登录表单上有记住我的功能 当用户单击记住我框时 我的 API 会向我发送令牌 我的问题是存储此令牌并在用户返回我的网站时再次对用户进行身份验证的最佳方法是什么 我以为 创建一个 Cookie 并在其中
  • R 中给定函数的包名称[重复]

    这个问题在这里已经有答案了 可能的重复 如何确定函数的名称空间 我不知道该怎么做 你如何知道 R 中某个函数的包名称 我想要一个函数 给出函数的名称 返回拥有它的包的名称 有什么建议吗 可能有更好的解决方案 但是find functionn
  • 获取列中仅出现一次的值的数量

    首先 如果相关的话 我正在使用 MySQL 尽管我认为解决方案可以跨数据库产品工作 我的问题是 我有一个带有单列的简单表格 该列没有任何约束 此列中有一些简单的数据 例如 a a b c d d 我需要获取只出现一次的值的数量 计数 从上面
  • malloc分配的内存的保护标志是什么?

    根据这个线程 分配的内存malloc至少有PROT READ PROT EXEC 否则所包含的函数无法执行 man malloc没有提到任何有关保护的内容 因此提出了这个问题 malloc 通常会返回具有读写权限的内存 某些体系结构 例如
  • h.264 视频无法在 iOS 上播放

    我有一个用 h 264 编码的视频文件无法在 iOS 上播放 我想知道原因 这是 HTML
  • Android 应用程序中的 C# .dll 库

    我目前正在使用 Monodroid 开发 Android 应用程序 我对电话应用程序相当陌生 因此对以下几件事感到困惑 Android 库的定义是什么 我使用 Mono 模板创建 Android 库 创建 Mono for Android
  • 什么时候需要延迟加载?

    我懒惰地加载我的所有成员 我这样做已经有一段时间了 并且只是认为延迟加载从表面上看是一件好事 假设我们有 public class SomeClass public int anInt public SomeReferenceType me
  • 如何包含 CEFSharp 所需的 VC++ 可再发行文件

    使用 CEFSharp 浏览器构建应用程序在我的计算机上运行良好 但在服务器上崩溃并出现以下错误 System IO FileLoadException 无法加载 CefSharp Core dll 导入的过程 我在互联网上看到过这个问题
  • XHTML 中是否有类似于“colgroup”的名为“rowgroup”的属性?

    下列w3c文件提及rowgroup http www w3 org TR html401 struct tables html h 11 2 6 http www w3 org TR html401 struct tables html r
  • 如何在 VB6 中设置完整的内部版本号(Major.Minor.Build.Revision)

    How to set the complete version number from vb6 VPIaccessMaker vbg from Visual Basic i can set Major Minor Revision as 3
  • 像 Craigslist 一样的电子邮件转发 - Rails

    我正在尝试做 craigslist 的匿名电子邮件所做的事情 但使用 Rails 而且价格也便宜 对我来说 能够向电子邮件添加标头非常重要 这就是基本电子邮件转发不起作用的原因 我想到的一种方法是使用 SMTP 服务器 每当我通过 POP
  • 如何使用SQLAlchemy在SQLite上创建全文搜索索引并进行查询?

    我正在创建一个可以执行基本操作的简单应用程序 SQLite用作数据库 我想执行通配符搜索 但我知道它的性能很差 我想尝试全文搜索 但我无法完整提供示例 怎么做 我确认 SQLite 有全文搜索支持 这是我的示例代码 from flask s
  • 导入带有参数的 python 脚本

    我有脚本 移动1 py def move print walk 移动2 py def move print run And man py 可以接受通过参数参数 moving1 或 moving2 脚本来执行操作 man py import
  • Android gradle 插件 multidex ZipException [重复]

    这个问题在这里已经有答案了 我正在尝试使用新的 multidex 选项 但出现以下错误 Execution failed for task packageAll Variant TestClassesForMultiDex gt java
  • rake asset:预编译未定义的方法目录?对于 nil:NilClass

    在尝试对生产网站进行资产 预编译时 我第一次遇到此错误 rake assets precompile undefined method directory for nil NilClass 我之前已经成功更新过网站并做过多次资产 预编译 完
  • BaseDexClassLoader 中意外崩溃

    这次崩溃发生在我们应用程序的 1800 个用户身上 每月活跃用户数为 1 2 根据 Google 开发者控制台 相当罕见 但它确实发生了 Android 4 1 高达 6 但报告中没有 Android 7 BaseDexClassLoade