参考一下文章:
http://www.tuicool.com/articles/aiAf6f
http://blog.csdn.net/zhangbuzhangbu/article/details/52770939
https://stackoverflow.com/questions/33787030/android-studio-issue-in-build-gradle-uncaught-translation-error-executionexcep
Android开发中经常会遇到方法数超过“65536”问题,这个问题是在大型项目中,比如引用了众多第三方库之后,几乎不可避免的问题。
在网上找了MultiDex分包方法,也跳过很多坑,基本都是编译的时候,要么log各种错,要么编译时间太长没有结果,要么oom,GC……..废话不多说,直接说完整的步骤:
首先,在app\build.gradle里面配置MultiDex,如下:
1.在android的defaultConfig里面添加:
multiDexEnabled true
2.在android里添加dexOptions(防止编译的时候oom、GC):
dexOptions {
javaMaxHeapSize "4g"
}
3.在dependencies里添加依赖:
compile 'com.android.support:multidex:1.0.0'
效果如下图:
然后在 AndroidManifest.xml 中给 application 节点添加对 MultiDexApplication 类的引用:
"1.0" encoding="utf-8"?>
"http://schemas.android.com/apk/res/android"
package="xxx">
...
android:name="android.support.multidex.MultiDexApplication">
...
注意:如果你的项目使用了继承 Application 的类,那么你需要在这个类中重写 attachBaseContext() 方法并调用 MultiDex.install(this) 来启用 multidex ,AndroidManifest里的application中的name对应的值改为你这个自定义的类。
public class XXX extends Application{
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
MultiDex.install(this);
}
}
另外网上还看到一个方法就是不继承 Application ,而是直接继承 MultiDexApplication ,这样就不需要重写 attachBaseContext() 方法了。
这样就可以了,不过其实还缺少一步,就是可能会遇到的情况是有些类没有直接引用而并没有打包到dex当中导致classes not found出错,这是在开启multiDex时,多个dex文件中的类是被gradle脚本分配的,而且app在启动时,首先加载的是MainDex。有时候我们需要设定某些类被放到MainDex中,如题如下:
在build.gradle中开启multiDex,并指定配置文件,(注意multiDexKeep.pro和multiDexKeep.txt文件需要自己创建,放在项目的app文件夹下)
multiDexEnabled true
multiDexKeepProguard file('multiDexKeep.pro') // keep specific classes using proguard syntax
multiDexKeepFile file('multiDexKeep.txt') // keep specific classes
配置multiDexKeep.pro文件(语法和proguard-rules.pro一样,作用也是混淆相关)
#system相关
-keepclassmembers class fqcn.of.javascript.interface.for.webview {
public *;
}
配置multiDexKeep.txt文件,指定类即可,这个是保留在MainDex里的类
com.xxx.xx.xxxxxxx.class
com.xxx.xx.xxx.class
com.xxx.xx.xxxx.class