(转载)Android 方法数超过64k、编译OOM、编译过慢解决方案。
Android 方法数超过64k、编译OOM、编译过慢解决方案。
目前将项目中的leancloud的即时通讯改为环信的即时通讯。当引入easeui的时候 出现方法数超过上限的问题。
搜索一下问题,解决方法很简单。
这里简单记录一下,顺序记录一下此解决方案导致的另一个问题。
一、解决方法数超过64k的问题
问题描述:
Error:The number of method references in a .dex file cannot exceed 64K. Error:Execution failed for task ':app:transformClassesWithDexForRelease'. > com.android.build.api.transform.TransformException: com.android.ide.common.process.ProcessException: java.util.concurrent.ExecutionException: com.android.ide.common.process.ProcessException:
解决方案:
1、app目录下 build.gradle
dependencies { ..... compile 'com.android.support:multidex:1.0.1' }
2、在 defaultConfig 中添加
defaultConfig { applicationId "com.maiji.magkaredoctor" minSdkVersion 15 targetSdkVersion 25 versionCode 1 versionName "1.0" multiDexEnabled true }
3、在自己的写的继承Application的类中中添加方法
@Override protected void attachBaseContext(Context base) { super.attachBaseContext(base); MultiDex.install(this) ; }
二、编译OOM的问题
引入环信的easeui,导致编译速度突然变慢,而且编译经常OOM
查询了很多方法,测试都没有解决问题。最终解决办法
app目录下的build.gradle文件的android{} 中添加
dexOptions { incremental true javaMaxHeapSize "4g" }
另外一个提高编译速度的方法:
在app目录下的build.gradle文件的android{}中添加
tasks.whenTaskAdded { task -> if (task.name.contains("lint") || task.name == "clean" || task.name.contains("Aidl") || task.name.contains("mockableAndroidJar") || task.name.contains("UnitTest") || task.name.contains("AndroidTest") || task.name.contains("Ndk") || task.name.contains("Jni") ) { task.enabled = false } }
注意,这里是取消这些任务,比如你项目中用到了Ndk,那你就别写 task.name.contains("Ndk") 了。
切记:项目第一次编译的时候不要加这段代码,当第一次编译完之后再加,否则会出问题。