首页 > 解决方案 > 为什么只添加 multiDexEnabled 工作正常

问题描述

最近我一直在为 android 中的 multidexing 苦苦挣扎,我想到了这个问题:

在 android 项目中启用 multiDex

如果您仅且仅添加此行:

// gradle build config
multiDexEnabled true

该应用程序将编译并正常工作。
真正的解决方案是:

为什么只添加multiDexEnabled true作品和项目成功运行?剩下的两个步骤呢

我不是在考虑什么吗?

顺便说一句,我minSdkVersion是 15

标签: androidandroid-multidex

解决方案


为具有超过 64K 方法的应用程序启用 multidex这是Google本身的链接。

当您的应用及其引用的库超过 65,536 个方法时,您会遇到构建错误,表明您的应用已达到 Android 构建架构的限制:

trouble writing output:
Too many field references: 131000; max is 65536.
You may try using --multi-dex option.

旧版本的构建系统报告了不同的错误,这表明存在相同的问题:

Conversion to Dalvik format failed:
Unable to execute dex: method ID not in [0, 0xffff]: 65536

这两种错误情况都显示一个通用数字:65536。该数字表示单个 Dalvik 可执行 (DEX) 字节码文件中的代码可以调用的引用总数。本页介绍了如何通过启用称为 multidex 的应用程序配置来超越此限制,它允许您的应用程序构建和读取多个 DEX 文件。

关于 64K 参考限制

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

Android 5.0 之前的 Multidex 支持

Android 5.0(API 级别 21)之前的平台版本使用 Dalvik 运行时来执行应用程序代码。默认情况下,Dalvik 将应用程序限制为每个 APK 单个 classes.dex 字节码文件。为了绕过这个限制,您可以将 multidex 支持库添加到您的项目中:

dependencies {
    def multidex_version = "2.0.1"
    implementation 'androidx.multidex:multidex:$multidex_version'
}

如果您不使用 AndroidX,请添加以下支持库依赖项:

implementation 'com.android.support:multidex:1.0.3'
  1. 修改模块级build.gradle文件以启用 multidex 并将 multidex 库添加为依赖项,如下所示:
android {
    defaultConfig {
        ...
        minSdkVersion 15 
        targetSdkVersion 28
        multiDexEnabled true
    }
    ...
}

dependencies {
  implementation 'com.android.support:multidex:1.0.3'
}
  1. 根据您是否覆盖 Application 类,执行以下操作之一:

    如果您不覆盖 Application 类,请编辑清单文件以在标记如下:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.myapp">
    <application
            android:name="android.support.multidex.MultiDexApplication" >
        ...
    </application>
</manifest>

如果您确实覆盖了 Application 类,请将其更改为扩展 MultiDexApplication(如果可能),如下所示:

public class MyApplication extends MultiDexApplication { ... }

或者,如果您确实覆盖了 Application 类但无法更改基类,那么您可以改为覆盖 attachBaseContext() 方法并调用 MultiDex.install(this) 来启用 multidex

public class MyApplication extends SomeOtherApplication {
  @Override
  protected void attachBaseContext(Context base) {
     super.attachBaseContext(base);
     MultiDex.install(this);
  }
}

推荐阅读