【问题标题】:How to enable multidexing with the new Android Multidex support library如何使用新的 Android Multidex 支持库启用多索引
【发布时间】:2021-08-12 04:03:31
【问题描述】:

我想使用新的 Multidex 支持库来打破我的一个应用程序的方法限制。

Google 在 Android Lollipop 中引入了一个 multidex 支持库,可以轻松实现 multidex。

需要哪些步骤才能使用此库并构建我的应用程序以支持 multidex?

【问题讨论】:

  • multidex 支持第三方库到您的应用程序

标签: android gradle android-multidex


【解决方案1】:

编辑:

Android 5.0(API 级别 21)及更高版本使用支持多索引的 ART。因此,如果您的minSdkVersion 为21 或更高,则不需要multidex 支持库。


修改你的build.gradle:

android {
    compileSdkVersion 22
    buildToolsVersion "23.0.0"

         defaultConfig {
             minSdkVersion 14 //lower than 14 doesn't support multidex
             targetSdkVersion 22

             // Enabling multidex support.
             multiDexEnabled true
         }
}

dependencies {
    implementation 'com.android.support:multidex:1.0.3'
}

如果您正在运行单元测试,则需要将其包含在您的 Application 类中:

public class YouApplication extends Application {

    @Override
    protected void attachBaseContext(Context base) {
        super.attachBaseContext(base);
        MultiDex.install(this);
    }

}

或者只是让你的 application 类扩展 MultiDexApplication

public class Application extends MultiDexApplication {

}

欲了解更多信息,请is a good guide.

