53

我创建并发布了我的第一个 Android 应用程序。这很简单。它在模拟器和某些手机上运行良好,但出现此错误:

java.lang.RuntimeException: Unable to instantiate application cz.teamnovak.droid.Novak ESC Track guide: java.lang.ClassNotFoundException: cz.teamnovak.droid.Novak ESC Track guide in loader dalvik.system.PathClassLoader[/data/app/cz.teamnovak.droid-1.apk]
    at android.app.ActivityThread$PackageInfo.makeApplication(ActivityThread.java:649)
    at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4232)
    at android.app.ActivityThread.access$3000(ActivityThread.java:125)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2071)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:123)
    at android.app.ActivityThread.main(ActivityThread.java:4627)
    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: cz.teamnovak.droid.Novak ESC Track guide in loader dalvik.system.PathClassLoader[/data/app/cz.teamnovak.droid-1.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.newApplication(Instrumentation.java:942)
    at android.app.ActivityThread$PackageInfo.makeApplication(ActivityThread.java:644)
    ... 11 more

知道什么会导致这种情况吗?

4

26 回答 26

40

是的,我遇到了同样的问题。这是因为我android:name在清单文件的应用程序节点中指定了属性。

您的 Android 清单文件可能如下所示:

   <application 
       android:name="Novak ESC Track guide" 
       android:icon="@drawable/icon" 
       android:label="@string/app_name" 
       android:description="@string/help_text" >

不要使用android:name属性!除非您已经实现了自定义 Application 对象。

application:name属性与您的应用程序的名称无关。Application这是作为您的实例加载的特定类的名称。这就是为什么你会得到ClassNotFoundException如果该类不存在的原因。

对于应用程序的名称,请改用android:label同一应用程序节点上的属性。

删除它,它应该可以工作:

<application 
    android:icon="@drawable/icon" 
    android:label="@string/app_name" 
    android:description="@string/help_text" >
于 2011-02-22T19:34:55.233 回答
14

当我将构建目标更改为 3.2 时,发生了类似的事情。在四处挖掘之后,我发现 a 将 jar lib 文件夹命名为“lib”而不是“libs”。我只是将它重命名为 libs 并更新了 Java 构建路径上的引用,一切都恢复了。也许这会帮助某人......

于 2012-04-03T20:53:15.340 回答
10

我们有几个项目不时在 Android Market 上记录此问题。我在清单中发现了以下问题:

  1. 如果包名称是 com.test,那么活动名称应该是.ActivityName(带前导点),而不仅仅是ActivityName.

  2. 对于某些类,那些最常出现在日志中的类,类名被指定为com.test.Namewhile it should have been .Name

我猜Android的许多实现都成功地处理了这些小问题(这就是为什么在测试中从未发生异常的原因),而其他很少有人抛出异常。

于 2011-10-11T15:01:03.470 回答
5

这是我对错误的观察。我最近将 ADT 更新为 22.0.1。当我导入我以前的项目 “E/AndroidRuntime(24807): Caused by: java.lang.ClassNotFoundException: com.sherl.sherlockfragmentsapp.StartActivity in loader dalvik.system.PathClassLoader[/data/app/com. sherl.sherlockfragmentsapp-1.apk]"

然后我按以下方式更改了“属性->Java构建路径->顺序和导出”[由于论坛规则无法添加图像]

  1. Android 私有库 - 已选中
  2. Android 4.2.2 - 未选中
  3. Android 依赖项 - 已检查
  4. /src - 已选择
  5. /gen - 已选择

它解决了这个问题。希望这对你们有帮助。

于 2013-07-22T10:15:29.183 回答
5

有同样的错误:java.lang.RuntimeException:无法实例化活动(classnotfound)首先尝试更改为我工作的构建平台(2.3.3 -> 2.2 -> 2.3.3)。

于 2012-08-02T06:40:19.613 回答
4

我知道这个问题已经得到解答,但很可能并非如此。但是我遇到了这个错误,并想我会发布原因,以防它对其他人有帮助。

所以我收到了这个错误,几个小时后,我不好意思地意识到我没有选中“项目 > 自动构建”。因此,尽管我没有编译错误,但这就是我收到此错误的原因。当我意识到在部署之前我实际上并没有构建项目时,一切都开始工作了:-/

好吧,这就是我的故事:-)

