Android Multidex使用,方法数超过“65536”问题的解决方式
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类,请按如下方式对其进行更改以扩展 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' ... } } }