如何使用新的 Android Multidex 支持库启用多索引

Posted

技术标签:

【中文标题】如何使用新的 Android Multidex 支持库启用多索引【英文标题】:How to enable multidexing with the new Android Multidex support library 【发布时间】:2014-12-23 22:34:11 【问题描述】:

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

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

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

【问题讨论】:

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);
    

【讨论】:

以上是关于如何使用新的 Android Multidex 支持库启用多索引的主要内容,如果未能解决你的问题,请参考以下文章

在路径上找不到类“android.support.multidex.MultiDexApplication”:DexPathList

如何在没有 Gradle 的 Eclipse 中的 Android 项目上启用 multidex

如何安装android-support-multidex.jar

使用 Multidex 的 Android proguard

带有 multidex 的 Xamarin Android - 调试模式下的错误

android MultiDex multiDex原理