如何使用新的Android Multidex支持库启用多重排序


142

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

Google通过Android Lollipop引入了multidex支持库,可以轻松实现multidex。

使用该库并使用multidex支持构建我的应用程序需要采取什么步骤?


multidex支持您应用程序的第三方库
Keshav Gera,

Answers:


293

编辑:

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 {

}

有关更多信息,这是一个很好的指南。


2
如果您使用的是新的构建工具,那么绝对是这样的方法。
Janusz 2014年

1
@ jem88您已将gradle更新为1.0?您应该使用2.2。+(请看一下gradle-wrapper.properties)要点:1您的buildToolsVersion必须为21.1.1或更高。 2添加multiDexEnabled true到build.gradle的defaultConfig中(注意没有=3添加'com.android.support:multidex:1.0.0'
Chad Bingham

3
如果不使用应用程序类怎么办?被添加android:name="android.support.multidex.MultiDexApplication"application标签中AndroidManifest.xml是否足够?
好友

1
编译“com.android.support:multidex:1.0.1”没有必要在23
函数naveed艾哈迈德

3
@NaveedAhmad,根据Google开发人员文档:..if your minSdkVersion is set to 20 or lower you must use... 'compile 'com.android.support:multidex:1.0.1'
Sakiboy

44

需要以下步骤来开始多路分形:

将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博客上找到更多信息。


9
如何不使用gradle?
lacas 2014年

3
@ Janusz是否可以不使用gradle的multidex选项?
Devrim's

1
我认为如果没有gradle,这是不可能的。
Janusz 2014年

5
什么是Eclipse Ant修复程序,不是gradle?
portfoliobuilder

我的项目没有创建gradle文件,我创建了一个gradle文件并按照您的步骤进行操作,但是它对我
不起作用

16

简而言之,为了启用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'
}

您还必须更改清单文件。在清单中,将来自multidex支持库的MultiDexApplication类添加到application元素中,如下所示

<?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>

1
这将不会启用多路分形。您仍然缺少应用程序类。
乍得宾厄姆

1
感谢您的评论,这适用于我的情况。这是我从developer.android.com/tools/building/multidex.html
smoothumut 2015年

1
是的,你的权利。除非您正在运行测试,否则您似乎不需要在应用程序类中拥有它。
乍得宾厄姆

我不明白。我的应用程序清单已经有一个名称标签。我认为我不会将其替换为“ android:name="android.support.multidex.MultiDexApplication 请指导我。”
mboy

1
@mboy:不,MainActivity和应用程序类不同。在此处了解有关应用程序类的更多信息:rominirani.com/android-application-class
akshay7692 2016年

9

在您的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);
    }
}


3

步骤1:更改build.grade

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

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

步骤2:在Application类上进行设置

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的符号”。有人遇到过这个问题吗?
Aung Myint Thein

2

这是2020年5月起使用Android X的最新方法。

对于minSdk> = 21

您无需执行任何操作。所有这些设备都使用Android RunTime(ART)VM,该VM本机支持multidex。

对于 minSdk <21

模块级别build.gradle,确保填充以下配置:

android {
    defaultConfig {
        multiDexEnabled true
    }
}

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

然后,您src/main/AndroidManifest.xml需要声明MultiDexApplicationapplication:name

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

1

添加到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添加到清单文件中<application android:largeHeap =“ true”> </ application>
Malik Abu Qaoud

机器人:largeHeap =“真正的”机器人:allowBackup =“真”我补充两个
戒日

将此添加到gradle文件>>>>>>>>> dexOptions {javaMaxHeapSize“ 4g”}
Malik Abu Qaoud

1

首先,您应该尝试使用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'
        }
    }
}

0

如果要在项目中启用Multi-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) 

启用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> 

1
什么gradle.builder
乍得宾厄姆

您的gradle文件位于您的android studio项目中
pavel

0

上面的所有答案都很棒

还要添加此内容,否则您的应用将像我的一样崩溃

compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
}

0

使用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


-2

只是将其添加到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****
     }
}

-5

Multi_Dex.java

public class Multi_Dex extends Application {
    @Override
    protected void attachBaseContext(Context base) {
        super.attachBaseContext(base);
        MultiDex.install(this);
    }
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.