我最近为我的应用程序部署了更新,第二天就有用户通过 Google Play 报告工具报告了崩溃。堆栈转储用于 LoadApk(),错误出现在我的 Application 类的加载中。这是那个转储:
java.lang.RuntimeException:无法实例化应用程序 com.goalstate.WordGames.FullBoard.library.FullBoardApplication:java.lang.ClassNotFoundException:在路径上找不到类“com.goalstate.WordGames.FullBoard.library.FullBoardApplication”:DexPathList [[],nativeLibraryDirectories=[/vendor/lib, /system/lib]] 在 android.app.LoadedApk.makeApplication(LoadedApk.java:516) 在 android.app.ActivityThread.handleBindApplication(ActivityThread.java:4703) 在 android .app.ActivityThread.access$1600(ActivityThread.java:175) 在 android.os.ActivityThread$H.handleMessage(ActivityThread.java:1368) 在 android.os.Handler.dispatchMessage(Handler.java:102) 在 android.os .Looper.loop(Looper.java:146) 在 android.app.ActivityThread.main(ActivityThread.java:5602) 在 java.lang.reflect.Method.invokeNative(Native Method) 在 java.lang.reflect.Method。在 dalvik 的 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1099) 的 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1283) 调用(Method.java:515) .system.NativeStart.main(Native Method) 原因:java.lang.ClassNotFoundException:在路径上找不到类“com.goalstate.WordGames.FullBoard.library.FullBoardApplication”:DexPathList[[],nativeLibraryDirectories=[/vendor /lib, /system/lib]] 在 dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:67) 在 java.lang.ClassLoader.loadClass(ClassLoader.java:497) 在 java.lang.ClassLoader.loadClass(ClassLoader. java:457) 在 android.app.Instrumentation.newApplication(Instrumentation.java:981) 在 android.app.LoadedApk.makeApplication(LoadedApk.java:511) ... 11 更多在 dalvik.system.NativeStart.main(Native Method) 的 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1099) 运行(ZygoteInit.java:1283) 原因:java.lang.ClassNotFoundException: 没有' t 在 dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java 的路径:DexPathList[[],nativeLibraryDirectories=[/vendor/lib, /system/lib]] :67) 在 java.lang.ClassLoader.loadClass(ClassLoader.java:497) 在 java.lang.ClassLoader.loadClass(ClassLoader.java:457) 在 android.app.Instrumentation.newApplication(Instrumentation.java:981) 在 android .app.LoadedApk.makeApplication(LoadedApk.java:511) ... 11 更多在 dalvik.system.NativeStart.main(Native Method) 的 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1099) 运行(ZygoteInit.java:1283) 原因:java.lang.ClassNotFoundException: 没有' t 在 dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java 的路径:DexPathList[[],nativeLibraryDirectories=[/vendor/lib, /system/lib]] :67) 在 java.lang.ClassLoader.loadClass(ClassLoader.java:497) 在 java.lang.ClassLoader.loadClass(ClassLoader.java:457) 在 android.app.Instrumentation.newApplication(Instrumentation.java:981) 在 android .app.LoadedApk.makeApplication(LoadedApk.java:511) ... 11 更多ClassNotFoundException:在 dalvik.system.BaseDexClassLoader.findClass 的路径:DexPathList[[],nativeLibraryDirectories=[/vendor/lib, /system/lib]] 上找不到类“com.goalstate.WordGames.FullBoard.library.FullBoardApplication” (BaseDexClassLoader.java:67) 在 java.lang.ClassLoader.loadClass(ClassLoader.java:497) 在 java.lang.ClassLoader.loadClass(ClassLoader.java:457) 在 android.app.Instrumentation.newApplication(Instrumentation.java: 981) 在 android.app.LoadedApk.makeApplication(LoadedApk.java:511) ... 11 更多ClassNotFoundException:在 dalvik.system.BaseDexClassLoader.findClass 的路径:DexPathList[[],nativeLibraryDirectories=[/vendor/lib, /system/lib]] 上找不到类“com.goalstate.WordGames.FullBoard.library.FullBoardApplication” (BaseDexClassLoader.java:67) 在 java.lang.ClassLoader.loadClass(ClassLoader.java:497) 在 java.lang.ClassLoader.loadClass(ClassLoader.java:457) 在 android.app.Instrumentation.newApplication(Instrumentation.java: 981) 在 android.app.LoadedApk.makeApplication(LoadedApk.java:511) ... 11 更多ClassLoader.loadClass(ClassLoader.java:457) at android.app.Instrumentation.newApplication(Instrumentation.java:981) at android.app.LoadedApk.makeApplication(LoadedApk.java:511) ... 11 更多ClassLoader.loadClass(ClassLoader.java:457) at android.app.Instrumentation.newApplication(Instrumentation.java:981) at android.app.LoadedApk.makeApplication(LoadedApk.java:511) ... 11 更多
我有一个库,我的 Application 类是在该库中定义的。我的应用程序(使用该库)的清单通过其完整路径引用了该库中的类。它没有自己的应用程序类。
我所有的内部测试都没有重现这个问题,甚至当我在同一台设备(实际上是两台不同的设备,一台运行 4.3,一台运行 4.4.4)上进行测试(使用三星远程测试实验室)时,报告崩溃(一台 Galaxy Note II,运行 Android 4.4),没有问题。
在搜索这方面的信息时,我发现提到不同的设备可能有稍微不同的方法来解决类引用,这可能就是为什么大多数设备对我的 APK 没有问题,但是这个特定的设备(与我的测试设备不同,由 Sprint 提供了它的 Android 风格)确实如此。同样,这可能就是为什么您自己的客户中只有 1% 有问题,而大多数没有。
我决定最好的方法是让即使是简单的设备也尽可能容易地找到从我的清单文件中引用的类。因此,我在应用程序本身的包(而不是库)中定义了一个新的应用程序类,并且我让该类从我的库中的应用程序类继承。否则,新班级是空的。
然后,我将库中对应用程序类的完整路径引用替换为对我在应用程序本身中创建的新类的相对引用。所以,而不是:
<application android:name="com.goalstate.WordGames.FullBoard.library.FullBoardApplication"
在我的清单中,我有:
<application android:name=".FullBoardWordChumsApplication"
这(根据有关该主题的民间传说)应该使不太复杂的解决过程更容易成功。
我还采用了我在清单中使用的完整路径来命名我已经本地的活动类并使其相对(通过简单地删除最后一个点之前的所有内容)。
网上找到的其他民间传说表明,在 Eclipse 中关闭项目的“自动构建”可能会有所帮助,然后退出 Eclipse,重新进入 Eclipse,然后在重新构建后,直接进入 Android 工具导出已签名的 APK(无需曾经打开自动构建)。因此,在我的左肩上撒盐,并向碎片妄想之神祈祷,我在准备发布我的 APK 时接受了这种迷信。
这真的有帮助吗?时间会证明一切,但到目前为止,我的更新版本还没有产生任何额外的崩溃。