于 2011-09-02T17:56:33.100 回答
4

升级到最新的 ADT/SDK 后,今天遇到了这种问题。花了我好一阵子。检查我是否使用了 google-apis(用于地图)、使用库、清理了项目等。

删除 .project 并添加一个新的(创建新的 android 项目)终于解决了。

于 2011-10-21T22:15:42.753 回答
4

当我在早期版本的 android 上运行我的应用程序时出现此错误。我认为SearchView向后兼容 Android 1.5,但它是在 3.0 中创建的。我从代码中删除了它的引用并且它起作用了。

于 2012-07-16T01:11:03.500 回答
4

eclipse有时会遇到这个问题。对我来说纠正它的是去项目属性/Android并将构建目标API更改为不同的版本并重新发布。我会发现它已更正,然后我可以将其更改回所需的构建目标。

或者

您可能需要检查您的proguard.cfg

假设您已正确链接您的库并且您的库项目具有您需要标记为导出的代码,您可能想要做的下一步是检查您的 proguard 设置并确保您没有剥离您需要的类。

在我让我的应用程序直接从 eclipse 运行到模拟器或设备后,我一直在努力解决这个问题。我遇到的问题是在应用程序发布(即通过 proguard)并在设备上运行后,它缺少项目中包含的类。他们不知何故被剥夺了。

当我尝试使用 IntelliJ 并切换回 eclipse 时,可能会导致我的问题。

这是对我有用的proguard文件:

-optimizationpasses 5
-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-dontpreverify
-verbose
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*

-keep public class * extends android.app.Activity
-keep public class * extends android.app.Application
-keep public class * extends android.app.Service
-keep public class * extends android.content.BroadcastReceiver
-keep public class * extends android.content.ContentProvider
-keep public class * extends android.app.backup.BackupAgentHelper
-keep public class * extends android.preference.Preference
-keep public class com.android.vending.licensing.ILicensingService

-keepclasseswithmembers class * {
    native <methods>;
}

-keepclasseswithmembers class * {
    public <init>(android.content.Context, android.util.AttributeSet);
}

-keepclasseswithmembers class * {
    public <init>(android.content.Context, android.util.AttributeSet, int);
}

-keepclassmembers enum * {
    public static **[] values();
    public static ** valueOf(java.lang.String);
}

-keep class * implements android.os.Parcelable {
  public static final android.os.Parcelable$Creator *;
}
于 2012-04-06T16:27:36.017 回答
3

Make sure that android:hasCode is not set to false in your manifest file. This is what solved the problem for me!

于 2011-11-16T19:24:41.927 回答
3

在我的情况下,我必须添加android:name=".activity.SkeletonAppActivity" 而不是android:name=".SkeletonAppActivity"在主要活动的清单文件中。 SkeletonAppActivity与应用程序类位于不同的包中。祝你好运!

于 2011-09-14T16:03:05.703 回答
2

就我而言,应用程序的图标导致了错误:

<application
    android:name="com.test.MyApp"
    android:icon="@drawable/myicon"

为什么?因为我只将图标放在“drawable”文件夹中,而且我使用的是高分辨率测试设备,所以它在文件夹“drawable-hdpi”中查找图标。如果它们不在“drawable-hdpi”中,则其他所有内容的默认行为是使用“drawable”中的图标。但是对于启动图标,这似乎无效。

所以解决方案是将图标的副本(当然名称相同)放在“drawable-hdpi”(或设备具有的任何支持的分辨率)中。

于 2012-06-11T14:41:00.013 回答
2

我使用了在我的一个活动中声明为“final”的超类型方法(特别是“isResumed()”方法)。仅在重新启动我的开发设备后,LogCat 中才会显示实际错误。

