官网镇楼 为方法数超过 64K 的应用启用 MultiDex | Android 开发者 | Android Developers
为什么需要 multidex
单个 DEX 文件内可引用的方法总数不能超过 65536。
怎么使用
1 添加依赖
dependencies {
def multidex_version = "2.0.1"
implementation 'androidx.multidex:multidex:$multidex_version'
}
2 app下的 build.gradle 添加
defaultConfig {
//其他的忽略
//enable multidex
multiDexEnabled true
}
3 指定 Application 为 MultiDexApplication
在项目注册文件中,指定 Application 为 MultiDexApplication
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.myapp">
<application
android:name="android.support.multidex.MultiDexApplication" >
...
</application>
</manifest>
但是这种方式的局限是,应用的 Application 都是自定义的,直接指定为 MultiDexApplication 就不能做某些初始化等。
于是可修改为应用的 Application 继承 MultiDexApplication:
public class MyApplication extends MultiDexApplication { ... }
继承的方式也有局限,所以推荐这种方式:
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
}
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
//enable multidex
MultiDex.install(this);
}
}
指定主dex要打包的文件
创建 my_multidex_list.txt 文件,名称任意命名。这个文件里指明的文件就会打包到主 dex 。
my_multidex_list.txt 与 build.gradle 文件在同一目录下。
不放在同一目录也可以,但是要保证 multiDexKeepFile file ()
语句找得到 my_multidex_list.txt 文件。
multidex 的相关类必须放进去,否则会报错。
按照规则添加需要打包进去的类。
// multidex
androidx/multidex/MultiDex$V14$ElementConstructor.class
androidx/multidex/MultiDex$V14$ICSElementConstructor.class
androidx/multidex/MultiDex$V14$JBMR11ElementConstructor.class
androidx/multidex/MultiDex$V14$JBMR2ElementConstructor.class
androidx/multidex/MultiDex$V14.class
androidx/multidex/MultiDex$V19.class
androidx/multidex/MultiDex$V4.class
androidx/multidex/MultiDex.class
androidx/multidex/MultiDexApplication.class
androidx/multidex/MultiDexExtractor$1.class
androidx/multidex/MultiDexExtractor$ExtractedDex.class
androidx/multidex/MultiDexExtractor.class
androidx/multidex/ZipUtil$CentralDirectory.class
androidx/multidex/ZipUtil.class
androidx/swiperefreshlayout/widget/CircularProgressDrawable$ProgressDrawableSize.class
androidx/versionedparcelable/NonParcelField.class
androidx/versionedparcelable/ParcelField.class
androidx/versionedparcelable/VersionedParcelize.class
androidx/viewpager/widget/ViewPager$DecorView.class
// 我添加的
com/luo/multidexdemo/MyApplication.class
com/luo/multidexdemo/MainActivity.class
在 app 的 build.gradle 下添加
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
multiDexKeepFile file ('my_multidex_list.txt')
}
}