“无法实例化活动”错误
Posted
技术标签:
【中文标题】“无法实例化活动”错误【英文标题】:"Unable to instantiate activity" error 【发布时间】:2011-02-17 06:00:18 【问题描述】:我的一个 android 应用有大约 100,000 名用户,每周大约 10 次,我通过 Google 的市场工具向我报告了以下异常:
java.lang.RuntimeException: Unable to instantiate activity ComponentInfoorg.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
从网上搜索,这个错误通常表明清单文件和正在使用的包名有问题。但是,我无法在我自己的设备或模拟器上重现此错误。我只通过市场工具知道这个错误。我只能得出结论,这是一个罕见的错误,因为我知道很多人都在使用该应用,而且没有任何评论表明它会崩溃。
有谁知道问题可能是什么或我如何诊断它?
【问题讨论】:
我刚刚注意到我的一个应用程序第一次出现了相同的错误。很想知道是什么原因造成的。我开始赏金了.. 哇,谢谢康。赏金似乎真的能激励人们回答一个一个多月没有回复的问题!不幸的是,我仍然在我的市场控制台中不断收到此错误消息,而且我还没有接近找出问题所在或如何解决它。 我没有看到再次发生 - 只是发生过一次,但它仍然困扰着我。 这里有很多讨论***.com/questions/4820554/… 我也有这个,因为我在 AndroidManifest 中设置了 android:installLocation=prefersExternal 【参考方案1】:您在问题中提供的堆栈跟踪包含证明问题是由于将应用程序移至 SD 卡引起的:
java.lang.RuntimeException: 无法 实例化活动 组件信息org.rebm.asp/org.rebm.asp.MainActivity: java.lang.ClassNotFoundException: 加载程序中的 org.rebm.asp.MainActivity dalvik.system.PathClassLoader[/mnt/asec/org.rebm.asp-1/pkg.apk]
如您所见,应用程序的路径包含 /mnt/asec,这是 Android 安全应用程序挂载点。
为了验证此问题是否是由 Apps2SD 引起的,您应该检查您拥有的所有堆栈跟踪是否包含应用程序路径中的 /mnt/asec 目录。如果都是这样,您可以确定这是一个 Apps2SD 错误。
正如其他人所说,这类问题有时是由于在加载应用程序时 SD 卡不可用或 SD 卡上损坏的 asec 分区造成的。
您的应用程序是否以任何方式注册自己以在启动时启动,或者它是某种小部件,即使尚未安装 SD 卡,系统也会尝试加载?如果是这样,也许您应该关闭将应用程序移动到 SD 卡的选项。
【讨论】:
我可以确认我所有的堆栈跟踪(大约 50 个)都包含 /mnt/asec 行。这是一个游戏,所以它在启动时不需要任何特殊处理。 有趣的答案。问题是谷歌没有对此问题的回应......【参考方案2】:在所有已发布的游戏中都有相同的“罕见”问题。
安装到 SD 卡,或将应用程序移到 SD 卡,然后移除 SD 卡可能是问题。
其他猜测是该应用程序以某种方式被多次下载或安装。
我无法重现此内容,因此也无法确定。
【讨论】:
我可以确认我的问题中的应用程序已启用移动到 SD 并设置为默认执行移动。【参考方案3】:有几个建议可以帮助您调试应用程序。希望他们能解决你的问题。同时发布您的 Android Manifest XML 文件和 MainActivity 的 onCreate Method sn-p,以便我们也可以帮助您调试它并缩小可能性...
建议:
1) 在您的 Android XML 中,检查您的最低 Sdk 版本 (android:minSdkVersion="3") 是否为 3 ?如果将其更改为 7+ 。在处理罕见问题时,我发现这个技巧有时很有帮助。
2) 在您的 Android XML 中,检查您是否已在其中注册了 Activity。如果没有,请注册它,每个新活动都必须在使用前注册。如果您的活动已注册,请重新检查您提供给它的路径是否正确。
3) 清理项目并重新构建它,以便更新 R.java 并且不使用任何缓存文件。
4) 迁移您的项目,创建一个新项目并将所有文件复制到那里。它还解决了罕见的问题。
5) 根据一位用户的说法:
我刚刚在使用 Opera Mini 时遇到了同样的错误(无法实例化活动...)。 Opera Mini 在 SD 卡上(在应用设置中移至 SD 卡)。该错误似乎与我昨天更换了 SD 卡有关。设备已关闭,我将旧卡中的所有数据复制到新卡(使用 cp -a),然后插入新卡并再次启动设备。一切似乎都按预期工作,但我现在看到 SD 卡上的所有应用程序都崩溃并出现相同的错误。
Device: HTC Desire HD (Android 2.2)
Old SDHC card: SanDisk 8GB class 4
New SDHC card: Kingston 16GB class 4
所以我会说这是一个 Android 错误,不是应用开发者可以修复的。
另见:http://android-developers.blogspot.com/2010/07/apps-on-sd-card-details.html
It has always been the case that when you swap SD cards on an Android device, if you physically copy the contents of the old card to the new one, the system will use the data on the new card as if nothing had changed. This is also true of apps which have been installed on the SD card."
这似乎是不正确的。
希望其中之一能解决您的问题。
【讨论】:
【参考方案4】:我有这个问题,但不是活动。已通过解决方法修复:
ClassLoader myClassLoader = TroubleClass.class.getClassLoader();
Thread.currentThread().setContextClassLoader(myClassLoader);
【讨论】:
您能解释一下它的作用以及您认为它会起作用的原因吗? 我不是这个问题的真正专家,但由于某些错误,dalvik 似乎没有某些类的必要类加载器。我不知道为什么会出现这个错误,但如果你明确告诉他使用所需类的类加载器,问题就会消失。 这段代码应该放在哪里?该错误似乎表明活动本身无法启动,因此我看不到放置代码的地方。 由于所有活动都是在ui线程中启动的,您可以尝试在发送意图之前添加此代码。 尝试将它添加到你的类的静态块中。虽然如果找不到,则无法加载。【参考方案5】:试试下面的链接:
“Unable to instantiate activity 1”
“Unable to instantiate activity 2”
Force close after adding resources and textview
【讨论】:
【参考方案6】:当您从 eclipse 安装应用程序时,该应用程序可能在您的 eclipse 和移动设备上运行良好,但可能在市场上崩溃 >(发生在我身上),如果同样的事情发生在你身上,有 2 件事你需要做,你会摆脱这种情况。
-
清理项目并重建。 (使用 Project-Clean)
删除并重新包含库(如果有)。
【讨论】:
以上是关于“无法实例化活动”错误的主要内容,如果未能解决你的问题,请参考以下文章
无法实例化活动组件信息 - java.lang.ClassNotFoundException
java - Android Studio - 无法实例化活动
java.lang.RuntimeException:无法实例化活动 ComponentInfo:java.lang.ClassNotFoundException