我们在app启动时遇到非常奇怪的java.lang.ClassNotFoundException,这种情况发生在非常少量的客户(<1%)。我们从未在开发环境中看到它,我们无法理解这个问题的根源。以下是来自Google Play崩溃报告的堆栈跟踪。
java.lang.RuntimeException: Unable to instantiate application com.mycompany.myapplication.MyApplication: java.lang.ClassNotFoundException: com.mycompany.myapplication.MyApplication in loader dalvik.system.PathClassLoader[/mnt/asec/com.mycompany.myapplication-1/pkg.apk]
at android.app.LoadedApk.makeApplication(LoadedApk.java:490)
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:3784)
at android.app.ActivityThread.access$2200(ActivityThread.java:132)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1082)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:143)
at android.app.ActivityThread.main(ActivityThread.java:4268)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:507)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.ClassNotFoundException: com.mycompany.myapplication.MyApplication in loader dalvik.system.PathClassLoader[/mnt/asec/com.mycompany.myapplication-1/pkg.apk]
at dalvik.system.PathClassLoader.findClass(PathClassLoader.java:240)
at java.lang.ClassLoader.loadClass(ClassLoader.java:551)
at java.lang.ClassLoader.loadClass(ClassLoader.java:511)
at android.app.Instrumentation.newApplication(Instrumentation.java:972)
at android.app.LoadedApk.makeApplication(LoadedApk.java:481)
... 11 more
答案 0 :(得分:0)
如果问题仅发生在已签名的APK上,并且您使用Eclipse导出已签名的APK ...
在Eclipse中导出并签署APK之前关闭菜单中的以下设置[Project&gt;自动构建](然后可以在以后继续开发时将其重新打开)。
答案 1 :(得分:0)
我最近在我的应用中部署了一个更新,并且用户在第二天通过Google Play报告工具报告了崩溃。堆栈转储用于LoadApk(),错误是在我的Application类的加载中。这是转储:
java.lang.RuntimeException:无法实例化应用程序com.goalstate.WordGames.FullBoard.library.FullBoardApplication:java.lang.ClassNotFoundException:未找到类&#34; com.goalstate.WordGames.FullBoard。 library.FullBoardApplication&#34;在路径上: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.app.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) at java.lang.reflect.Method.invokeNative(Native Method) 在java.lang.reflect.Method.invoke(Method.java:515) 在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:1283) 在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1099) at dalvik.system.NativeStart.main(Native Method) 引起:java.lang.ClassNotFoundException:没找到类&#34; com.goalstate.WordGames.FullBoard.library.FullBoardApplication&#34;在路径上:DexPathList [[],nativeLibraryDirectories = [/ vendor / lib,/ system / lib]] 在dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:67) at java.lang.ClassLoader.loadClass(ClassLoader.java:497) at java.lang.ClassLoader.loadClass(ClassLoader.java:457) 在android.app.Instrumentation.newApplication(Instrumentation.java:981) 在android.app.LoadedApk.makeApplication(LoadedApk.java:511) ......还有11个
我有一个库,我的Application类在该库中定义。我的应用程序(使用该库)的清单以完整路径引用该库中的类。它没有自己的应用程序类。
我所有的内部测试都没有重现这个问题,即使我在同一台设备上测试(使用三星远程测试实验室)(实际上是两台不同的设备,一台运行4.3,一台运行4.4.4)报告了崩溃(Galaxy Note II,运行Android 4.4),没有问题。
在搜索有关这方面的信息时,我发现提到了这样一个事实:不同的设备可能有稍微不同的方法来解析类引用,这可能是为什么大多数设备对我的APK没有问题,但这个特定的设备(不同于我的测试设备,由Sprint提供其Android风格)。同样地,这可能就是为什么只有百分之一的客户遇到问题,而大多数客户都没有。
我认为最好的方法是尽可能简单地让一个简单的设备找到从我的清单文件中引用的类。所以,我在应用程序本身(而不是库)的包中定义了一个新的应用程序类,我让该类继承自我库中的应用程序类。否则新课程是空的。
然后我用库中的应用程序类替换了对应用程序本身创建的新类的相对引用的完整路径引用。所以,而不是:
<application android:name="com.goalstate.WordGames.FullBoard.library.FullBoardApplication"
在我的清单中,我有:
<application android:name=".FullBoardWordChumsApplication"
(根据民间传说中的这个主题)应该使不太复杂的解决方案过程更容易成功。
我还采用了我在清单中使用的完整路径来命名我已经本地的活动类并使其相对(通过简单地删除最后一个点之前的所有内容)。
在线发现的其他民间传说表明它可能有助于关闭&#34;自动构建&#34;对于Eclipse中的项目,然后退出Eclipse,重新进入Eclipse,然后在重建之后,直接转到Android Tools以导出已签名的APK(无需自动打开Build)。因此,在我的左肩上撒盐,并向分裂偏执的神灵祈祷,我在准备我的APK时放弃了这种迷信。
这有什么帮助吗?时间会证明,但到目前为止,我的更新版本没有产生任何额外的崩溃。
答案 2 :(得分:-1)
当您在应用程序标记中的清单文件中出现此错误时,您放置的任何类名称与您的编码java文件都不匹配。因此,请将当前两者都放在一起。