我有一个Android应用程序,它使用了很多JAR,并且达到了65K方法的极限。为了解决这个问题,我使用了支持multi-dex选项的Android Maven Plugin 4.0.0-rc.1。我能够生成多个dex文件的APK文件; classes.dex和classes2.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中提供的相同Dexter类。
MiApplication的片段如下 -
public class MiApplication extends Application {
public void onCreate() {
Dexter.loadAllDexes(this);
super.onCreate();
}
我打印了用于加载Dexter类的类加载器,它似乎使用了PathClassLoader。
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]]]
Dexter类抛出'不支持的类加载器'异常,如果它是从DexClassLoader以外的任何其他方式加载的。
如何确保从DexClassLoader加载Dexter类?以及如何解决这个不受支持的类加载器'问题
答案 0 :(得分:0)
这款平板电脑上有哪个Android版本?如果这是ICS会很奇怪,因为我已经在ICS上对它进行了测试并且它有效。我还编写了适用于Gingerbread的代码,据我所知,PathClassLoader和DexClassLoader在GB和Honeycomb上有相同的源代码。在ICS中进行了更改,而Dexter则在ICS中进行了更改。 Dexter需要BaseDexClassLoader,它是ICS上PathClassLoader和DexClassLoader的基类。在pre ICS中,这些类直接从ClassLoader继承。
检查此项目: https://github.com/casidiablo/multidex/ 它看起来比我编写的代码更好,我不知道这是否有效,如果没有修改由AMP创建的辅助dexes,但应该帮助你。
答案 1 :(得分:0)
我找到了这个问题的答案。这是我的错误。
而不是
localClassLoader instanceof BaseDexClassLoader
我用过
localClassLoader instanceof DexClassLoader
当我将所有引用从DexClassLoader更改为BaseDexClassLoader时,问题就消失了,我可以在我的应用程序中创建和加载多个dex文件。