工作应用程序的java.lang.ClassNotFoundException

问题描述 投票:51回答:24

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

知道是什么原因引起的吗?

android classnotfoundexception
24个回答
40
投票

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

你的Android Manifest文件可能看起来像这样:

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

Do not use the android:name attribute! unless you've implemented a custom Application object.

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

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

删除它,它应该工作:

<application 
    android:icon="@drawable/icon" 
    android:label="@string/app_name" 
    android:description="@string/help_text" >

3
投票

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


3
投票

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


2
投票

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

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


2
投票

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

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

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

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


2
投票

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


2
投票

未找到类错误显示您的类文件丢失。请转到“属性”>“Java构建路径”,如果发现缺少,请将包含java文件的包添加到“源”选项卡。然后构建您的项目。这将创建缺少的.class文件。


2
投票

我最近花了一些时间在一个类似的错误报告中,通过Play商店错误报告告诉我。

概述一些可能的原因。

Missing Library

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

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

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

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

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

Main Activity or Application not found

AndroidManifest.xml配置错误

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

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

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

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

应用程序:name属性与您的应用程序名称无关。这是要作为Application实例加载的特定类的名称。这就是为什么如果该类不存在则会得到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:中,其中提到了由SD卡提供的外部存储的角色。

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

如果您绝望地阅读该问题的所有答案,因为还列出了其他一些路径。想一想完整的包装规格,使用单身人士等等。

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

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

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

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

在我看来,错误发生在更新发布的时间更多。这可以支持用户获取应用程序更新的理论,下载此更新以某种方式被破坏。安装顺利,但第一次执行应用程序会导致错误(再次只是一个理论,未经测试)。

Other resources

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

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


0
投票

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


0
投票

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


0
投票

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


14
投票

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


0
投票

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

我发现我在.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>

0
投票

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

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

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

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


0
投票

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

release {
    minifyEnabled false
}

0
投票

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

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


-1
投票

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


10
投票

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

  1. 如果包名是com.test,那么活动名称应该是.ActivityName(带有一个前导点),而不仅仅是ActivityName
  2. 对于某些类,最常出现在日志中的类,类名称被指定为com.test.Name,而它应该是.Name

我想Android的许多实现都能成功处理这些小问题(这就是测试中从未发生异常的原因),而其他几个实例则抛出异常。


5
投票

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


5
投票

这是我对错误的观察。我最近将ADT更新为22.0.1。当我导入我之前的项目“E / AndroidRuntime(24807)时,我得到以下错误:引起: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 - 已选中

它解决了这个问题。希望这能帮到你们。


4
投票

我知道这个问题已得到解答,情况可能并非如此。但是我得到了这个错误,并认为我发布了为什么它可以对其他人有帮助。

所以我得到了这个错误,几个小时之后,我羞怯地意识到我已经取消选中了“Project> Build Automatically”。因此,虽然我没有编译错误,但这就是我收到此错误的原因。一旦我意识到在部署之前我没有真正构建项目,一切都开始工作了: - /

嗯,这是我的故事:-)


4
投票

升级到最新的ADT / SDK之后,今天遇到了这样的问题。我花了很长时间。检查我使用google-apis(用于地图),使用库,清理项目等。

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


4
投票

我有时会遇到这个问题。为我更正的是转到Project Properties / 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 *;
}

4
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.