什么是Android MultiDex?

时间:2015-11-07 22:18:49

标签: android multidex android-multidex

关于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

但是,这个功能究竟是什么?使用它的场景是什么?

6 个答案:

答案 0 :(得分:129)

引用the documentation

  

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)

What is MultiDex in Android?

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),这会给大多数非开发人员带来麻烦。.