154

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

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

需要哪些步骤才能使用这个库并构建我的具有 multidex 支持的应用程序?

4

14 回答 14

330

编辑:

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 {

}

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

于 2014-12-04T00:09:11.320 回答
45

启动多 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 博客上找到。

于 2014-10-29T09:49:46.533 回答
19

简单地说,为了启用 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>
于 2015-07-30T12:42:16.240 回答
15

这是截至 2020 年 10 月使用 Android X 的最新方法。这来自 Android 的文档“为具有超过 64K 方法的应用启用 multidex ”。

对于minSdk>= 21

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

对于minSdk< 21

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

android {
    defaultConfig {
        multiDexEnabled true
    }
}

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

您需要安装显式的 multidex 支持。该文档包括三种方法,您必须选择一种

例如,在您的 中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>
于 2020-05-05T05:02:48.000 回答
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);
    }
}
于 2016-05-07T04:57:53.757 回答
8

构建.gradle

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

AndroidManifest.xml

<application
    android:name="androidx.multidex.MultiDexApplication"
于 2019-07-08T12:38:46.930 回答
3

第 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

它会工作的!谢谢。

于 2016-07-20T06:33:56.057 回答
2

首先,您应该尝试使用 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'
        }
    }
}
于 2017-04-28T19:02:48.237 回答
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'
    }
}
于 2017-02-08T09:18:27.423 回答
1

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

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

在你的build.gradle文件中

android{
  ...
  ...
  defaultConfig {
     ...
     ...
     multiDexEnabled true
  }
  ...
}

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

在您的清单中,只需将 name 属性添加到 application 标签

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

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

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

于 2020-07-24T06:15:49.980 回答
0

如果你想在你的项目中启用多 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> 
于 2016-04-30T08:59:05.483 回答
0

以上所有答案都很棒

还要添加这个,否则你的应用程序会像我的一样崩溃,没有任何理由

compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
}
于 2020-07-03T20:07:52.093 回答
-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****
     }
}
于 2017-02-24T09:54:17.697 回答
-6

Multi_Dex.java

public class Multi_Dex extends Application {
    @Override
    protected void attachBaseContext(Context base) {
        super.attachBaseContext(base);
        MultiDex.install(this);
    }
}
于 2018-03-10T02:13:06.270 回答