Android Activity ClassNotFoundException-尝试了一切


82

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

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文件中有一个条目
  • 我曾尝试在Eclipse中清理/构建项目
  • 我尝试使用全新的设备映像,但该映像上没有APK的副本
  • 我已将库项目更改为常规的Java,然后又更改为android项目,没有区别
  • 将抽象的SimonSaysActivity添加到清单没有区别。
  • 我尝试将每个依赖项都设为一个android库项目,并同步他们需要的android版本,但这样做没有帮助

找到了解决方案(见下文)。对于每个发表了答案/评论的人:你们都很高兴,感谢您帮助我解决问题!

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


1
您的活动是在图书馆还是应用程序中?
Jeshurun 2012年

在应用程序中。它扩展了库项目中的基础活动。
马修·拉斯伯恩

您使用ant还是ADT进行构建?似乎dex文件不包含库类。
Tomasz Gawel 2012年

该错误表明您的活动位置为com.matthewrathbone.eastersays.com.matthewrathbone.eastersays.EasterSimonSaysActivity-显然不正确。尝试将库级别不存在的项目包级别添加到项目包中,例如... eastersays.myapp.EasterSimonSaysActivity,并在清单中将com.matthewrathbone.eastersays.myapp指定为包。但是请不要在库中添加“ myapp”级别,以使清单中的项目路径与库框架路径区分开。
Gunnar Karlsson 2012年

Answers:


148

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

就像我的想法一样,这全都涉及到如何在Android主项目(一个简单的Eclipse配置设置)中引用Android库项目。

错误方法:
右键单击主项目,选择Properties -> Java Build Path -> Projects -> Add...,这会将Android库Project作为依赖项添加到Android主项目的构建路径中,此操作无效。如果在主项目中定义了所有必需的Android相关资源,则在编译时不会出现任何错误,但是在运行应用程序时,您会得到问题中所述的异常。

正确的方法:
右键单击主项目,选择Properties -> Android“库”部分中的,在此处添加您的Android库项目。查看官方开发指南,参考图书馆项目。这应该可以解决所有问题。还要注意,您必须使用相对路径引用实际的Android库项目,如“库项目-开发注意事项”中所述

希望这可以帮助。


1
你我的朋友是个天才。有趣的是,我总是以一种“错误的方式”包含一个库,并且它确实起作用。因此,当我将其重构为两个库时,我认为这是我做的不同的事情。您为我节省了数小时的工作时间。
马修·拉斯伯恩

有趣的是,它在工作之前,我猜测升级我的sdk工具会改变行为。这不是很明显。
马修·拉斯伯恩

3
是的,由于当前ADT版本处理库的方式发生了变化,因此将SDK工具更新为> ADT 17会导致此错误。检出:iqadd.com/item/noclassdeffounderror-adt-fix
Nick

2
更新至ADT 22时遇到了类似的问题:stackoverflow.com/questions/16596969/…–
Niels,

7
有人可以告诉我在哪里可以找到Properties吗?我似乎在任何地方都找不到。
jlively

8

我已经测试了您提供的代码,并且工作正常。尝试将“扩展SimonSaysActivity”更改为“扩展活动”,然后亲自查看它是否有效。

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

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

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

我的基本顺序是:项目src,项目gen,android 4.0.3,android依赖项。

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


所以你是对的,如果我直接扩展Activity的话,它会起作用。我的构建顺序与您的构建顺序相符,因此我找不到解决该问题的方法。还有其他想法吗?
Matthew Rathbone 2012年

真的很奇怪。尝试更新sdk&adt。另外,请告诉我您的应用程序使用了多个库项目(或jar文件,或两者)。如果是这样,请尝试按构建路径的顺序进行操作(我会尝试将库放在前面)。另外,我还有另一个问题:您是否创建了一个称为“活动”的类,也许您已经扩展了它而不是android中的一个?
Android开发人员

有2个库项目,第二个(引擎)由simonSays和android项目都依赖。我尝试了构建订单的所有组合,从SimonSays导出了引擎项目。回答您的问题:我在任何地方都没有所谓的活动课。
马修·拉斯伯恩

引擎是核心。其他项目应该使用它而不是相反。只有属于android项目的项目(不是库项目)应该具有包含所有活动,服务等内容的清单... android库项目(当前)上的清单没有太多用途(有关更多信息,请参见此信息:stackoverflow.com/a/10445630/878126
Android开发人员

1
他们一定有。只是清单文件可能非常短,几乎不包含任何内容。还要检查project.properties文件(在每个项目中)其目标sdk是15,因为这是当前的最新版本。如果您愿意,可以给我PM,我将修复项目。
Android开发人员

2

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

我不完全确定您要在这里说什么,但是您在此处使用“重构”一词的事实使我相信您误解了图书馆项目的概念。


什么库项目

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

哪些图书馆项目不是

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


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

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


是的,我绝对正确地对待了各个项目,正是我引用图书馆项目的方式才真正导致了问题。感谢您的大力帮助!
Matthew Rathbone 2012年

np ...值得一试,哈哈
Alex Lockwood 2012年

2

对于Eclipse Kepler(Mac):右键单击项目-> Android工具->添加支持库


这为我解决了。仅将v4-support.jar作为库包括在内不起作用。
2015年

2

尽管我的情况有所不同,但我正在从事的项目遇到了这个问题。如果那里的任何人仍然找不到解决问题的方法,请尝试检查以下内容:

在Eclipse中:

Project properties -> Java Build Path -> Source tab

在内部,您会找到一个列表,其中包含所有要编译的源文件夹,并在每次构建项目(和/ gen)时放入生成的apk中。提示:

>MyProject/gen
>MyProject/src

您需要确定的是,在每个源文件夹中(不包括/ gen,因此在这种情况下只有/ src)都将项目Output folder拖入默认的输出文件夹,即MyProject/bin/classes。为此,请选择“输出”文件夹,然后从右侧的按钮集中单击“删除”(这将使其指向默认文件夹)。

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


1

如果您遵循了所有提示(检查了私有库等),但仍然存在该错误。检查清单中的application-tag中的此代码行

    android:hasCode="false" 

删除它并感到高兴。(我终于):)


非常感谢!!这让我发疯。这对我有用,我有一个虚拟的MainActivity,正在加载一个。花了2天时间找到您的评论!
AdrianTut

1

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

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

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

如何处理ClassNotFoundException

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

1

尽管这不适用于所有人,但最近我遇到了这个问题,因为我的项目无法链接到设备上存在的共享库。我忘了在清单注明我的申请<uses-library>



0

SimonSaysActivity使用/扩展哪些接口或父类,并且它们在您使用的Android版本上可用?在我的活动实现的API接口在我所使用的Android版本上不可用时,我也遇到了类似的问题。

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


所有版本都相同,android 2.2。
马修·拉斯伯恩

0

我遇到了同样的问题,大部分时间浪费在尝试各种事情上。当从一台PC上部署但不在此PC上部署时,该应用程序运行查找。最后,它最终成为缺少的Java本质!奇怪的是它向我展示了Java构建路径,命令/导出以及所有这些,但还没有Java本质。:(希望这可以节省很多时间


0

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

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

而是我说了

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

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


0

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


0

我遇到了这类错误,我已经尝试了所有方法,但没有得到解决方案。然后我想出了如果您使用库作为aar文件,那么您必须将aar库的所有依赖项添加到您的应用gradle.build文件中。如果有人不知道解决方案,那就试试看!


-1

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.