【问题标题】:number of referenced method in .dex file cannot exceed 64K and java.lang.UnsupportedOperationException.dex 文件中引用的方法数不能超过 64K 和 java.lang.UnsupportedOperationException
【发布时间】:2017-01-13 13:47:03
【问题描述】:

我是安卓新手。我正在尝试构建一个 apk 文件。构建应用程序时出现两个错误:
一个)。在第一个错误中,它说 .dex 文件中引用的方法数不能超过 64K 并给了我这个Link
乙)。在第二个错误中,它显示 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支持库?
乙)。未来的目标是什么?
C)。第二个错误是什么意思?
d)。它在什么意义上说 .dex 文件不能超过 64K ? 你能帮帮我吗?
谢谢。

【问题讨论】:

  • 再次阅读提供的链接。 multiDexEnabled true 只是允许启用的第一步。它不会自行启用
  • 或者,减少您编译的依赖项的数量
  • @cricket_007 是的,它说当您的应用程序和库达到一定大小时,您会遇到构建错误。但是当我习惯使用 multidex 支持库时,我注意到一件事,它使应用程序大小增加了大约 3 MB。那有什么用呢?

标签: java android


【解决方案1】:

a)。为什么需要添加 Multidex 支持库?

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

b)。未来的目标是什么?

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

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

Multidex 随后被引入,允许应用程序继续扩展而无需担心方法计数限制。它确实存在使应用程序更加不稳定的危险。因此建议先尝试 ProGuard 以减少方法数。

c)。第二个错误是什么意思?

java.lang.UnsupportedOperationException

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

请在您的应用中提供此崩溃的完整崩溃日志/堆栈跟踪以及相关代码 sn-p。

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

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

更多参考资料。

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/

【讨论】:

    【解决方案2】:

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

    <?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);
    }
    

    【讨论】:

    • 只有当我需要junit测试时才会出现,对吗?
    • @luke 没有?是什么让你这么认为?
    • 即使我不确定我在 stackoverflow 上问了几个问题和答案,也有人提到了
    猜你喜欢
    • 2016-09-22
    • 2016-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多