于 2012-07-30T13:51:01.287 回答
2

Class Not Found Error 表明您的类文件丢失。如果发现缺少,请转到 Properties > Java Build Path 并添加包含您的 java 文件的包到Source选项卡。然后构建你的项目。这将创建丢失的 .class 文件。

于 2012-08-02T05:40:20.297 回答
2

那么你有一个java.lang.ClassNotFoundException。这意味着应用程序运行时中缺少一个类。您应该检查是否已将所有库添加到构建路径中。

右键单击您的项目-> 属性-> java 构建路径-> 库,添加您的库或创建一个包含您的类并为您的库启用顺序导出。

于 2010-09-23T18:11:41.917 回答
2

我最近花了一些时间在一个类似的错误报告上,该报告是通过 Play 商店错误报告到达我的。

一些可能原因的概述。

缺少图书馆

由于我的应用程序在发布之前进行了测试,并且问题只发生在大约。每周一次,我很确定我的不是图书馆问题。如果您的系统上的构建失败并且使用 ADB 安装应用程序导致启动时出错,您应该朝这个方向思考。

如果这是本地问题,清理和构建您的项目可能会有所帮助,并确保您拥有最新版本的 SDK 和 IDE。

在这些情况下,触发错误的是应用程序的一类或应用程序中使用的库。这是与下一个点的重要区别,即找不到您的应用程序的入口点(具有主要意图的活动或您的自定义服务/应用程序对象)。

如果是这样,请查看我选择的以下问题和答案。他们都有一个公认的答案。

无法实例化应用程序 - ClassNotFoundException Android Activity ClassNotFoundException - 尝试了一切 Android ClassNotFoundException

未找到主要活动或应用程序

AndroidManifest.xml 配置错误

更像是一个初学者的错误,之前在其中一个关于 android 清单文件的答案中被引用了。

这里重要的是,这个错误总是会阻止你的应用程序加载。它应该构建但在第一次使用时崩溃。

我已经编辑了这个答案,这是重要的部分:

不要使用 android:name 属性!除非您已经实现了自定义 Application 对象。

application:name 属性与您的应用程序的名称无关。这是作为应用程序实例加载的特定类的名称。这就是如果该类不存在,您会得到 ClassNotFoundException 的原因。

对于应用程序的名称,请改用同一应用程序节点上的 android:label 属性。

抑制:java.io.IOException:无法打开 DEX 文件

现在变得有趣了!这是我通过 playstore 记录的堆栈跟踪的一部分。所以我可以创建一个构建并在我的设备上执行它而不会出现错误(而之前的所有错误都会阻止任何运行)。

对以下 SO 问题Android Application ClassNotFoundException, Unable to instantiate application做了重要评论

看起来系统无法打开您的应用程序 dex 文件 java.io.IOException:无法打开 DEX 文件,这是在您的任何类加载之前,所以它与您如何定义应用程序类没有任何关系清单。– user2046264 2014 年 2 月 27 日 2:25

这里重要的部分是抑制的 IOException。这表示 IO 操作失败。IO 操作的示例是网络和存储调用。

另一个指向该方向的错误报告在Android to Unable to instantiate Application java.lang.ClassNotFoundException:中列出,其中提到了 sdcard 提供的外部存储的作用。

其他一些类似的问题表明这可能是用户错误。“/mnt/asec/...”表示应用程序正在从 sdcard 运行。如果 SD 卡被移除,可能会导致此错误。3rd 方应用程序或 root 设备可能会将应用程序移动到 sdcard,即使清单不允许。

如果您不顾一切地阅读该问题的所有答案,因为还列出了一些其他路径。想想完整的包规范、单例的使用等等。

这里的重点是网络和存储都是IO。

对于我的具体情况,我检查了所有报告此错误的设备,发现它们都支持外部存储。因此,用户可以安装应用程序并将其移动到外部存储,移除 SD 卡并得到此错误(只是一个理论,未经测试)。

有关 installLocation 选项的更多信息,请参阅http://developer.android.com/guide/topics/data/install-location.html

