2015-02-10 46 views
4

我有一個帶有Android 21的Nexus 5設備。我正在測試我的項目,沒有任何問題。但是,如果我使用Google API 19在模擬器上測試,則會顯示錯誤java.lang.NoClassDefFoundError。如果在棒棒糖上運行良好,會出現這種錯誤?我甚至用一臺索尼4.4設備詢問了我的朋友,並且他的手機也發生了故障。我有我的編譯SDK版本爲21和生成工具設置爲21.1.2。我嘗試了gradle clean,並且正在開發Android Studio。任何幫助將不勝感激。Android版本低於Lollipop的java.lang.NoClassDefFoundError

只能在比棒棒堂較低的設備會出現此錯誤:

這是出現在logcat中:

02-10 07:46:19.200 2238-2238/com.myproject.android.indonesia E/AndroidRuntime﹕ FATAL EXCEPTION: main 
    Process: com.myproject.android.indonesia, PID: 2238 
    java.lang.NoClassDefFoundError: com.myproject.android.indonesia.task.GetProjectTask$1 
      at com.myproject.android.indonesia.task.GetProjectTask.execute(GetProjectTask.java:27) 
      at com.myproject.android.indonesia.activity.SplashActivity.launchProjectTask(SplashActivity.java:111) 
      at com.myproject.android.indonesia.activity.SplashActivity.onCreate(SplashActivity.java:71) 
      at android.app.Activity.performCreate(Activity.java:5231) 
      at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087) 
      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2159) 
      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245) 
      at android.app.ActivityThread.access$800(ActivityThread.java:135) 
      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196) 
      at android.os.Handler.dispatchMessage(Handler.java:102) 
      at android.os.Looper.loop(Looper.java:136) 
      at android.app.ActivityThread.main(ActivityThread.java:5017) 
      at java.lang.reflect.Method.invokeNative(Native Method) 
      at java.lang.reflect.Method.invoke(Method.java:515) 
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779) 
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595) 
      at dalvik.system.NativeStart.main(Native Method) 

這裏是調用getProjectTask()

GetProjectTask mGetProjectTask = new GetProjectTask(this); 
mGetProjectTask.mUrl.append(Constants.Link.HOST).append(Constants.Webservice.GET_PROJECT); 
mGetProjectTask.params.put(Constants.Key.PRJ_LICENCE, Constants.Constant.LICENCE); 
mGetProjectTask.params.put(Constants.Key.LANGUAGE, currentLanguage); 
mGetProjectTask.params.put(Constants.Key.CTY_NAME, Constants.Value.APP_CTY_NAME); 
mGetProjectTask.execute(); 
片斷

UPDATE 看來我是ne使用我正在使用的最新版本的SDK來避免此錯誤(Aviary SDK)。當我升級時,這個錯誤不再出現。

+1

請張貼*整個stac k跟蹤*。 – CommonsWare 2015-02-10 12:51:37

+0

請參閱我的編輯。 – 2015-02-10 12:55:11

+1

你可以顯示代碼片段,這行是'SplashActivity.java:71'也'GetProjectTask'函數? – hrskrs 2015-02-10 12:57:40

回答

5

您的課程(GetProjectTask中的第一個匿名課程)擴展了該平臺上不可用的課程。

+0

但是在將我們的項目目標設置爲Android 21之前。該應用可以支持4.0+版本。這是一個圖書館需要21能夠建立,它使該應用程序只能在5.0中工作。我的mimimum sdk設置爲17. – 2015-02-12 10:09:28

+1

如果您的庫需要API 21,則不能在較低的API上使用它(包括它的類)。 – StenSoft 2015-02-12 10:11:28

1

如果仔細查看API文檔,您會注意到類文檔右上角的「添加到API x」中以及每個API方法中的類似文本。

例如參見AnimatedVectorDrawable - 它是在API級別21(Lollipop)上添加的。

試圖使用在舊版設備上的API 21上添加的類將會失敗,但您遇到的情況除外。這並不令人意外,因爲不幸的是,舊版操作系統中沒有新功能。

您可以通過多種方式克服此異常:。使用兼容庫,使新的功能只有在手機支持(通過檢查Build.Version.SDK_INT或使用API​​級別特定res文件夾如layout-v21

另一種方法是設置在minSdkVersion到21,那麼你的應用程序會拒絕安裝舊設備上(並在他們的谷歌遊戲商店將不可用)。

compatibility

見的Android文檔的關於這個問題的更多細節。

+0

糾正我,如果我錯了,但我有一個理解,使用兼容庫(appcompat)解決了這個問題。情況並非總是如此嗎? – 2015-02-23 02:06:39

+0

你錯了。 appcompat並不神奇,它實現了一些功能並與應用程序捆綁在一起(使您的APK變大)。有時它可能(實現碎片,簡單的動畫),但一些新功能需要更強大的硬件(陰影,模糊)或更深的操作系統更改(矢量動畫使用特殊操作系統「渲染線程」)。 – Iftah 2015-02-23 08:55:54

+0

還要注意AppCompat中的類不是相同的類,例如。 'android.app.Fragment'使用在OS級別實現的Fragment,'android.support.v4.app.Fragment'在你的apk中實現類似的邏輯。即使它們與使用它們的程序員看起來一樣,但由於Java是強類型的,所以它們不可互換。 – Iftah 2015-02-23 09:12:53

相關問題