一。优化具体步骤
1.在gradle.properties添加如下配置
//开启gradle并行编译,开启daemon,调整jvm内存大小
org.gradle.daemon=true
org.gradle.configureondemand=true
org.gradle.parallel=true
org.gradle.jvmargs=-Xmx4096m -XX:MaxPermSize=1024m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
//开启gradle缓存
org.gradle.caching=true
android.enableBuildCache=true
//开启kotlin的增量和并行编译
kotlin.incremental=true
kotlin.incremental.java=true
kotlin.incremental.js=true
kotlin.caching.enabled=true
kotlin.parallel.tasks.in.project=true //开启kotlin并行编译
//优化kapt
kapt.use.worker.api=true //并行运行kapt1.2.60版本以上支持
kapt.incremental.apt=true //增量编译 kapt1.3.30版本以上支持
//kapt avoiding 如果用kapt依赖的内容没有变化,会完全重用编译内容,省掉最上图中的:app:kaptGenerateStubsDebugKotlin的时间
kapt.include.compile.classpath=false
二、在app gradle添加如下配置
//kapt添加如下配置
kapt {
useBuildCache = true
javacOptions {
option("-Xmaxerrs", 500)
}
}
//在Android代码块中添加如下配置:(可优化transformClassDexBuilderForDebug的时间)
dexOptions {
preDexLibraries true
maxProcessCount 8
}
三、以上就是优化gradle编译时间的配置.其他不太重要的优化,好像对时间影响不算特别大。大家也可以根据自己的项目做针对优化。
查看自己项目中gradle编译中具体所用的时间
1.创建buildTrace.gradle文件
import java.text.SimpleDateFormat
/**
* 监控构建耗时
*
* 记录构建过程中的每个任务的耗时,并写入文件中 .build_history/buildTimeLog_yy_MM_dd_HH_mm_ss.log中
*
* 使用时将文件放在app目录下,然后在app/build.gradle中添加引用:
* apply from: "./buildTrace.gradle"
*/
class BuildTimeListener implements TaskExecutionListener, BuildListener {
private final String BUILD_LOG_FILE_DIR = ".build_history"
private final String BUILD_LOG_FILE_PATH = "buildTimeLog"
private long taskStartTime;
private long buildStartTime;
private int taskCounts = 0;
private StringBuilder sb = new StringBuilder()
private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
private SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy_MM_dd_HH_mm_ss")
BuildTimeListener() {
buildStartTime = System.currentTimeMillis()
//添加一些版本信息
// sb.append("codeTag:").append(ProjectConfig.codeTag).append("\n")
// sb.append("branch:").append(ProjectConfig.branch).append("\n")
// sb.append("versionName:").append(ProjectConfig.versionName).append("\n")
// sb.append("versionCode:").append(ProjectConfig.versionCode).append("\n")
sb.append("构建时间:" + sdf.format(new Date()) + "\n")
sb.append("开始构建----------------------\n")
}
@Override
void buildStarted(Gradle gradle) {
}
@Override
void settingsEvaluated(Settings settings) {
}
@Override
void projectsLoaded(Gradle gradle) {
}
@Override
void projectsEvaluated(Gradle gradle) {
}
/**
* 构建完成回调
* @param result The result of the build. Never null.
*/
@Override
void buildFinished(BuildResult result) {
if(taskCounts<5) return
long buildCost = System.currentTimeMillis() - buildStartTime
sb.append("构建结束----------------------\n")
sb.append("构建总耗时:" + buildCost + "ms")
//输出到文件
String text = sb.toString()
writeToFile(BUILD_LOG_FILE_PATH, text)
}
/**
* 任务执行开始
* @param task The task about to be executed. Never null.
*/
@Override
void beforeExecute(Task task) {
taskStartTime = System.currentTimeMillis();
}
/**
* 任务执行结束
* @param task The task which was executed. Never null.
* @param state The task state. If the task failed with an exception, the exception is available in this
*/
@Override
void afterExecute(Task task, TaskState state) {
long cost = System.currentTimeMillis() - taskStartTime;
System.out.println("任务:" + task.name + "," + task.path + ",耗时:" + cost);
sb.append("[" + task.path + "]:" + cost + "ms\n")
taskCounts++
}
private void writeToFile(String fname, String text) {
File dir = new File(BUILD_LOG_FILE_DIR)
if (!dir.exists()) {
dir.mkdir()
}
File file = new File(BUILD_LOG_FILE_DIR + File.separator + fname + "_" + sdf2.format(new Date()) + ".log")
file.write(text, true)
}
}
gradle.addListener new BuildTimeListener()
2.在app项目中引用
apply from: 'buildTrace.gradle'