【发布时间】: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