1

我有一个使用大量 JAR 的 Android 应用程序,并且已达到 65K 方法的限制。为了解决这个问题,我使用了支持多 dex 选项的 Android Maven 插件 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]]]

如果从 DexClassLoader 以外的任何其他地方加载 Dexter 类,则会引发“不支持的类加载器”异常。

如何确保从 DexClassLoader 加载 Dexter 类?以及如何解决这个“不支持的类加载器”问题?

4

2 回答 2

0

此平板电脑上使用的是哪个 Android 版本?如果这是 ICS,那会很奇怪,因为我已经在 ICS 上对其进行了测试并且可以正常工作。我还编写了适用于 Gingerbread 的代码,据我所知 PathClassLoader 和 DexClassLoader 在 GB 和 Honeycomb 上具有相同的源代码。在 ICS 中进行了更改,而 Dexter 用于 ICS。Dexter 需要 BaseDexClassLoader,它是 ICS 上 PathClassLoader 和 DexClassLoader 的基类。在 ICS 之前,这些类直接从 ClassLoader 继承。

检查这个项目: https ://github.com/casidiablo/multidex/ 它看起来比我写的代码更好,我不知道这是否可以在不修改 AMP 创建的辅助 dexes 的情况下工作,但应该对你有所帮助。

于 2014-09-25T15:55:32.297 回答
0

我找到了这个问题的答案。这是我的错误。

代替

localClassLoader instanceof BaseDexClassLoader

我用过

localClassLoader instanceof DexClassLoader

当我将所有引用从 DexClassLoader 更改为 BaseDexClassLoader 时,问题就消失了,我能够在我的应用程序中创建和加载多个 dex 文件。

于 2014-10-09T13:18:45.580 回答