Android Activity ClassNotFoundException-尝试了所有方法

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

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 内部,类中有一个条目 Dex 文件
  • 我试过把这个项目清理/建造在 日蚀
  • 我试过用一个全新的设备图像 上面已经有 APK 的副本了
  • 我把图书馆项目改成了 一个普通的 java,然后变回一个 android 项目,没有 不同
  • 将抽象 SimonSaysActivity 添加到清单中没有任何区别。
  • 我试过把每个依赖项都变成一个 android 库项目,并且同步它们所需要的 android 版本,但是没有用

找到了解决方案(见下文)。对每一个回复/评论的人: 你们都很棒,谢谢你们帮助我解决问题!

看起来这是通过 SDK 工具的升级引入的,感谢@Nick 在下面的评论中提供的链接: Http://iqadd.com/item/noclassdeffounderror-adt-fix

100453 次浏览

i've tested the code that you've given , and it works fine. try changing the "extends SimonSaysActivity " to simply "extends Activity " and see for yourself that it works .

the reason that it doesn't work is either SimonSaysActivity doesn't extend Activity (which i don't think you've made this mistake) , or the order of the build path is wrong .

to go to the order of the build path , go to :

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

my basic order is : project src , project gen , android 4.0.3 , android dependencies .

this problem usually occurs when you use libraries .

What interfaces or parent classes does SimonSaysActivity use/extend and are they available on the version of Android you're using? I've seen similar problems where my activity implemented an API interface that wasn't available on the version of Android I was using.

In my case my activity implemented the interface PopupMenu.OnDismissListener which is only available in API 14 but when I ran the app on my 2.3 device I received a java.lang.NoClassDefFoundError exception for the activity.

I've just refactored an app into a framework library and an application.

I'm not entirely sure what you are trying to say here, but the fact that you used the word "refactored" here leads me to believe that you are misunderstanding the concept of a library project.


What library projects are:

A library project is a development project that contains shared source code and resources. Other Android projects can reference the library project and include its compiled sources in their .apk files at compile time.

What library projects are not:

A library project differs from a standard Android project in that you cannot compile it directly to a single .apk file and run it on an Android device. You can't use an Android projects as a library project, and then have another Android project extend the library project. It doesn't work that way.


That said, I would investigate the structure of your library project and insure that you've set it up correctly. It's OK to use your library to store shared code/resources, but if your library is attempting to behave as if it were a separate .apk within the library project itself, then you've probably done something wrong. I believe a ClassNotFoundException would be thrown if this were the case. To fix the problem, I'd just build the library project from scratch, rather than attempting to convert the Android project to a library project. That'll prevent you from running into tiny, annoying bugs.

Feel free to post more code if you are still having trouble. You should also elaborate a bit more on the structure (and purpose) of your library project... why you decided to use one, how you created it, etc.

I spent some time play with my own project, and I am able to replicate your problem and get exactly the same exception stack trace when trying to run my main project, so I think this could be the cause:

Just like what I thought, it is all about how you reference your Android library project in the Android main project, a simple Eclipse configuration settings.

The Wrong Way:
Right click main project, choose Properties -> Java Build Path -> Projects -> Add..., this add the Android library Project as a dependency project in Android main project's build path, this does not work. If all required Android-related resources are defined in main project, you will not get any error at compile time, but when run the application, you get the exception described in the question.

The Correct Way:
Right click main project, choose Properties -> Android, in the Library section, add your Android library project here. Check out official dev guide Referencing a library project. This should fix all your problem. Also note that you have to use relative path reference the actual Android library project, as stated in the Library Project - Development considerations.

Hope this helps.

I had the same problem and wasted most of a day trying all sorts of things. The app ran find when deployed from one pc but not on this one pc. In the end it ended up being a missing java nature! Strange how it showed me java build paths, order/export and all that but yet didn't have a java nature. :( Hope this saves someone else a lot of time

If you followed all the hints (checked the private Libraries etc.) and still have the bug. Check your manifest for this Line of code in the application-tag

    android:hasCode="false"

Remove it and be happy. (I was finally) :)

For Eclipse Kepler(Mac): Control-click project -> Android Tools -> add support library

I was getting the same issue. But then i checked the current structure of the application.I found that older application structure(i don't know the time it is changed by android framework developers) has a folder name "lib" which is now "libs". I migrate my all jar files into "libs" and the error is gone. I hope this may help to someone :)

I had this problem with a project I was working on, though my case was different. If anyone out there still can't find the solution to their problem, try checking this:

In Eclipse:

Project properties -> Java Build Path -> Source tab

Inside you'll find a list with all the source folders to be compiled and put into the generated apk each time to build your project (and /gen). Tipically:

>MyProject/gen
>MyProject/src

What you'll want to be sure of is that inside each of your source folders (exclude /gen, so only /src in this case) the item Output folder is poiting to the default output folder, which is MyProject/bin/classes. Do this by selecting Output folder and clicking Remove from the right set of buttons (this will make it point to the default folder).

If you can't see the subitem Output folder, check "Allow output folders for source folders" right below the list

solution provided by @yorkw is absolutely correct. I had an additional issue, in one of the layout files, I had mentioned the absolute name incorrectly. It should have been

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

rather I had put it

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

after resolving these, it worked good.

classNotFoundException in Java is a subclass of java.lang.Exception and Comes when Java Virtual Machine tries to load a particular class and doesn't found the requested class in classpath.

Read more: http://javarevisited.blogspot.com/2011/08/classnotfoundexception-in-java-example.html#ixzz3yX3WBeFA

Try going to Project -> Properties -> Java Build Path -> Order & Export And Confirm Android Private Libraries are checked for your project and for all other library projects you are using in your Application.

How to deal with the ClassNotFoundException

  1. Verify that the name of the requested class is correct and that the appropriate .jar file exists in your classpath. If not, you must explicitly add it to your application’s classpath.
  2. In case the specified .jar file exists in your classpath then, your application’s classpath is getting overriden and you must find the exact classpath used by your application.
  3. In case the exception is caused by a third party class, you must identify the class that throws the exception and then, add the missing .jar files in your classpath.

Believe it or not, the fix for me was to remove the old version (2.0) of google analytics library from my project, after trying everything for at least 4 hours. Of course, an update of this library could be the solution also. So it could be a dependency jar versioning problem.

While this won't be applicable for everyone, I recently had this problem because my project was failing to link with a shared library present on the device. I had forgotten to specify in my manifest that my application <uses-library>.

remove classes.dex from bin and rebuild project

I was getting these type of error and i have tried everything but didn't get the solution. then i figured out if you are using library as aar file then you have to add all dependencies of your aar library to your app gradle.build file. if someone didn't figure out solution then try this!