MultiDex使用
1.使用原因
Android开发中经常会遇到方法数超过“65536”问题,这个问题是在大型项目中,比如引用了众多第三方库之后,几乎不可避免的问题。
2.集成步骤
2.1第一步
如果您的 minSdkVersion
设置为 21 或更高值,您只需在模块级 build.gradle
文件中将 multiDexEnabled
设置为 true
,如此处所示:
android {
defaultConfig {
...
minSdkVersion 21
targetSdkVersion 27
multiDexEnabled true
}
...
}
但是,如果您的 minSdkVersion
设置为 20 或更低值,则您必须按如下方式使用
android {
defaultConfig {
...
minSdkVersion 15
targetSdkVersion 25
multiDexEnabled true
}
...
}
dependencies {
compile 'com.android.support:multidex:1.0.3'
}
2.2第二步
- 如果您没有替换
Application
类,请编辑清单文件,按如下方式设置<application>
标记中的android:name
:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="xxx">
<application
...
android:name="android.support.multidex.MultiDexApplication">
...
</application>
</manifest>
- 如果您替换了
Application
类,请按如下方式对其进行更改以扩展MultiDexApplication
:
public class MyApplication extends MultiDexApplication { ... }
- 或者,如果您替换了
Application
类,但无法更改基本类,则可以改为替换attachBaseContext()
方法并调用MultiDex.install(this)
:
public class MyApplication extends SomeOtherApplication {
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(context);
Multidex.install(this);
}
}
3.优化开发构建中的 Dalvik 可执行文件分包
为了缩短耗时更长的 Dalvik 可执行文件分包输出构建时间,请利用 productFlavors
(一个开发定制和一个发布定制,具有不同的 minSdkVersion
值)创建两个构建变型。
android {
defaultConfig {
...
multiDexEnabled true
}
productFlavors {
dev {//开发版
// Enable pre-dexing to produce an APK that can be tested on
// Android 5.0+ without the time-consuming DEX build processes.
minSdkVersion 21
}
prod {//发布版
// The actual minSdkVersion for the production version.
minSdkVersion 14
}
}
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'),
'proguard-rules.pro'
}
}
}
dependencies {
compile 'com.android.support:multidex:1.0.3'
}
4 classes not found错误
在build.gradle
中开启multiDex,并指定配置文件,(注意multiDexKeep.pro
和multiDexKeep.txt
文件需要自己创建,放在项目的app文件夹下)
multiDexKeepFile 属性
您在 multiDexKeepFile
中指定的文件应该每行包含一个类,并且采用 com/example/MyClass.class
的格式。例如,您可以创建一个名为 multidex-config.txt
的文件,如下所示:
com/example/MyClass.class
com/example/MyOtherClass.class
然后,您可以按以下方式针对构建类型声明该文件:
android {
buildTypes {
release {
multiDexKeepFile file 'multidex-config.txt'
...
}
}
}
请记住,Gradle 会读取相对于 build.gradle
文件的路径,因此如果 multidex-config.txt
与 build.gradle
文件在同一目录中,以上示例将有效。
multiDexKeepProguard 属性
multiDexKeepProguard
文件使用与 Proguard 相同的格式,并且支持整个 Proguard 语法。如需了解有关 Proguard 格式和语法的详细信息,请参阅 Proguard 手册中的 Keep Options 一节。
您在 multiDexKeepProguard
中指定的文件应该在任何有效的 ProGuard 语法中包含 -keep
选项。例如,-keep com.example.MyClass.class
。您可以创建一个名为 multidex-config.pro
的文件,如下所示:
-keep class com.example.MyClass
-keep class com.example.MyClassToo
如果您想要指定包中的所有类,文件将如下所示:
-keep class com.example.** { *; } // All classes in the com.example package
然后,您可以按以下方式针对构建类型声明该文件:
android {
buildTypes {
release {
multiDexKeepProguard 'multidex-config.pro'
...
}
}
}