2011-06-13 38 views
8

將完美工作的應用程序轉換爲庫(包括其Activity類!)後,我試圖通過簡單地超級庫活動來創建使用整個庫的應用程序:無法實例化活動...由ClassNotFoundException引發

package com.example.baseapp.paid; 

import android.os.Bundle; 
import com.example.baseapp.LibActivity; 


public class PaidActivity extends LibActivity { 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
    } 
} 

Eclipse構建這個新「重新設計的」沒有任何錯誤的應用程序,但是當我嘗試運行它,我得到一個異常:

FATAL EXCEPTION: main 
java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.example.baseapp.paid/com.example.baseapp.paid.PaidActivity}: java.lang.ClassNotFoundException: com.example.baseapp.paid.PaidActivity in loader dalvik.system.PathClassLoader[/data/app/com.example.baseapp.paid-1.apk] 
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2585) 
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679) 
    at android.app.ActivityThread.access$2300(ActivityThread.java:125) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033) 
    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: com.example.baseapp.paid.PaidActivity in loader dalvik.system.PathClassLoader[/data/app/com.example.baseapp.paid-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.newActivity(Instrumentation.java:1021) 
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2577) 
    ... 11 more 

我不知道爲什麼,這是因爲發生錯誤「未找到類」時e類就是構建的派生類(沒有錯誤!),現在正在嘗試運行。

如何解決此問題?

我錯過了什麼?

編輯(由@CaspNZ答題):

這是庫項目的AndroidManifest.xml:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
     package="com.example.baseapp" 
     android:versionCode="5" 
     android:versionName="1.1.2"> 
    <uses-sdk android:minSdkVersion="8" /> 

    <uses-permission android:name="android.permission.INTERNET"/> 
</manifest> 

這是應用程序的AndroidManifest.xml中使用庫項目:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
     package="com.example.baseapp.paid" 
     android:versionCode="5" 
     android:versionName="1.1.2"> 
    <uses-sdk android:minSdkVersion="8" /> 
    <uses-library android:name="AppLibrary" /> 

    <uses-permission android:name="android.permission.INTERNET"/> 

    <application android:icon="@drawable/icon"> 
     <activity android:name=".PaidActivity"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 
       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
     <activity android:name="com.example.baseapp.LibActivity" android:label="com.example.baseapp.LibActivity:string/rx_label"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 
       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
     <activity android:name="EditPreferences" 
       android:label="com.example.baseapp.LibActivity:string/app_name"> 
     </activity> 
    </application> 
</manifest> 

我將不勝感激任何暗示試圖解決這個,因爲這是我平生第一次tryi ng來使用一個庫項目,我不熟悉涉及到這個工作的「技巧」。

+1

你使用proguard嗎?你的班裏面有你的dex文件嗎? (您可以使用android發行版中的dexdump查找,classes.dex在您的apk中)。 – Snicolas 2011-06-13 01:21:02

+0

@Snicolas這是在調試模式,所以沒有ProGuard。我不知道(但)在dexdump中尋找什麼。然而,自從我發佈並發現Eclipse的重新分解在大多數時間對我來說都是有效的,但我也取得了一些進展,但也偶爾會對我產生影響,就像在這種情況下,它將一些垃圾注入到圖書館的AndroidManifest .XML。我解決了這個問題,但我仍然遇到了錯誤。 – an00b 2011-06-13 01:28:13

+0

@Snicolas這與我在[另一個線程]中實現第一個建議的嘗試有關(http://stackoverflow.com/questions/6324234/converting-an-existing-application-to-a-library)。我是否必須爲衍生應用程序複製庫的AndroidManifest.xml? – an00b 2011-06-13 01:32:19

回答

1

我終於解決了這個問題。事實證明,我在沒有正確設置這兩個項目的屬性2個關鍵設置:

  1. 在庫項目「是圖書館」 被檢查的某些原因。 我可以發誓,我檢查了它,但 知道下 Eclipse中的Android 開發環境如何異想天開可以,我懷疑它 被蝕(或ADT插件 )的一些小故障的結果聽之任之。
  2. 在應用程序項目中,I 忽略添加我的庫項目 作爲參考,通過Add... 按鈕。 (我可以怎麼笨?)

我希望像我這樣的其他新手會覺得這個信息很有幫助。有時,一個非常困難的問題調試,隱藏配置錯誤,當無辜的毫無戒備的強調程序員認爲這已經被照顧...

1

如果您在庫清單中而不是在應用程序清單中列出活動,則可能發生這種情況。沒有必要在庫清單中有<活動>標籤。 (例如,參見this thread。)

+0

感謝這些信息(我不知道這一點)。我將庫中的所有''和''移到派生應用程序的清單中,但仍然沒有運氣。我在黑暗中摸索着。 :( – an00b 2011-06-13 02:31:52

0

我在我的一個項目中有同樣的錯誤,並認爲我可以分享我如何修復我的。

在我的項目的某些時候,我必須更改我使用的所有我的Activity類所在的包名稱之一。當我這樣做時,我忘了更新AndroidManifest,這導致了我的錯誤。更新這個固定它。

10

對於任何更新爲ADT 22的人,請確保您已在Java構建路徑>訂單和導出選項卡中檢查了Android專用庫。欲瞭解更多信息,請閱讀this。這對我有用。也許很少有力量將用戶移動到Android Studio而不是Eclipse :))

+1

哦親愛的上帝,4個小時的戰鬥後來,我意識到我錯過了「甚至在最終的應用程序項目」部分。感謝這一點,讓我去重新閱讀正確,並解決我的問題。 – Ruddles 2013-05-17 09:28:24

+0

我有同樣的錯誤:**無法實例化活動ComponentInfo **和** java.lang.ClassNotFoundException:沒有找到類**。我正在擴展FragmentActivity。這對我有效 – vovahost 2013-05-23 14:38:59

+0

謝謝 - 解決了我的問題。就像一個很好的「升級」,把你所有的項目都拋出水面! – ccbunney 2013-07-10 20:05:40

相關問題