【问题标题】:Android Activity ClassNotFoundException - tried everythingAndroid Activity ClassNotFoundException - 尝试了一切
【发布时间】:2012-06-07 15:33:26
【问题描述】:

我刚刚将一个应用程序重构为一个框架库和一个应用程序,但现在当我尝试在模拟器中启动该应用程序时,我收到以下错误堆栈跟踪:

06-02 18:22:35.529: E/AndroidRuntime(586): FATAL EXCEPTION: main
06-02 18:22:35.529: E/AndroidRuntime(586): java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.matthewrathbone.eastersays/com.matthewrathbone.eastersays.EasterSimonSaysActivity}: java.lang.ClassNotFoundException: com.matthewrathbone.eastersays.EasterSimonSaysActivity in loader dalvik.system.PathClassLoader[/data/app/com.matthewrathbone.eastersays-1.apk]
06-02 18:22:35.529: E/AndroidRuntime(586):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2585)
06-02 18:22:35.529: E/AndroidRuntime(586):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
06-02 18:22:35.529: E/AndroidRuntime(586):  at android.app.ActivityThread.access$2300(ActivityThread.java:125)
06-02 18:22:35.529: E/AndroidRuntime(586):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
06-02 18:22:35.529: E/AndroidRuntime(586):  at android.os.Handler.dispatchMessage(Handler.java:99)
06-02 18:22:35.529: E/AndroidRuntime(586):  at android.os.Looper.loop(Looper.java:123)
06-02 18:22:35.529: E/AndroidRuntime(586):  at android.app.ActivityThread.main(ActivityThread.java:4627)
06-02 18:22:35.529: E/AndroidRuntime(586):  at java.lang.reflect.Method.invokeNative(Native Method)
06-02 18:22:35.529: E/AndroidRuntime(586):  at java.lang.reflect.Method.invoke(Method.java:521)
06-02 18:22:35.529: E/AndroidRuntime(586):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
06-02 18:22:35.529: E/AndroidRuntime(586):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
06-02 18:22:35.529: E/AndroidRuntime(586):  at dalvik.system.NativeStart.main(Native Method)
06-02 18:22:35.529: E/AndroidRuntime(586): Caused by: java.lang.ClassNotFoundException: com.matthewrathbone.eastersays.EasterSimonSaysActivity in loader dalvik.system.PathClassLoader[/data/app/com.matthewrathbone.eastersays-1.apk]
06-02 18:22:35.529: E/AndroidRuntime(586):  at dalvik.system.PathClassLoader.findClass(PathClassLoader.java:243)
06-02 18:22:35.529: E/AndroidRuntime(586):  at java.lang.ClassLoader.loadClass(ClassLoader.java:573)
06-02 18:22:35.529: E/AndroidRuntime(586):  at java.lang.ClassLoader.loadClass(ClassLoader.java:532)
06-02 18:22:35.529: E/AndroidRuntime(586):  at android.app.Instrumentation.newActivity(Instrumentation.java:1021)
06-02 18:22:35.529: E/AndroidRuntime(586):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2577)
06-02 18:22:35.529: E/AndroidRuntime(586):  ... 11 more

这通常意味着清单文件在某种程度上是错误的,但我已经仔细检查了我能想到的所有内容。

这是我的活动课:

package com.matthewrathbone.eastersays;

import android.os.Bundle;

import com.rathboma.simonsays.Assets.Season;
import com.rathboma.simonsays.SeasonPicker;
import com.rathboma.simonsays.SimonSaysActivity;

    public class EasterSimonSaysActivity extends SimonSaysActivity {

      @Override
      protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
      }

      @Override
      protected void onDestroy() {
        // TODO Auto-generated method stub
        super.onDestroy();
      }

      @Override
      public SeasonPicker getSeasonPicker() {
       return new SeasonPicker(){
        @Override
        public Season getSeason() {
          // TODO Auto-generated method stub
          return Season.EASTER;
        }
       };
      }
    }

如您所见,它在清单中正确列出:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.matthewrathbone.eastersays"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk android:minSdkVersion="7" android:targetSdkVersion="15" />

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >
        <activity
            android:name=".EasterSimonSaysActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

