【问题标题】:java.lang.ClassNotFoundException on working app工作应用程序上的 java.lang.ClassNotFoundException
【发布时间】:2011-04-16 10:04:38
【问题描述】:

我创建并发布了我的第一个 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

知道是什么原因造成的吗?

【问题讨论】:

  • 您好,我已经通过 eclipse 导出,但里面没有看到任何类或 jar。哦,这个导出不起作用....我必须找出原因
  • 嗯,有文件classes.dex。它应该包含已编译的代码。正确的?文件在那里。那么为什么我会得到 ClassNotFoundException 呢?斯科基。
  • 你好,再考虑一下。错误说“java.lang.ClassNotFoundException:cz.teamnovak.droid.Novak ESC Track guide”->问题是我没有这样的课程。它以某种方式混淆了。 “Novak ESC Track guide”是应用程序的名称。请告知发生了什么。谢谢你,斯科基。
  • 对我来说这个话题解决了我的问题:stackoverflow.com/a/9827569/372838

标签: android classnotfoundexception


【解决方案1】:

是的,我遇到了同样的问题。因为我在manifest文件的application节点中指定了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" >

【讨论】:

  • android:name 如果您有自己的扩展 Application 的应用程序类是必需的。它是您的应用程序的名称,所以 android:name 对我来说似乎是正确的术语。但是,如果您不需要自己的应用程序类,我同意这是一种误导。
  • 这工作谢谢。 @RickNotFred,不过我很困惑。我过去通常这样做,并且没有遇到任何问题。我创建了一个类库并创建了一个基础应用程序类,我将在不同的项目中使用它,所以我扩展了这个类,我得到了这个错误。我该怎么办?
  • 如果我删除了 android:name 应用程序不会启动,并且没有错误
  • 我以前在我的应用程序中有 name 属性,它工作正常。然后我更新到 Android Studio 2.2.2,它不再工作了。我删除了 name 属性,现在它正在工作。这是什么原因造成的?
  • 我在应用程序标签中没有name 属性,但同样的错误。
【解决方案2】:

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

【讨论】:

  • 谢谢.. 我有同样的问题,并在阅读您的帖子后解决了问题。坚持下去……
  • 谢谢,问题解决了!我必须在 Rightclick Project->Build Path 中编辑库并将它们也设置为新的“libs”文件夹。
  • 我完全无法更新 Java 构建路径。这是在 Android Studio 中的什么位置?
【解决方案3】:

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

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

  2. 对于一些最常出现在日志中的类,类名被指定为com.test.Name,而本来应该是.Name

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

【讨论】:

  • 好收获。我也遇到了应用程序的名称属性问题,大多数设备在“MyApplicationSubclass”下工作得很好,但有些设备在启动时会崩溃。更改为“my.package.MyApplicationSubclass”解决了这个问题。一些版本/供应商在这些问题上对其他人更宽容。
  • 哇,你是正确的。我无法相信这一点。感谢您解决这个问题,但我认为这是 Google 应该解决的问题
【解决方案4】:

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

【讨论】:

  • 也为我工作,我不得不删除一些“@Override”注释。
【解决方案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 - 已选择

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

【讨论】:

  • 为我工作。谢谢:)
  • 如果上面的代码工作正常,请接受这个作为答案!
  • “属性”在哪里?
  • @MartinErlic 哈哈,它来自 Eclipse IDE,是 1800 年代的遗物
【解决方案6】:

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

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

嗯,这就是我的故事:-)

