2014-09-24 24 views
1

我有一個Android應用程序,它使用了大量的JAR並且達到了65K方法的限制。爲了解決這個問題,我使用了支持multi-dex選項的Android Maven Plugin 4.0.0-rc.1。我能夠生成多個dex文件的APK文件; classes.dex和classes2.dex。java.lang.UnsupportedOperationException:不支持類加載器 - Android多個dex問題

但是,當我在平板電腦上安裝並運行此應用程序時,出現以下異常。

com.mmh.application.MiApplication: java.lang.UnsupportedOperationException: Class loader not supported 
09-24 20:29:52.672: E/AndroidRuntime(3810):  at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4733) 
09-24 20:29:52.672: E/AndroidRuntime(3810):  at android.app.ActivityThread.access$1600(ActivityThread.java:175) 
09-24 20:29:52.672: E/AndroidRuntime(3810):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1368) 
09-24 20:29:52.672: E/AndroidRuntime(3810):  at android.os.Handler.dispatchMessage(Handler.java:102) 
09-24 20:29:52.672: E/AndroidRuntime(3810):  at android.os.Looper.loop(Looper.java:146) 
09-24 20:29:52.672: E/AndroidRuntime(3810):  at android.app.ActivityThread.main(ActivityThread.java:5602) 
09-24 20:29:52.672: E/AndroidRuntime(3810):  at java.lang.reflect.Method.invokeNative(Native Method) 
09-24 20:29:52.672: E/AndroidRuntime(3810):  at java.lang.reflect.Method.invoke(Method.java:515) 
09-24 20:29:52.672: E/AndroidRuntime(3810):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1283) 
09-24 20:29:52.672: E/AndroidRuntime(3810):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1099) 
09-24 20:29:52.672: E/AndroidRuntime(3810):  at dalvik.system.NativeStart.main(Native Method) 
09-24 20:29:52.672: E/AndroidRuntime(3810): Caused by: java.lang.UnsupportedOperationException: Class loader not supported 
09-24 20:29:52.672: E/AndroidRuntime(3810):  at com.mmh.application.Dexter.loadAllDexes(Dexter.java:69) 
09-24 20:29:52.672: E/AndroidRuntime(3810):  at com.mmh.application.MiApplication.onCreate(MiApplication.java:292) 
09-24 20:29:52.672: E/AndroidRuntime(3810):  at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1013) 
09-24 20:29:52.672: E/AndroidRuntime(3810):  at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4730) 
09-24 20:29:52.672: E/AndroidRuntime(3810):  ... 10 more 

我使用的是在PR https://github.com/jayway/maven-android-plugin/pull/425給予相同的德克斯特類。

MiApplication的片段是如下 -

public class MiApplication extends Application { 
    public void onCreate() { 
     Dexter.loadAllDexes(this); 
     super.onCreate(); 
} 

我印它是使用加載德克斯特類的類加載器,它似乎它的使用PathClassLoader。如果它是從比DexClassLoader任何其他加載

09-24 20:29:52.672: I/c*.m*.a*.Dexter(3810): Dexter Classloader dalvik.system.PathClassLoader: dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/com.miairline-3.apk"],nativeLibraryDirectories=[/data/app-lib/com.miairline-3, /vendor/lib, /system/lib]]] 

德克斯特類拋出「不支持的類加載器」異常。

如何確保從DexClassLoader加載Dexter類?以及如何解決這個「不受支持的類加載器」問題?

回答

0

我找到了這個問題的答案。這是我的錯誤。

而不是

localClassLoader instanceof BaseDexClassLoader 

我用了

localClassLoader instanceof DexClassLoader 

當我改變所有引用從DexClassLoader到BaseDexClassLoader,這個問題就走了,我能夠在創建並加載多個DEX文件我應用。

0

該平板電腦上有哪個Android版本?如果這是ICS會很奇怪,因爲我已經在ICS上測試過它,並且它工作正常。我還寫了一些代碼,可以在薑餅上工作,據我所知,PathClassLoader和DexClassLoader在GB和Honeycomb上有相同的源代碼。 ICS進行了更改,德克斯特針對ICS進行了更改。 Dexter需要BaseDexClassLoader,它是ICS上PathClassLoader和DexClassLoader的基類。在ICS之前,這些類直接從ClassLoader繼承。

檢查項目: https://github.com/casidiablo/multidex/ 它看起來比我寫代碼更好的,我不知道,如果這個工程沒有通過AMP創建修改魔女二次dexes但應該可以幫助您。

+0

該平板電腦是三星Galaxy Tab4和果凍豆(4.4.2)。我試着改變Dexter代碼來使用PathClassLoader,但是它會拋出「找不到pathList字段」的異常。如果您看到,Dexter會檢查類加載器是否是DexClassLoader的實例,而不是BaseDexClassLoader,因此我不確定它是如何用於PathClassLoader的。 – mmh 2014-09-27 05:25:47

+0

如果您不介意,可否請您分享代碼的相關部分以及您的maindexList文件。 – mmh 2014-09-27 05:28:29

相關問題