我不知道如何解决这个问题,如果有任何帮助,我将不胜感激。我已经扫描了许多关于 SO 的类似问题,但没有看到这种特殊行为。

更多信息:

  • 我已经检查了生成的 APK,并且该类在 classes.dex 文件
  • 我已尝试在 日食
  • 我尝试使用一个全新的设备映像,该映像没有 已经有 APK 的副本了
  • 我已将库项目更改为 一个普通的java,然后改回一个android项目,没有 区别
  • 将抽象的 SimonSaysActivity 添加到清单中没有任何区别。
  • 我尝试将每个依赖项都设为一个 android 库项目,并同步他们需要的 android 版本,但没有帮助

找到了解决方案(见下文)。致所有发布答案/评论的人:你们都摇滚,感谢帮助我解决问题!

看起来这是由 SDK 工具升级引入的。感谢以下 cmets 中的@Nick 提供此链接: http://iqadd.com/item/noclassdeffounderror-adt-fix

【问题讨论】:

  • 你的 Activity 是在库中还是在应用程序中?
  • 它在应用程序中。它扩展了库项目中的基础活动。
  • 你是用 ant 还是用 ADT 构建的?似乎dex文件不包含库类。
  • 该错误暗示您的活动位置是 com.matthewrathbone.eastersays.com.matthewrathbone.eastersays.EasterSimonSaysActivity - 显然不正确。尝试将包级别添加到库中不存在的项目包中,例如...eastersays.myapp.EasterSimonSaysActivity 并将 com.matthewrathbone.eastersays.myapp 指定为清单中的包。但不要将“myapp”级别添加到库中,以使清单中的项目路径与库框架路径不同。

标签: java android android-fragments classnotfoundexception android-library


【解决方案1】:

我花了一些时间玩自己的项目,在尝试运行我的主项目时,我能够复制您的问题并获得完全相同的异常堆栈跟踪,所以我认为这可能是原因:

和我想的一样,就是在Android主项目中如何引用你的Android库项目,一个简单的Eclipse配置设置。

错误的方式:
右键主项目,选择Properties -&gt; Java Build Path -&gt; Projects -&gt; Add...,这样在Android主项目的构建路径中添加Android库项目作为依赖项目,这样不行。如果在主项目中定义了所有需要的Android相关资源,编译时不会出现任何错误,但运行应用程序时会出现问题中描述的异常。

正确的方法:
右键主项目,选择Properties -&gt; Android,在Library部分,在此处添加您的Android库项目。查看官方开发指南Referencing a library project。这应该可以解决您的所有问题。另请注意,您必须使用相对路径引用实际的 Android 库项目,如 Library Project - Development considerations 中所述。

希望这会有所帮助。

【讨论】:

  • 你我的朋友是个天才。有趣的是,我总是以“错误的方式”包含一个库,并且它起作用了。所以当我重构为两个库时,我认为这是我做的不同的事情。你刚刚为我节省了好几个小时的工作时间。
  • 有趣的是,它以前可以工作,我猜升级我的 sdk 工具会改变行为。这是非常不明显的。
  • 是的,将 SDK 工具更新到 >ADT 17 会引入此错误,因为当前 ADT 版本处理库的方式发生了变化。签出:iqadd.com/item/noclassdeffounderror-adt-fix
  • 更新到 ADT 22 出现了类似的问题:stackoverflow.com/questions/16596969/…
  • 有人能告诉我在哪里可以找到Properties吗?我似乎在任何地方都找不到它。
【解决方案2】:

我已经测试了您提供的代码,它运行良好。 尝试将“扩展 SimonSaysActivity”更改为简单的“扩展 Activity”,并亲自查看它是否有效。

它不起作用的原因是 SimonSaysActivity 没有扩展 Activity(我认为你没有犯这个错误),或者构建路径的顺序是错误的。

要转到构建路径的顺序,请转到:

project->properties->Java build path->order and export .

我的基本顺序是:project src,project gen,android 4.0.3,android dependencies。

当您使用库时通常会出现此问题。