我也考虑过网络。在 Play 商店报告的堆栈跟踪详细信息页面的顶部,您可以概览随着时间的推移发生的错误。

在我看来,这个错误更多地发生在更新发布的时候。这可以支持用户获取应用程序更新、下载此更新但不知何故损坏的理论。安装顺利,但应用程序的第一次执行导致错误(再次只是一个理论,未经测试)。

其他资源

最后 2 个可能对您有所帮助的非 SO 资源:

https://groups.google.com/forum/#!topic/android-developers/JC7_qqwBRjo https://code.google.com/p/android/issues/detail?id=72121

于 2015-05-08T13:44:04.093 回答
0

我有一个 ClassNotFoundException 指向我的 Application 类。

我发现我在我的.project中错过了 Java builder

如果您的buildSpec中缺少某些内容,请关闭 Eclipse,确保一切就绪并再次启动 Eclipse

        <buildSpec>
            <buildCommand>
                    <name>com.android.ide.eclipse.adt.ResourceManagerBuilder</name>
                    <arguments>
                    </arguments>
            </buildCommand>
            <buildCommand>
                    <name>com.android.ide.eclipse.adt.PreCompilerBuilder</name>
                    <arguments>
                    </arguments>
            </buildCommand>
            <buildCommand>
                    <name>org.eclipse.jdt.core.javabuilder</name>
                    <arguments>
                    </arguments>
            </buildCommand>
            <buildCommand>
                    <name>com.android.ide.eclipse.adt.ApkBuilder</name>
                    <arguments>
                    </arguments>
            </buildCommand>
    </buildSpec>
于 2013-01-15T13:26:26.340 回答
0

在我的情况下,当我将启动器活动移动到不同的包而不更新清单文件时会发生这种情况。

于 2012-11-02T05:05:33.117 回答
0

你是否在不同的环境中使用你的代码,比如说,通过使用 Dropbox 或类似的东西?您是否使用任何库或类似的库?共享工作区文件后我遇到了很多麻烦,我修复了它重新配置依赖关系。希望它可以帮助某人!

于 2011-09-06T21:36:46.423 回答
0

检查类中的包名是否与清单文件中的包名匹配。这对我有用

于 2012-03-27T11:21:22.457 回答
0

我在 android os 版本 4.1.2 中有同样的问题

将以下行添加到您在应用程序标记中的AndroidManifest.xml下方android:label="@string/app_name"

android:name="android.support.multidex.MultiDexApplication"

这可能会帮助有同样问题的人。

于 2016-11-03T18:30:45.023 回答
0

对我来说,这只是清理项目。

我清理了项目,然后再次运行。所有错误都消失了。

于 2018-09-11T11:31:07.400 回答
0

确保您有包裹

com.aaraf.demowithdoc //Your Package Name 

com.aaraf.demowithdoc [YOUR PACKAGE NAME] 在您的班级中,发生此java.lang.classnotfoundexception

于 2022-02-10T15:06:10.417 回答
0

在我的文件中设置minifyEnabled为我解决了这个问题。falsebuild.gradle

release {
    minifyEnabled false
}
于 2018-07-30T20:09:56.203 回答
0

在 Android Studio 的情况下对我有什么帮助: 重命名大型项目的包后出现问题。所以我几乎做了 AS 提供的所有东西来正式清理和刷新项目,它确实有效。我并不是说这是适合所有人的解决方案,以防万一您使用的是 Android Studio。在 Android Studio 3.5.1、Windows 10 中完成。

  • 亚历克斯的回答
  • 构建 > 清理项目
  • 构建 > 重建项目
  • 文件 > 与文件系统同步
  • 文件 > 使用 Gradle 文件同步项目
  • 文件 > 使缓存无效/重新启动
于 2019-11-05T08:24:22.983 回答
-2

对我来说,从 Eclipse 中“关闭”应用程序并“重新打开”项目,解决了这个问题。

于 2014-04-07T07:06:09.260 回答