无法实例化应用程序 - ClassNotFoundException

17

编辑:这个问题在其他建议的SO问题中尚未得到解决。

我已经在市场上发布了一个全功能应用程序一年多了,几乎没有崩溃报告。最近我把我的应用程序改成了库,以便可以包含在多个不同的“包装”项目中。这样我就可以轻松制作不同版本 - 免费版、付费版、非 Google 市场、有/无应用内购买等等。

新的“库+包装器”应用程序似乎工作正常。我可以多次运行它,没有错误。但是一天后(当操作系统可能关闭了部分或全部应用程序活动时),我尝试运行它,它报告了

Unable to instantiate application com.mycompany.mygamelibrary.MyGameApplicationClass: java.lang.ClassNotFoundException: com.mycompany.mygamelibrary.MyGameApplicationClass

它找不到的类是程序启动时运行的第一个类,名为MyGameApplicationClass - 它扩展了Application。这个类是库的一部分。

我怀疑两个清单文件中的其中一个存在问题。

wrapper 项目的清单包含以下行...

<application android:icon="@drawable/mygame_icon"
    android:screenOrientation="portrait" android:label="My Game Name"
    android:name="com.mycompany.mygamelibrary.MyGameApplicationClass">

有任何想法是什么出了问题吗?

编辑:根据yorkw在此SO问题的答案,“正确的方式”引用了该库。

编辑:目前我无法重现崩溃 :-( 我不知道当应用程序未使用一两天时操作系统会做什么。


另一个问题中的问题症状并不完全相同。此外,被标记的答案有3个反对票。 - Mick
你尝试过使用 android:name="MyGameApplicationClass" 吗? - Niranj Patel
你看过这个问题的被接受答案了吗:https://dev59.com/s2445IYBdhLWcg3wZJew?你能否发布更多信息 - 例如,现在是否一直失败? - IanB
13个回答

18
有两种可能性。要么像我一样,在您的清单文件中存在拼写错误。请让同事或朋友阅读以确保名称正确。要么您没有正确引用项目。
官方文档描述了如何在其文档中正确链接项目。
为什么它一开始似乎可以工作,后来停止工作是一个谜。然而,我猜测虚拟机可能仍然准备好了必要的引用,以很好地解决库中的类。虚拟机的重启删除了所有这些引用,并尝试解决它们是不成功的。 更新: 关于原始帖子中的编辑:确认您已正确引用其他项目后,您可以检查项目是否包含在APK中,以确保。您可以像打开任何其他存档文件一样重命名并打开APK(.rar对我来说效果很好)。有时,我遇到过这种情况,即项目未正确包含在APK中。通常清理工作区可以解决问题,根据您使用的内容,IDE重新启动也可能会解决问题。例如,在Eclipse中手动执行清理操作,请使用Project->Clean...或尝试通过右键单击项目并选择Android Tools->Fix Project Properties

由于您似乎还通过重新启动设备解决了问题,因此可能是库链接不正确。这是我从未见过的问题,但正如一个非常常见的引用所说:“您是否尝试关闭并重新打开它?”。


谢谢 - 对我有用,更新了我的ADT,重新引用了Google Play库并重新导出了APK。 - Anna Billstrom

17

对于Android Studio:

Build --> Clean Project

修复问题。


5

你尝试在“主”项目中创建MyGameApplicationClass的新子类,并将其设置为Manifest中的应用程序类了吗?


这是我会尝试的方法,也因为你使用了完全限定名来引用应用程序类,请确保在清单文件中的 Manifest 节点中没有定义包属性。 - Gomino

4
我在使用Android Studio 3.0 Canary 4时遇到了一系列错误,我通过编辑AndroidManifest.xml文件并将一些无意义的字符添加到应用程序名称中来解决这些问题。然后,我点击了构建按钮,显然又出现了一堆新的错误消息。我把名称改回原来的样子,再次构建应用程序,这次它就运行了。
有时候,我真不知道怎么办...
编辑:当我在我的笔记本电脑上切换时,我又遇到了Android Studio 3.0 Canary 4的这个问题。我再次按照相同的过程更改了AndroidManifest.xml文件,使其包含一个拼写错误,构建了应用程序,然后再更正拼写错误并重新构建,但没有起作用。
然后我注意到即时运行仍然启用着。通过进入设置(点击command + ,(逗号键)),并输入“instant run”,我成功地禁用了即时运行,构建应用程序,类未找到的错误消失了。
以下是我解决问题的步骤总结(适用于我):
1.使缓存失效/重启 2.清理项目 3.手动删除构建文件夹(需要在项目视图中进行) 4.故意更改AndroidManifest.xml文件中的内容,构建应用程序,观察错误,然后再次更正错误并构建应用程序 5.禁用即时运行
再次声明,这并不能解决所有人的错误,但我已经在两台不同的机器上(MacOS Sierra)使用了这些步骤的某种组合,并且问题已经得到解决。希望能对你有所帮助。

禁用即时运行对我有帮助。 - saintjab
我也是。我建议大家先“清理和构建”项目,如果不行,就“禁用即时运行”。 - BlueLeaf
使用Android Studio构建apk,然后使用adb install安装对我很有用。需要明确的是,我需要这样做来测试“应用程序更新”功能,而不是永久性安装。 - wamfous

2
在我的情况下,应用程序ID包名不匹配。这应该与以下图像中显示的相同...

AndroidManifest.xml

enter image description here

app/build.gradle

enter image description here

在这个例子中,你可以看到,applicationIdpackage都是相同的,即com.mycompany.mygamelibrary

拥有与应用程序ID不匹配的包名并没有什么问题。 - Stav Raviv
1
这就是为什么我写了“在我的情况下”。在你的情况下,可能会有所不同。 :) - User

1
同样的信息出现了...这一次输出文件夹MyApp/gen和MyApp/src在Build Path中不同(由Maven集成引起)。
取消选中“允许源文件夹的输出文件夹”解决了问题。

非常感谢!!我遇到了同样的问题,什么都无法解决。你的解决方案很有用! - GPrimola

1
也许这是一个构建路径配置问题。我按照以下步骤解决了这个问题:
1.右键单击您的项目,然后转到Java Build Path。
2.点击Order and Export选项卡。
3.检查Android Private Libraries和其他第三方库(如果您已添加)。
4.按下ok并清理项目。希望它能解决问题。

“Android私有库”已经在库和包装项目中进行了检查。 - Mick

1

我曾经遇到过同样的错误信息,但可能原因不同。

我写了一段代码,运行了一段时间,然后想要改进它,结果出现了同样的错误,无法运行。

我通过以下方式解决了问题:

  • 正确设置构建路径顺序(我看到你已经做到了这一点)
  • 检查“Order and Export”选项卡中的android-support-v4.jar
  • 关键是通过Android SDK Manager升级所有内容,然后在Eclipse中选择“Help”->“Check for updates”。

当我升级到最新的Android插件和SDK后,我的应用程序重新编译并运行了。

希望这能帮到你!


1
我不太确定,但可能是您系统中的debug.keystore许可证已过期,因为它只有365天的有效期。您只需要从计算机中删除debug.keystore即可。当您编译Android应用程序时,Eclipse会自动生成debug.keystore。

我制作的每个密钥库都设置了1000年的持续时间,但感谢您的建议。 - Mick

0

今天我遇到了这个问题。该项目已经运行了一年多,但今天报告了这个问题,并且无法在我的测试设备上进行调试。

通过更新到最新的gradle版本来解决它。希望这能解决你的问题。


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