首页 文章

BaseDexClassLoader中出现意外崩溃

提问于
浏览
7

这个崩溃发生在我们的应用程序的1800个用户中,每月有1.2个活跃用户(根据Google Developer Console) . 相当罕见,但它发生了 .

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

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

java.lang.RuntimeException:在Android.app.A.运行时,Android.app.A活动时,我在Android.app.ActivityThread.acle上运行android.app.Ao.T.Terread.access: :178)在Android.app.Loper.loop(Looper.java:194)上的android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1531)android.os.Handler.dispatchMessage(Handler.java:111)在android.app.ActivityThread.main(ActivityThread.java:5637)的java.lang.reflect.Method.invoke(Method.java:0)java.lang.reflect.Method.invoke(Method.java:372)at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:959)at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:754)引起:java.lang.ClassNotFoundException:at dalvik位于android.app.Instrumentation的java.lang.ClassLoader.loadClass(ClassLoader.java:469)的java.lang.ClassLoader.loadClass(ClassLoader.java:511)中的.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56) . newApplication(研究所rumentation.java:985)在android.app.LoadedApk.makeApplication(LoadedApk.java:567)

1 回答

  • 13

    注意:下面的答案可能不准确且无法验证,因为此异常在测试环境中进行模拟是非常不可能的 . 如果有人对该主题有更多信息或者可能是最终解决方案,请在此处发布 . 如果这些信息被证明是假的,我会提前道歉,但这些信息是基于我的经验和对事物的理解

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

    所有这些都是可以区分的,因为在异常的某些部分中存在与应用程序本身相关的内容,例如:

    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>)由于新的更新而卸载了应用程序(此步骤应该只持续几秒钟)系统无法再找到你的应用程序并抛出您发布的错误更新已安装,您的应用程序再次开始工作

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

    你能做些什么呢?我觉得什么都没有,因为这是系统如何处理这种特殊情况的错误 . This comment在多个相关问题之一中得出了相同的结论 .

    您可以尝试创建自定义 ClassLoader ,您可以自己处理异常并在不崩溃应用程序的情况下以静默方式终止应用程序进程,这样您的用户就不应该知道用户是否真的注意到了这一点,也许它什么都没有看到_1493887 )

    您没有遇到针对Android 7的报告的事实可能表明他们已经在最新的Android版本的LoadedApk类中解决了这个问题

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

相关问题