【讨论】:

    【解决方案7】:

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

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

    【讨论】:

    • .project 在哪里?
    • 仅在您使用 Eclipse 时适用。如果您使用的是 Android Studio / IntelliJ,则没有 .project。
    【解决方案8】:

    我有时会在 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 *;
    }
    

    【讨论】:

      【解决方案9】:

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

      【讨论】:

        【解决方案10】:

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

        【讨论】:

          【解决方案11】:

          确保在清单文件中 android:hasCode 未设置为 false。这就是为我解决问题的方法!

          【讨论】:

            【解决方案12】:

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

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

            【讨论】:

            • 项目检查器中的@bluemunch
            • 我明白了。我正在运行 Android Studio。这些说明是针对 Eclipse 的吗?如果是这样,我该如何在 Android Studio 中执行此操作?
            • @bluemunch 视情况而定。尝试stackoverflow.com/questions/17724642/… 或在 SO 上创建问题。
            【解决方案13】:

            在我的情况下,应用程序的 icon 导致了错误:

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

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

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

            【讨论】:

            • 这是针对与java.lang.ClassNotFoundException 相关的特定问题,还是您的错误是另一个错误?我一直试图弄清楚为什么我们的应用程序会发生这种情况,因为我们清楚地正确定义了它,但是直到今天再次查看才发现它没有发现任何有用的东西......我知道我们没有 LDPI 分辨率图标但我们支持 LDPI 设备(希望设备按比例缩小)。
            • 这是关于这个特定问题的,只在 hdpi 和 xhdpi 设备上进行了测试,我还没有为 ldpi 设备添加图标。我什至不确定这是否可以修复它,有时仍然会出现异常,并且通常会清理项目并再次构建修复它...
            【解决方案14】:

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

            【讨论】:

            • 我实现了自己的 isResumed() - 导致 ClassDefNotFoundException 的方法,因为它是 Android SDK 中的公共最终隐藏方法。只需重命名我的方法即可,并且再也不会抛出异常。
            【解决方案15】:

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

            【讨论】:

              【解决方案16】:

              我最近花了一些时间编写了一份类似的错误报告,该报告是通过 Play 商店错误报告给我的。

              一些可能原因的概述。

              缺少库

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

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

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

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

              unable to instantiate application - ClassNotFoundException Android Activity ClassNotFoundException - tried everything Android ClassNotFoundException

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

              AndroidManifest.xml 配置错误

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

              重要的是,此错误始终会阻止您的应用加载。它应该可以构建,但在第一次使用时会崩溃。

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

              不要使用 android:name 属性!除非你已经实施了 自定义应用程序对象。

              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

              【讨论】:

                【解决方案17】:

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

                【讨论】:

                • 你如何重新配置​​依赖关系?
                • 在 IDE 中。您必须转到项目配置并查看路径是否相同。即:也许您在一台 PC 中的 c:\users\me\blahblahblah 中有您的 dropbox/copy/gdrive 路径,但在另一台 PC 中,您在 d:\blahblahblah 中有它。您可以在每台机器上“克隆”所有内容,以便路径匹配,或者您必须每次在每台机器上修改项目。
                【解决方案18】:

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

                【讨论】:

                  【解决方案19】:

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

                  【讨论】:

                    【解决方案20】:

                    我有一个 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>
                    

                    【讨论】:

                      【解决方案21】:

                      我在 android os 版本 4.1.2 中遇到了同样的问题

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

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

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

                      【讨论】:

                        【解决方案22】:

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

                        release {
                            minifyEnabled false
                        }
                        

                        【讨论】:

                          【解决方案23】:

                          对我来说只是清理项目。

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

                          【讨论】:

                            【解决方案24】:

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

                            • Alex's answer
                            • 构建 > 清理项目
                            • 构建 > 重建项目
                            • 文件 > 与文件系统同步
                            • 文件 > 将项目与 Gradle 文件同步
                            • 文件 > 使缓存无效/重新启动

                            【讨论】:

                              【解决方案25】:

                              确保你有包裹

                              com.aaraf.demowithdoc //Your Package Name 
                              

                              com.aaraf.demowithdoc [您的包裹名称] 你的班级中是否有这个 java.lang.classnotfoundexception 发生

                              【讨论】:

                                【解决方案26】:

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

                                【讨论】:

                                  猜你喜欢
                                  • 1970-01-01
                                  • 1970-01-01
                                  • 2017-07-02
                                  • 1970-01-01
                                  • 2014-07-17
                                  • 2015-10-13
                                  • 1970-01-01
                                  • 2022-01-12
                                  • 1970-01-01
                                  相关资源
                                  最近更新 更多