【讨论】:

  • 所以你是对的,如果我直接扩展 Activity 它可以工作。我的构建顺序与您的匹配,所以我找不到修复它的方法。还有其他想法吗?
  • 这真的很奇怪。尝试更新 sdk&adt。另外,请告诉我您的应用程序是否使用了多个库项目(或 jar 文件,或两者兼有)。如果是这样,请尝试使用构建路径的顺序(我会尝试将库放在前面)。另外,我还有一个问题:你是否创建了一个名为“Activity”的类,也许你已经扩展了它而不是 android 的类?
  • 有 2 个库项目,第二个(引擎)同时被 simonSays 和 android 项目所依赖。我已经尝试了构建顺序的每种组合,从 SimonSays 导出引擎项目。回答您的问题:我在任何地方都没有名为 activity 的课程。
  • 引擎是核心。其他项目应该使用它而不是相反。只有作为 android 项目的项目(意味着不是库项目)应该具有包含所有活动、服务等的 decleration 的清单...... android 库项目(当前)上的清单没有太多用途(有关详细信息,请参阅此:stackoverflow.com/a/10445630/878126
  • 他们必须有 .只是清单文件可能很短,几乎不包含任何内容。还要检查 project.properties 文件(在每个项目中),它的目标 sdk 是 15,因为这是当前的最新版本。如果你愿意,你可以PM我,我会修复项目。
【解决方案3】:

我刚刚将一个应用程序重构为一个框架库和一个应用程序。

我不完全确定你在这里想说什么,但你在这里使用“重构”这个词的事实让我相信你误解了图书馆项目的概念。


是什么库项目

库项目是包含共享源代码和资源的开发项目。其他 Android 项目可以引用该库项目,并在编译时将其编译后的源代码包含在其 .apk 文件中。

哪些库项目不是

库项目与标准 Android 项目的不同之处在于,您不能将其直接编译为单个 .apk 文件并在 Android 设备上运行。您不能将一个 Android 项目用作库项目,然后让另一个 Android 项目扩展该库项目。那样不行。


也就是说,我会调查你的图书馆项目的结构并确保你有set it up correctly。可以使用您的库来存储共享代码/资源,但是如果您的库试图表现得好像它是库项目本身中的一个单独的 .apk,那么您可能做错了什么。如果是这种情况,我相信会抛出ClassNotFoundException。为了解决这个问题,我只是从头开始构建库项目,而不是尝试将 Android 项目转换为库项目。这样可以防止您遇到小而烦人的错误。

如果您仍有问题,请随时发布更多代码。您还应该详细说明您的图书馆项目的结构(和目的)......为什么决定使用它,如何创建它等等。

【讨论】:

  • 是的,我绝对正确地处理了各个项目,正是我引用库项目的方式实际上导致了问题。不过感谢您的出色帮助!
  • np...值得一试,哈哈
【解决方案4】:

对于 Eclipse Kepler(Mac):Control-click 项目 -> Android 工具 -> 添加支持库

【讨论】:

  • 这为我解决了问题。仅包含 v4-support.jar 作为库不起作用。
【解决方案5】:

我正在处理的一个项目中遇到了这个问题,尽管我的情况不同。 如果有人仍然找不到解决问题的方法,请尝试检查:

在 Eclipse 中:

Project properties -> Java Build Path -> Source tab

您会在其中找到一个列表,其中包含所有要编译并放入生成的 apk 中的所有源文件夹以构建您的项目(以及 /gen)。典型的:

>MyProject/gen
>MyProject/src

您需要确定的是,在您的每个源文件夹中(不包括 /gen,因此在这种情况下只有 /src)项目 @ 987654323@ 指向默认输出文件夹,即MyProject/bin/classes。通过选择输出文件夹并从右侧按钮组中单击删除来执行此操作(这将使其指向默认文件夹)。

如果您看不到子项输出文件夹,请选中列表下方的“允许源文件夹的输出文件夹”

【讨论】:

    【解决方案6】:

    如果您遵循了所有提示(检查了私有库等)并且仍然存在错误。 在应用程序标签中检查您的清单中的这行代码

        android:hasCode="false" 
    

    删除它并快乐。 (我终于):)

    【讨论】:

    • 非常感谢!!这让我快疯了。这对我有用,我有一个虚拟的 MainActivity,它只是在加载一个 so。花了 2 天时间才找到您的评论!
    【解决方案7】:

    java中的classNotFoundException是java.lang.Exception的子类 并在 Java 虚拟机尝试加载特定类时出现 并且在类路径中找不到请求的类。

    阅读更多:http://javarevisited.blogspot.com/2011/08/classnotfoundexception-in-java-example.html#ixzz3yX3WBeFA

    尝试转到 Project -&gt; Properties -&gt; Java Build Path -&gt; Order &amp; Export 并为您的项目以及您在应用程序中使用的所有其他库项目检查确认 Android 私有库

    ClassNotFoundException如何处理

    1. 验证请求的类的名称是否正确,并且 适当的 .jar 文件存在于您的类路径中。如果没有,你必须 将其显式添加到应用程序的类路径中。
    2. 如果指定的 .jar 文件存在于您的类路径中,那么您的 应用程序的类路径被覆盖,您必须找到 您的应用程序使用的确切类路径。
    3. 如果异常是由第三方类引起的,你必须 识别引发异常的类,然后添加 类路径中缺少 .jar 文件。

    【讨论】:

      【解决方案8】:

      虽然这不适用于所有人,但我最近遇到了这个问题,因为我的项目无法与设备上存在的共享库链接。我忘记了specify in my manifest 我的应用程序&lt;uses-library&gt;

      【讨论】:

        【解决方案9】:

        从 bin 中移除 classes.dex 并重建项目

        【讨论】:

          【解决方案10】:

          SimonSaysActivity 使用/扩展了哪些接口或父类,它们在您使用的 Android 版本上是否可用?我遇到过类似的问题,我的 Activity 实现了一个在我使用的 Android 版本上不可用的 API 接口。

          在我的情况下,我的活动实现了仅在 API 14 中可用的接口 PopupMenu.OnDismissListener,但是当我在 2.3 设备上运行应用程序时,我收到了活动的 java.lang.NoClassDefFoundError 异常。

          【讨论】:

          • 所有版本都一样,android 2.2。
          【解决方案11】:

          我遇到了同样的问题,一天中的大部分时间都在尝试各种事情。该应用程序在从一台 pc 部署时运行 find ,但不在这台 pc 上。最后,它最终成为了一种缺失的 java 特性!奇怪的是它如何向我展示了 java 构建路径、订单/导出和所有这些,但还没有 java 特性。 :(希望这可以节省其他人很多时间

          【讨论】:

            【解决方案12】:

            @yorkw 提供的解决方案绝对正确。我还有一个问题,在其中一个布局文件中,我错误地提到了绝对名称。应该是的

            <android.support.v4.view.ViewPager xmlns:android="...
            

            其实我说的

            <android.support.v4.app.view.ViewPager xmlns:android="...
            

            解决这些问题后,效果很好。

            【讨论】:

              【解决方案13】:

              信不信由你,对我来说,解决方法是在尝试了至少 4 小时后,从我的项目中删除了旧版本 (2.0) 的谷歌分析库。当然,这个库的更新也可能是解决方案。 所以这可能是一个依赖 jar 版本控制问题。

              【讨论】:

                【解决方案14】:

                我遇到了这些类型的错误,我已经尝试了所有方法,但没有得到解决方案。然后我发现如果您使用库作为 aar 文件,那么您必须将 aar 库的所有依赖项添加到您的应用程序 gradle.build 文件中。如果有人没有找到解决方案,那么试试这个!

                【讨论】:

                  【解决方案15】:

                  我遇到了同样的问题。 但后来我检查了应用程序的当前结构。我发现旧的应用程序结构(我不知道它被android框架开发人员更改的时间)有一个文件夹名称"lib",现在是"libs"。 我将所有 jar 文件迁移到“libs”中,错误消失了。 我希望这可能对某人有所帮助:)

                  【讨论】:

                    猜你喜欢
                    • 2016-04-14
                    • 1970-01-01
                    • 2019-09-19
                    • 1970-01-01
                    • 1970-01-01
                    • 2018-04-24
                    • 2014-06-22
                    • 1970-01-01
                    • 2017-01-05
                    相关资源
                    最近更新 更多