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

时间:2010-09-23 17:49:24

标签: android classnotfoundexception

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

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

25 个答案:

答案 0 :(得分: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" >

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

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

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

删除它,它应该工作:

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

答案 1 :(得分:14)

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

答案 2 :(得分:10)

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

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

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

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

答案 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 - selected
  6. 它解决了这个问题。希望这能帮到你们。

答案 4 :(得分:5)

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

答案 5 :(得分:4)

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

所以我收到了这个错误,几个小时之后,我羞怯地意识到我没有选中'Project&gt;自动构建'。因此,虽然我没有编译错误,但这就是我收到此错误的原因。一旦我意识到在部署之前我没有真正构建项目,一切都开始工作了: - /

嗯,这是我的故事: - )

答案 6 :(得分:4)

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

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

答案 7 :(得分: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 *;
}

答案 8 :(得分:3)

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

答案 9 :(得分:3)

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

答案 10 :(得分:3)

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

答案 11 :(得分:2)

在我的情况下,应用的图标导致错误:

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

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

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

答案 12 :(得分:2)

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

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

答案 13 :(得分:2)

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

答案 14 :(得分:2)

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

答案 15 :(得分:2)

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

概述一些可能的原因。

缺少图书馆

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

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

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

如果是这样,请查看以下问题&amp;我已经选择了答案。他们都有一个接受的答案。

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

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

AndroidManifest.xml配置错误

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

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

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

  

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

     

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

     

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

禁止:java.io.IOException:无法打开DEX文件

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

对以下SO问题Android Application ClassNotFoundException, Unable to instantiate application

进行了重要评论
  

看起来系统无法打开你的应用程序dex文件java.io.IOException:无法打开DEX文件,这是在你的任何类加载之前,所以它与你如何没有任何关系在Manifest中定义您的应用程序类。 - user2046264 Feb 27&#39; 14 at 2:25

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

Android to Unable to instantiate Application java.lang.ClassNotFoundException:列出了另一个进入该方向的错误报告,其中提到了SD卡提供的外部存储的角色。

  

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

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

这里的重点是网络和存储都是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

答案 16 :(得分:0)

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

答案 17 :(得分:0)

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

答案 18 :(得分: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>

答案 19 :(得分:0)

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

答案 20 :(得分:0)

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

在应用标记

中的AndroidManifest.xml下面添加以下行
android:label="@string/app_name"

这可能有助于某些人遇到同样的问题。

答案 21 :(得分:0)

在我的minifyEnabled文件中将false设置为build.gradle可以解决此问题。

release {
    minifyEnabled false
}

答案 22 :(得分:0)

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

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

答案 23 :(得分:0)

在Android Studio中对我有什么帮助: 重命名大型项目的包后,出现了此问题。 因此,我几乎完成了AS提供的所有工作,以正式清理和刷新该项目,并且该项目可以正常工作。我并不是说这是每个人的解决方案,以防万一您正在使用Android Studio。在Android Studio 3.5.1,Windows 10中完成。

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

答案 24 :(得分:-1)

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