【发布时间】:2016-02-08 21:05:49
【问题描述】:
有很多关于 MultiDex 的帖子。有时,我遇到的错误已解决,包括我的 build.gradle 的 defaultConfig 部分中的 multiDexEnabled true。
但是,这个功能到底是什么?使用场景有哪些?
【问题讨论】:
有很多关于 MultiDex 的帖子。有时,我遇到的错误已解决,包括我的 build.gradle 的 defaultConfig 部分中的 multiDexEnabled true。
但是,这个功能到底是什么?使用场景有哪些?
【问题讨论】:
Android 应用程序 (APK) 文件包含 Dalvik Executable (DEX) 文件形式的可执行字节码文件,其中包含用于运行您的应用程序的编译代码。 Dalvik Executable 规范将单个 DEX 文件中可以引用的方法总数限制为 65,536 个,包括 Android 框架方法、库方法和您自己代码中的方法。超过此限制要求您将应用程序构建过程配置为生成多个 DEX 文件,称为 multidex 配置。
因此,功能是:它允许您编译复杂的应用程序。使用它的场景是当您的应用程序由于达到 64K DEX 方法引用限制而无法编译时。这显示为构建错误,例如:
Conversion to Dalvik format failed: Unable to execute dex: method ID not in [0, 0xffff]: 65536
【讨论】:
单个 .dex 文件可以有 65,536 个方法(引用),因此如果引用数量超过 65,536,则使用 multidex。
一个 android 应用程序被编译成一个 .dex 文件,该文件又被压缩成一个 .apk 文件。
DVM(Dalvik 虚拟机)使用 .dex 文件/文件来执行字节码。
是什么导致引用数量超过 65,536 个限制?
您编写的方法 + Android 框架方法 + 第三方库(例如 Volley、Retrofit、Facebook SDK 等)方法。
我读过“某处”
App Compat 24.2.1 包含 16.5k 方法
Google Play 服务 GCM 9.6.1 包含 16.7k 方法
因此,如果您创建了一个具有 App Compat 24.2.1 的简单 Hello world 应用程序,那么您已经 1/4 方法 可以跨越单一 dex 方法限制
【讨论】:
来自 Android 开发者官方网站。
If your minSdkVersion is set to 21 or higher, multidex is enabled by default and you do not need the multidex support library.
【讨论】:
当您的应用及其引用的库超过 65,536 个方法时,您会遇到构建错误,表明您的应用已达到 Android 构建架构的限制
如何在您的项目中启用 MultiDex
Bulid.gradle
defaultConfig {
applicationId "******"
minSdkVersion 21
targetSdkVersion 30
versionCode 8
versionName "05.15.21.8"
multiDexEnabled true
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
dependencies {
implementation 'com.android.support:multidex:1.0.3'
}
继承 MultiDexApplication
public class App extends MultiDexApplication {
private static App instance;
@Override
public void onCreate() {
MultiDex.install(this);
super.onCreate();
instance = this;
}
public static App getInstance ()
{
return instance;
}
@Override
public void onTerminate() {
super.onTerminate();
}
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
MultiDex.install(this);
}
}
在你的清单中
<application
android:name=".App"
</application>
谢谢
【讨论】:
它还允许谷歌(和其他人)在代码片段中应用 DRM,比如说..widevine,这会给大多数非开发人员带来问题..
【讨论】: