【问题标题】:What is Android MultiDex?什么是 Android MultiDex?
【发布时间】:2016-02-08 21:05:49
【问题描述】:

有很多关于 MultiDex 的帖子。有时,我遇到的错误已解决,包括我的 build.gradle 的 defaultConfig 部分中的 multiDexEnabled true

但是,这个功能到底是什么?使用场景有哪些?

【问题讨论】:

    标签: android android-multidex


    【解决方案1】:

    引用the documentation:

    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
    

    【讨论】:

    • 知道这会有多大的代码库(LOC,或粗略的屏幕数)吗?你是要在一个简单的 5-6 屏幕应用程序上达到这个限制,还是真的更进一步(即:10-20 屏幕)你可能会达到它
    • @Marchy:通常是因为添加了太多的库。没有库的项目很难达到这个限制。
    • 我有一个小应用程序,它使用大约 5 个谷歌支持库以及 Fabric.io 和 2 或 3 个其他第三方库,我必须使用 multi-dex。
    • 启用multidex有什么缺点吗?为什么不让它默认为真?
    • @RafaelLima:对于 Android 5.0 之前的设备,multidex 的准反向移植存在安全问题。 IIRC,如果您尝试使用尚未加载的 DEX 文件中的类,它也会导致您的应用出现一些问题。
    【解决方案2】:

    就这么简单

    单个 .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 方法限制

    【讨论】:

      【解决方案3】:

      来自 Android 开发者官方网站。

      If your minSdkVersion is set to 21 or higher, multidex is enabled by default and you do not need the multidex support library.
      

      【讨论】:

      • 感谢您的回答。这是 2015 年的一个问题,自那以后发生了很多变化。
      【解决方案4】:

      当您的应用及其引用的库超过 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】:

        它还允许谷歌(和其他人)在代码片段中应用 DRM,比如说..widevine,这会给大多数非开发人员带来问题..

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-03-25
          • 1970-01-01
          • 2017-10-16
          • 2015-04-19
          • 2016-08-25
          • 2015-02-05
          相关资源
          最近更新 更多