Android Plugin DSL Reference 参考文档 :
DexOptions ( build.gradle#android#dexOptions ) 文档位置 : https://google.github.io/android-gradle-dsl/2.3/com.android.build.gradle.internal.dsl.DexOptions.html
dx 工具的 --minimal-main-dex 参数指的是 最小化生成 主 dex 文件 , 也就是只有我们配置的必须放在 main dex 中的类才放入 , 其它的类放到第二个分包 classes2.dex 中 , 也就是将少数的类封装到 main dex 中 , 大部分类封装到其它的 dex 文件中 ;
只有必须在 main dex 文件 classes.dex 的类才封装进去 , 如 dalvik 虚拟机 , java.utils 包中的类 , android.os 包中的相关类 , 还有我们配置的类 等等 ;
在插件化 / dex 加密 中经常使用该配置 , 将宿主应用 / 壳应用 相关的类封装到 main dex 中 , 将其它类封装到其它的 dex 文件中 ;
–minimal-main-dex 配置原型 :
--minimal-main-dex: only classes selected by --main-dex-list are to be put
in the main dex.
在 app 目录下 , 创建 " keep_in_main.txt " 文件 , 配置如下内容 :
com/example/classloader_demo/MainActivity.class
在 " build.gradle # android # buildTypes # debug " 下 , 配置 多 dex 以及保留文件 ;
android {
buildTypes {
debug {
debug {
multiDexEnabled true
multiDexKeepFile file('keep_in_main.txt')
}
}
}
}
在 " build.gradle # android # dexOptions # additionalParameters " 下 , 配置 --minimal-main-dex 参数 , 使 main dex 字节码文件最小化 , 即保留必须的类 , 其它的类全部放到 classes2.dex 字节码中 ;
android {
buildTypes {
debug {
debug {
multiDexEnabled true
multiDexKeepFile file('keep_in_main.txt')
}
}
}
dexOptions {
additionalParameters '--minimal-main-dex'
}
}
效果展示 : 查看编译后的 apk 文件 , 在 主 dex 字节码文件 classes.dex 中 , 只有必要的文件 , 如下图所示 ;
其中就包括了我们在 " keep_in_main.txt " 文件中配置的 com/example/classloader_demo/MainActivity.class 字节码类 ;
与应用启动无关的 , 非必要的 Java 类 , 都打包到了 classes2.dex 文件中 ;