无法实例化活动错误

27

我的一款 Android 应用程序拥有大约 100,000 用户,每周会有约10次通过 Google 的市场工具向我报告以下异常:

java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{org.rebm.asp/org.rebm.asp.MainActivity}:
  java.lang.ClassNotFoundException: org.rebm.asp.MainActivity in loader dalvik.system.PathClassLoader[/mnt/asec/org.rebm.asp-1/pkg.apk]
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2659)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2753)
at android.app.ActivityThread.access$2500(ActivityThread.java:129)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2107)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:143)
at android.app.ActivityThread.main(ActivityThread.java:4701)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:521)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.ClassNotFoundException: org.rebm.asp.MainActivity in loader dalvik.system.PathClassLoader[/mnt/asec/org.rebm.asp-1/pkg.apk]
at dalvik.system.PathClassLoader.findClass(PathClassLoader.java:243)
at java.lang.ClassLoader.loadClass(ClassLoader.java:573)
at java.lang.ClassLoader.loadClass(ClassLoader.java:532)
at android.app.Instrumentation.newActivity(Instrumentation.java:1021)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2651)
... 11 more

从网上搜寻来看,这个错误通常表示清单文件或包名称存在问题。然而,我无法在我的设备上或模拟器上复现此错误。我只通过市场工具知道了此错误。我得出的结论是这是一个罕见的错误,因为我知道很多人都在使用该应用程序,但没有任何评论表明它会崩溃。

有人知道问题可能出在哪里吗?或者我如何诊断它呢?


我刚刚注意到我的一个应用程序中出现了相同错误的第一次发生。很想知道是什么原因导致的。我将开始悬赏。 - Kon
哇,谢谢Kon。赏金似乎真的能激励人们回答一个已经一个月没有回复的问题!不幸的是,我在我的市场控制台上仍然持续收到这个错误信息,而且我还没有更接近找出问题所在或如何修复它。 - rbcc
这里有许多关于https://dev59.com/oG445IYBdhLWcg3wg6pm的讨论。 - Jett Hsieh
我也有这个问题,因为我在AndroidManifest中设置了android:installLocation=prefersExternal。 - Arnaud
我在我的应用程序中(超过200,000个用户)也遇到了这个问题,它似乎与SD卡有关。在清单中使用installLocation="auto"基本上不起作用。除此错误之外,有时我的应用程序图标会因为SD卡问题神秘地从用户主屏幕消失。SD卡安装在Android上存在问题,但仅影响少数用户,因此尚未修复。 - Fraggle
显示剩余2条评论
5个回答

15

您在问题中提供的堆栈跟踪证明了问题是由将应用移动到SD卡引起的:

java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{org.rebm.asp/org.rebm.asp.MainActivity}: java.lang.ClassNotFoundException: org.rebm.asp.MainActivity in loader dalvik.system.PathClassLoader[/mnt/asec/org.rebm.asp-1/pkg.apk]

正如您所看到的,应用程序路径包含/mnt/asec,这是Android安全应用程序挂载点。

为了验证是否由于Apps2SD引起此问题,您应该检查所有堆栈跟踪是否都包括指向应用程序路径的/mnt/asec目录。如果它们都是这样,那么您可以确定这是一个Apps2SD错误。

正如其他人所说,这些问题有时会因为加载应用程序时SD卡不可用或者SD卡上的asec分区损坏而导致。

您的应用程序是否以任何方式注册自己以在启动时运行,或者是系统在SD卡未挂载时尝试加载的某种小部件?如果是,请关闭将应用程序移动到SD卡的选项。


2
我可以确认我的所有堆栈跟踪(大约50个)都包含/mnt/asec行。这是一个游戏,因此在启动时不需要任何特殊处理。 - rbcc
1
有趣的回答。问题在于谷歌对这个问题没有任何回应... - ol_v_er

2

所有已发布的游戏都存在相同的“罕见”问题。

可能是安装到SD卡或将应用程序移动到SD卡,然后拆卸SD卡的问题。

另一个猜测是应用程序以某种方式被多次下载或安装。

我无法复制此问题,因此也无法确定问题所在。


我可以确认我所提问的应用程序已启用了移动到SD卡,并默认设置为执行此操作。 - rbcc

1

我遇到了这个问题,但不是在活动中。通过一个解决方法解决了:

ClassLoader myClassLoader = TroubleClass.class.getClassLoader();
Thread.currentThread().setContextClassLoader(myClassLoader);

1
你能解释一下这段代码的作用以及为什么你认为它会起作用吗? - rbcc
我并不是这个问题的真正专家,但似乎dalvik由于某些bug没有为一些类提供必要的类加载器。我不知道为什么会出现这个bug,但如果你明确地告诉它使用所需类的类加载器,问题就会消失。 - Vladimir Ivanov
这段代码应该放在哪里?错误似乎表明活动本身无法启动,因此我看不到可以放置代码的位置。 - rbcc
由于所有的活动都在UI线程中启动,您可以在发送意图之前尝试添加此代码。 - Vladimir Ivanov
我的应用程序是一个游戏,有一个单一的活动在启动时启动。我不知道如果活动本身似乎没有开始,我该在哪里添加这个代码。 - rbcc
1
尝试将其添加到类的静态块中。虽然如果找不到它,它就无法加载。 - Vladimir Ivanov

1
尝试以下链接:

{{link1:“无法实例化活动1”}}

{{link2:“无法实例化活动2”}}

{{link3:“添加资源和textview后强制关闭”}}


0

有时候,当你从eclipse和手机上安装应用程序时,它可能会正常工作,但是在市场上崩溃(发生在我身上),如果同样的事情也发生在你身上,那么你需要做两件事情才能摆脱这种情况。

  1. 清理项目并重新构建。(使用Project-Clean)
  2. 删除并重新包含库文件(如果有的话)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接