java.lang.UnsupportedOperationException: загрузчик классов не поддерживается - Android multi dex проблема
У меня есть приложение для Android, которое использует много JAR-файлов и достигло предела 65K методов. Чтобы решить эту проблему, я использовал Android Maven Plugin 4.0.0-rc.1, который поддерживает опцию multi-dex. Я был в состоянии создать файл APK, который несколько файлов dex; 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.
Фрагмент MiApplication приведен ниже -
public class MiApplication extends Application {
public void onCreate() {
Dexter.loadAllDexes(this);
super.onCreate();
}
Я напечатал загрузчик классов, который он использовал для загрузки класса Декстер, и похоже, что он использует 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.
Как мне убедиться, что класс Dexter загружен из DexClassLoader? и как мне решить эту проблему "неподдерживаемый загрузчик классов"?
2 ответа
Я нашел ответ на эту проблему. Это была моя ошибка.
Вместо
localClassLoader instanceof BaseDexClassLoader
Я использовал
localClassLoader instanceof DexClassLoader
Когда я изменил все ссылки с DexClassLoader на BaseDexClassLoader, проблема исчезла, и я смог создать и загрузить несколько файлов dex в свое приложение.
Какая версия Android на этом планшете? Было бы странно, если это ICS, потому что я проверил его на ICS, и он работает. Я также написал код, который работает на Gingerbread и, насколько мне известно, PathClassLoader и DexClassLoader имеют одинаковый исходный код для GB и Honeycomb. Изменения были внесены в ICS и Декстер для ICS. Декстеру нужен BaseDexClassLoader, который является базовым классом для PathClassLoader и DexClassLoader на ICS. В pre ICS эти классы наследуются непосредственно от ClassLoader.
Проверьте этот проект: https://github.com/casidiablo/multidex/ он выглядит лучше, чем код, который я написал, я не знаю, работает ли он без модификации с вторичными приставками, созданными AMP, но должен помочь вам.