我们的应用程序的1800名用户发生了这次崩溃,每月活跃用户数为1.2(根据Google Developer Console)。 非常罕见,但却发生了。
Android 4.1最多6个,但报告中没有Android 7.
BaseDexClassLoader中此ClassNotFoundException的本质可能是什么。 我们可以避免吗?
了java.lang.RuntimeException: 在android.app.LoadedApk.makeApplication(LoadedApk.java:572)at 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)at android.app.ActivityThread.main(ActivityThread.java:5637)at java.lang.reflect.Method.invoke(Method.java:0)at java.lang.reflect.Method.invoke(Method.java:372)at 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)at java.lang.ClassLoader.loadClass(ClassLoader.java:469)at android.app.Instrumentation.newApplication(Instrumentation.java:985)
在android.app.LoadedApk.makeApplication(LoadedApk.java:567)
答案 0 :(得分:15)
注意:以下答案可能不准确且无法验证, 因为这个异常在测试中模拟是非常不可能的 环境。如果某人有关于该主题的更多信息或者可能是 最终解决方案请在此发布。 如果这些信息被证明是假的,我会提前道歉,但这些信息是基于我的经验和对事物的理解
Android中有java.lang.ClassNotFoundException
的多种变体,其中大多数是由错误的Proguard配置引起的,IDE在构建期间没有正确关闭先前启动的设备实例等...
所有这些"正常" ClassNotFoundException
是可区分的,因为在异常的某些部分中存在与应用程序本身相关的内容,如:
java.lang.RuntimeException: Unable to instantiate application com.my.package.CustomApplication: java.lang.NullPointerException
或
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并在您的应用因更新而卸载和重新安装时尝试执行某些代码(如Receiver)的错误。
我认为这里发生的事情是:
- 已安装该应用
- 系统要启动您的某个组件(例如
<receiver>
)- 由于新的更新(此步骤应该只持续几秒钟),该应用程序已卸载
- 系统无法再查找您的应用并抛出您发布的错误
- 已安装更新,您的应用程序重新开始工作
醇>
这些因素的组合可以解释为什么你只有&#34;少数&#34;考虑到活跃用户总数而崩溃。
你能做些什么?我认为没什么,因为它是系统如何处理这种特殊情况的错误。多个相关问题之一中的This comment得出了相同的结论。
您可以尝试创建自定义ClassLoader
,您可以自行处理异常并在不崩溃应用的情况下以静默方式终止应用进程,这样您的用户就不会注意到任何事情(我不会&# 39;不知道用户是否真的注意到了这一点,也许它是系统处理的内部异常,而且用户什么也看不见。
您没有遇到针对Android 7的报告的事实可能表明他们已在最新的Android LoadedApk类
中修复了该问题PS:真诚地,我不认为这与多索引有关,但你可以进行一些测试以确保