.dex文件中引用的方法的数量不能超过64K和java.lang.UnsupportedOperationException

时间:2017-01-13 04:58:20

标签: java android

我是android新手。我正在尝试构建一个apk文件。在构建应用程序时,它以两个错误结束:
一个)。在第一个错误中,它表示.dex文件中引用的方法的数量不能超过64K并且给了我Link
B)。在第二个错误中,它表示java.lang.UnsupportedOperationException。
我已成功添加了multidex支持库并生成了一个用于测试和解决问题的apk文件。像这样

android {
    compileSdkVersion 22
    buildToolsVersion "23.0.0"

         defaultConfig {
             minSdkVersion 14 //lower than 14 doesn't support multidex
             targetSdkVersion 22

             // Enabling multidex support.
             multiDexEnabled true
         }
}

dependencies {
    compile 'com.android.support:multidex:1.0.1'
}


但是我在这里仍然没有什么疑问 一个)。为什么我需要添加multidex支持库?
B)。未来的目的是什么?
C)。第二个错误是什么意思?
d)。在什么意义上它说.dex文件不能超过64K? 你能帮帮我吗? 谢谢。

2 个答案:

答案 0 :(得分:3)

<强> a)中。为什么我需要添加Multidex支持库?

- &GT;这样做的目的是将您的Dex文件拆分为多个Dex文件。该库支持使用多个Dalvik可执行文件(DEX)构建应用程序。使用Multidex配置需要引用超过65536种方法的应用程序。

<强> B)。未来的目的是什么?

- &GT; Android有一个问题,即Dex文件(64k)中的方法定义数量有一个上限。这意味着一旦达到该限制,您就无法进一步扩展您的应用程序。

在Multidex之前,建议使用ProGuard通过删除代码中未使用的方法来减少方法定义的数量。在实施Google Play服务框架时特别有用。

然后引入了Multidex,允许应用程序继续扩展而不必担心方法计数限制。它确实带来了使应用程序更不稳定的危险。因此,建议首先尝试使用ProGuard来减少方法计数。

<强> c)中。第二个错误是什么意思?

java.lang.UnsupportedOperationException

参考:https://stackoverflow.com/a/21061985/3758024

请使用相关的代码段从您的应用提供此崩溃的完整崩溃日志/堆栈跟踪。

<强> d)。在什么意义上它说.dex文件不能超过64K?你能帮帮我吗?

- &GT; Android应用(APK)文件包含Dalvik可执行文件(DEX)文件形式的可执行字节码文件,其中包含用于运行应用程序的编译代码。 Dalvik可执行规范将单个DEX文件中可引用的方法总数限制为65,536,包括您自己的代码中的Android框架方法,库方法和方法。在计算机科学的背景下,术语Kilo,K表示1024(或2 ^ 10)。由于65,536等于64 X 1024,因此该限制被称为&#39; 64K参考限制&#39;。

更多参考资料。

1)https://developer.android.com/studio/build/multidex.html#avoid

2)https://medium.com/@rotxed/dex-skys-the-limit-no-65k-methods-is-28e6cb40cf71#.3eg897jca

3)https://blog.mustafaali.xyz/dexs-64k-limit-is-not-a-problem-anymore-well-almost-2b1faac3508#.wiaruldue

4)http://www.fasteque.com/deep-dive-into-android-multidex/

答案 1 :(得分:0)

同样在Manifest中,将MultiDexApplication支持库中的multidex类添加到应用程序元素

<?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.example.android.multidex.myapplication">
        <application
            ...
            android:name="android.support.multidex.MultiDexApplication">
<!--If you are using your own custom Application class then extend -->
<!--MultiDexApplication and change above line as-->
            android:name=".YourCustomApplicationClass">

            ...
        </application>
    </manifest>

覆盖attachBaseContext方法

@Override
protected void attachBaseContext(Context newBase) {
    super.attachBaseContext(newBase);
    MultiDex.install(this);
}