为什么只添加multiDexEnabled可以正常工作

时间:2020-02-16 06:36:13

标签: android android-multidex

最近我一直在Android中进行多义处理,这个问题浮现在脑海:

要在android项目中启用multiDex

如果仅且仅添加以下行:

// gradle build config
multiDexEnabled true

该应用将编译并正常运行。
但是真正的解决方案是:

  • 添加multiDexEnabled true
  • 添加支持库androidx.multidex
  • 覆盖Application类。

为什么仅添加multiDexEnabled true可以正常运行并且项目成功运行?剩下的两个步骤呢?

我不考虑什么吗?

顺便说一句,我的minSdkVersion是15

2 个答案:

答案 0 :(得分:0)

Enable multidex for apps with over 64K methods此处是 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类,请编辑清单文件,以在 标记中设置android:name,如下所示:

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

答案 1 :(得分:-1)

当您的应用超出方法/ dex大小限制(64K)时,会发生这种情况。
由于minSdk为15,因此您必须手动添加MultiDex,而Api 21+则不需要。


请执行以下操作以支持21年前的MultiDex
dependencies { implementation 'com.android.support:multidex:1.0.3' }


使您的应用程序类扩展MultiDexApplication

public class Application extends MultiDexApplication {}


或者,如果根本不想使用MultiDex,则可以使用Proguard剥离未使用的类和方法。