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

时间:2014-10-28 13:34:07

标签: android gradle multidex android-multidex

我想使用新的Multidex支持库来破解我的某个应用的方法限制。

借助Android Lollipop,谷歌推出了一个multidex支持库,可以轻松实现多索引。

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

14 个答案:

答案 0 :(得分:260)

修改

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 {
    compile '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.

答案 1 :(得分:43)

启动多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构建一个多dexed 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找到更多信息。

答案 2 :(得分:17)

简单,为了启用multidex,你需要......

android {
compileSdkVersion 21
buildToolsVersion "21.1.0"

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

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

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

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

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

答案 3 :(得分:9)

build.gradle 中添加此依赖项:

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

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

multiDexEnabled true

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

public class AppConfig extends MultiDexApplication {
现在你很高兴去!如果您需要它,MultiDexApplication所做的全部是

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

答案 4 :(得分:5)

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

对于minSdk> = 21

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

对于minSdk <21

在您的模块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>

答案 5 :(得分: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

它会工作!感谢。

答案 6 :(得分: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'
        }
    }
}

答案 7 :(得分:1)

使用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使用代码收缩。

答案 8 :(得分: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> 

答案 9 :(得分:0)

添加到AndroidManifest.xml:

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

OR

MultiDex.install(this);

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

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

在build.gradle中添加multiDexEnabled = true

defaultConfig {
    multiDexEnabled true
}

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

答案 10 :(得分:0)

build.gradle

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

AndroidManifest.xml

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

答案 11 :(得分:0)

以上所有答案都很棒

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

compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
}

答案 12 :(得分:-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****
     }
}

答案 13 :(得分:-2)

Multi_Dex.java

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