关于MultiDex的帖子很多。我有时遇到过错误,包括我在build.gradle的defaultConfig
部分中的#F A 1 1 1 3 3 2
2 1 0.002796 0.000005 0.000008 -4.938531 1.039083
3 1 0.002796 0.000005 0.000007 -4.938531 1.039083
4 0 0.004961 -0.000008 -0.000002 -4.088534 0.961486
5 0 0.004961 0.000006 -0.000002 -4.079798 0.975763
。
但是,这个功能究竟是什么?使用它的场景是什么?
答案 0 :(得分:129)
Android应用程序(APK)文件包含Dalvik可执行文件(DEX)文件形式的可执行字节码文件,其中包含用于运行应用程序的已编译代码。 Dalvik可执行规范将单个DEX文件中可引用的方法总数限制为65,536,包括Android框架方法,库方法和您自己的代码中的方法。超过此限制要求您配置应用程序构建过程以生成多个DEX文件,称为多索引配置。
因此,该功能是:它允许您的复杂应用程序进行编译。使用它的方案是由于达到64K DEX方法参考限制而导致应用程序无法编译。这显示为构建错误,例如:
Conversion to Dalvik format failed: Unable to execute dex: method ID not in [0, 0xffff]: 65536
答案 1 :(得分:31)
单个.dex文件可以有65,536个方法(引用),因此如果引用数超过65,536,则使用multidex。
将android应用程序编译成.dex文件,然后将其压缩为单个.apk文件 DVM(Dalvik虚拟机)使用.dex文件/文件来执行字节码。
是什么导致参考数超过65,536个限制?
您编写的方法+ Android Framework方法+第三方库(例如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 way 来跨越单个dex方法限制
答案 2 :(得分:4)
Dex 代表Dalvik Executable,这是谷歌的虚拟机处理器(Dalvik)用来处理Android应用程序的。 Android在构建时考虑了小而简单的应用程序,并且对单个Dalvik可执行文件的约束以65,536种方法固定了代码引用的顶层。由于这个问题以及Dalvik机器处理代码执行的方式,存在一些编译和调用问题,直到Monkey Patch或 MultiDex 集成。 Android Studio中的MultiDex集成允许Android开发人员使用超过65,536种方法编译和执行代码库!
答案 3 :(得分:1)
正在访问Android开发者官方网站。
If your minSdkVersion is set to 21 or higher, multidex is enabled by default and you do not need the multidex support library.
答案 4 :(得分:0)
当您的应用及其引用的库超过 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>
<块引用>
谢谢
答案 5 :(得分:-2)
对于Google(和其他公司),它还允许在某些代码段中应用DRM(例如..vine),这会给大多数非开发人员带来麻烦。.