【讨论】:

  • 如果您正在使用新的构建工具,但这绝对是您的最佳选择。
  • @jem88 您已将 gradle 更新到 1.0?您应该使用 2.2.+(查看您的 gradle-wrapper.properties) 关键点:1您的 buildToolsVersion 需要为 21.1.1 或更高版本。 2multiDexEnabled true 添加到 build.gradle 的 defaultConfig 中(注意没有 =3 添加 'com.android.support:multidex:1.0.0'
  • 如果我们不使用应用类呢?在AndroidManifest.xml 中将android:name="android.support.multidex.MultiDexApplication" 添加到application 标签是否足够?
  • 23年不需要编译'com.android.support:multidex:1.0.1'
  • @NaveedAhmad,根据谷歌开发者文档:..if your minSdkVersion is set to 20 or lower you must use...'compile 'com.android.support:multidex:1.0.1'
【解决方案2】:

启动multi dexing需要以下步骤:

将 android-support-multidex.jar 添加到您的项目中。 jar 可以在您的 Android SDK 文件夹 /sdk/extras/android/support/multidex/library/libs 中找到

现在你要么让你的应用程序类扩展 MultiDexApplication

public class MyApplication extends MultiDexApplication

或者你像这样覆盖 attachBaseContext:

protected void attachBaseContext(Context base) {
 super.attachBaseContext(base);
 MultiDex.install(this);
}

我使用了覆盖方法,因为它不会与您的应用程序类的类层次结构混淆。

现在您的应用已准备好使用 multi dex。下一步是说服 gradle 构建一个多索引的 apk。构建工具团队正在努力使这更容易,但目前您需要将以下内容添加到应用程序 build.gradle 的 android 部分

   dexOptions {
      preDexLibraries = false
   }

以下是您的应用程序 build.gradle 的一般部分

afterEvaluate {
   tasks.matching {
      it.name.startsWith('dex')
   }.each { dx ->
      if (dx.additionalParameters == null) {
         dx.additionalParameters = ['--multi-dex']
      } else {
         dx.additionalParameters += '--multi-dex'
      }
   }
}

更多信息请访问Alex Lipovs blog

【讨论】:

  • 没有 gradle 怎么用这个?
  • @Janusz 是否可以在没有 gradle 的情况下使用 multidex 选项?
  • 我认为没有 gradle 是不可能的。
  • 什么是 Eclipse Ant 修复,而不是 gradle?
  • 我的项目没有创建 gradle 文件,我创建了一个并按照您的步骤操作,但它不适合我
【解决方案3】:

简单地说,为了启用 multidex,您需要...

android {
compileSdkVersion 21
buildToolsVersion "21.1.0"

defaultConfig {
    ...
    minSdkVersion 14
    targetSdkVersion 21
    ...

    // Enabling multidex support.
    multiDexEnabled true
}
...
}

dependencies {
implementation 'com.android.support:multidex:1.0.0'
}

您还必须更改清单文件。在您的清单中,将 MultiDexApplication 类从 multidex 支持库添加到应用程序元素,如下所示

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
   package="com.example.android.multidex.myapplication">
   <application
       ...
       android:name="android.support.multidex.MultiDexApplication">
       ...
   </application>
</manifest>

【讨论】:

  • 这不会启用多索引。您仍然缺少应用程序类。
  • 感谢您的评论,这适用于我的情况。这是我从developer.android.com/tools/building/multidex.html得到参考的链接
  • 是的,你的权利。除非您正在运行测试,否则您似乎不需要在应用程序类中包含它。
  • 我不明白。我的应用程序清单已经有一个名称标签。我不认为我会用android:name="android.support.multidex.MultiDexApplication 替换它。请指导我..
  • @mboy :不,MainActivity 和应用程序类不同。在此处了解有关应用程序类的更多信息:rominirani.com/android-application-class
【解决方案4】:

这是截至 2020 年 10 月的最新方法,适用于 Android X。这来自 Android 的文档“Enable multidex for apps with over 64K methods”。

对于minSdk >= 21

你不需要做任何事情。所有这些设备都使用原生支持 multidex 的 Android RunTime (ART) VM。

对于minSdk

在您的模块build.gradle中,确保填充以下配置:

android {
    defaultConfig {
        multiDexEnabled true
    }
}

dependencies {
    implementation 'androidx.multidex:multidex:2.0.1'
}

您需要安装显式的 multidex 支持。文档包括three methods to do so,你必须选择一个

例如,在您的src/main/AndroidManifest.xml 中,您可以将MultiDexApplication 声明为application:name

<manifest package="com.your.package"
          xmlns:android="http://schemas.android.com/apk/res/android">
    <application android:name="androidx.multidex.MultiDexApplication" />
</manifest>

【讨论】:

  • 对于 minSdk >= 21 不需要 multidex - 这是真的,谢谢!
【解决方案5】:

在你的 build.gradle 添加这个依赖:

compile 'com.android.support:multidex:1.0.1'

再次在您的 build.gradle 文件中将此行添加到 defaultConfig 块:

multiDexEnabled true

不要从 Application 扩展您的应用程序类,而是从 MultiDexApplication 扩展它;喜欢:

public class AppConfig extends MultiDexApplication {

现在你可以开始了!如果您需要,MultiDexApplication 所做的只是

public class MultiDexApplication extends Application {
    @Override
    protected void attachBaseContext(Context base) {
        super.attachBaseContext(base);
        MultiDex.install(this);
    }
}

【讨论】:

    【解决方案6】:

    build.gradle

    multiDexEnabled true
    implementation 'androidx.multidex:multidex:2.0.1'
    

    AndroidManifest.xml

    <application
        android:name="androidx.multidex.MultiDexApplication"
    

    【讨论】:

      【解决方案7】:

      第 1 步:更改 build.grade

      defaultConfig {
          ...
          // Enabling multidex support.
          multiDexEnabled true
      }
      
      dependencies {
          ...
          compile 'com.android.support:multidex:1.0.0'
      }
      

      第 2 步:在应用程序类上设置

      public class MyApplication extends Application {
          @Override
          public void onCreate() {
              super.onCreate();
              MultiDex.install(this);
          }
      }
      

      第 3 步:更改grade.properties

      org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
      

      它会工作的!谢谢。

      【讨论】:

      • 我收到“找不到 MultiDex 的符号”。以前有人遇到过这个问题吗?
      【解决方案8】:

      首先你应该尝试使用 Proguard(这会清除所有未使用的代码)

      android {
          compileSdkVersion 25
          buildToolsVersion "25.0.2"
      
          defaultConfig {
              minSdkVersion 16
              targetSdkVersion 25
              versionCode 1
              versionName "1.0"
      
              testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
              multiDexEnabled true
          }
          buildTypes {
              release {
                  minifyEnabled true
                  proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
              }
          }
      }
      

      【讨论】:

      • 所以不需要MultiDexApplicationandroidx:multidex?为什么其他答案提供了另外两个步骤?
      【解决方案9】:

      添加到 AndroidManifest.xml:

      android:name="android.support.multidex.MultiDexApplication" 
      

      MultiDex.install(this);
      

      在您的自定义应用程序的 attachBaseContext 方法中

      或您的自定义应用程序扩展 MultiDexApplication

      在你的 build.gradle 中添加 multiDexEnabled = true

      defaultConfig {
          multiDexEnabled true
      }
      
      dependencies {
          compile 'com.android.support:multidex:1.0.0'
          }
      }
      

      【讨论】:

      • @Harsha 不建议使用它,但尝试将 largeHeap 添加到清单文件
      • android:largeHeap="true" android:allowBackup="true" 都添加了
      • 将此添加到 gradle 文件中 >>>>>>>>> dexOptions { javaMaxHeapSize "4g" }
      【解决方案10】:

      使用 androidx,经典支持库不再起作用。

      简单的解决方案是使用以下代码

      在您的build.gradle 文件中

      android{
        ...
        ...
        defaultConfig {
           ...
           ...
           multiDexEnabled true
        }
        ...
      }
      
      dependencies {
        ...
        ...
        implementation 'androidx.multidex:multidex:2.0.1'
      }
      

      在您的清单中,只需将 name 属性添加到应用程序标签

      <manifest ...>
          <application
              android:name="androidx.multidex.MultiDexApplication"
           ...
           ...>
               ...
               ...
          </application>
      </manifest>
      

      如果您的应用程序面向 API 21 或更高版本,则默认启用 multidex。

      现在,如果您想摆脱在尝试支持 multidex 时遇到的许多问题 - 首先尝试通过设置 minifyEnabled true 来使用代码收缩。

      【讨论】:

        【解决方案11】:

        如果你想在你的项目中启用多 dex,那么就去 gradle.builder

        并将其添加到您的依赖项中

         dependencies {
           compile 'com.android.support:multidex:1.0.0'}
        

        那么你必须添加

         defaultConfig {
        ...
        minSdkVersion 14
        targetSdkVersion 21
        ...
        
        // Enabling multidex support.
        multiDexEnabled true}
        

        然后打开一个类并将其扩展为Application 如果您的应用使用扩展了 Application 类,您可以重写 oncrete() 方法并调用

           MultiDex.install(this) 
        

        启用多重索引。

        最后添加到您的清单中

         <?xml version="1.0" encoding="utf-8"?>
         <manifest xmlns:android="http://schemas.android.com/apk/res/android"
            package="com.example.android.multidex.myapplication">
            <application
           ...
             android:name="android.support.multidex.MultiDexApplication">
           ...
           </application>
         </manifest> 
        

        【讨论】:

        • 什么是gradle.builder
        • 你的 gradle 文件位于你的 android studio 项目中
        【解决方案12】:

        以上所有答案都很棒

        还要添加这个,否则你的应用会像我一样无缘无故崩溃

        compileOptions {
            sourceCompatibility JavaVersion.VERSION_1_8
            targetCompatibility JavaVersion.VERSION_1_8
        }
        

        【讨论】:

          【解决方案13】:

          只需在 build.gradle 中添加这个片段也可以正常工作

          android {
             compileSdkVersion 22
             buildToolsVersion "23.0.0"
          
               defaultConfig {
                   minSdkVersion 14 //lower than 14 doesn't support multidex
                   targetSdkVersion 22
          
                   **// Enabling multidex support.
                   **multiDexEnabled true****
               }
          }
          

          【讨论】:

            【解决方案14】:

            Multi_Dex.java

            public class Multi_Dex extends Application {
                @Override
                protected void attachBaseContext(Context base) {
                    super.attachBaseContext(base);
                    MultiDex.install(this);
                }
            }
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2015-02-05
              • 1970-01-01
              • 1970-01-01
              • 2018-04-21
              • 1970-01-01
              • 2012-09-19
              相关资源
              最近更新 更多