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

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

随着 Android Lollipop 的推出,谷歌引入了一个 multidex 支持库,使得 multidex 变得更加容易。

使用这个库和构建支持 multidex 的应用程序需要哪些步骤?

264580 次浏览

需要采取以下步骤来开始多指标检索:

将 Android-support-multidex. jar 添加到您的项目中,该 jar 可以在您的 Android SDK 文件夹/SDK/texas/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 博客上找到。

编辑:

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 {


}

更多信息,这个 是个好向导。

简单来说,为了启用 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>

如果您想在您的项目中启用 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)

启动多重指数。

最后加入你们的清单

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

建造,分级中添加这个依赖项:

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

再次在 建造,分级文件中将这一行添加到 默认配置块:

multiDexEnabled true

不要从 申请扩展应用程序类,而是从 多功能手环应用程序扩展应用程序类; 比如:

public class AppConfig extends MultiDexApplication {

现在你可以走了! 如果你需要的话,MultiDexApplication所做的就是

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

步骤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);
}
}

第三步: 更改 grade.properties

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

会成功的,谢谢。

添加到 AndroidManifest.xml:

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

或者

MultiDex.install(this);

在自定义 Application 的 attachBaseContext 方法中

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

在 build.gradle 中添加 multiDexEnable = true

defaultConfig {
multiDexEnabled true
}


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

在 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****
}
}

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

Multi _ Dex. java

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

建造,分级

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

AndroidManifest.xml

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

这里是一个截至2020年10月的 Android X 最新方法,它来自于 Android 的文档“ 为具有超过64K 方法的应用程序启用 multidex

对于 minSdk > = 21

你什么都不用做。所有这些设备都使用 Android RunTime (ART) VM,它本身支持 multidex。

对于 minSdk < 21

模组级别的 build.gradle中,确保填充了以下配置:

android {
defaultConfig {
multiDexEnabled true
}
}


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

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

例如,在 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>

以上所有的答案都很棒

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

compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}

对于 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代码收缩。

如果 minSdkVersion 设置为21或更高,则在默认情况下启用 multidex,并且不需要 multidex 库:

修改模块级 build.gradle 文件以启用 multidex 并添加 multidex 库作为依赖项,如下所示:

  android {
defaultConfig {
...
minSdk = 15
targetSdk = 28
multiDexEnabled = true
}
...
}


dependencies {
implementation("androidx.multidex:multidex:2.0.1")
}

如果重写 Application 类,则将其更改为扩展 MultiDexApplication (如果可能) ,如下所示:

public class MyApplication extends MultiDexApplication { ... }

或者,如果您确实重写了 Application 类,但是不可能更改基类,那么您可以重写 attachBaseContext ()方法和 callMultiDex.install (this)来启用 multidex:

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

更多信息请查看 这个博客