原文作者:炸鸡叔
博客:https://juejin.im/post/5cd133af6fb9a0323a01ca84

前言

团队使用kotlin挺长时间了,一直以来都不太满意kotlin的编译速度,但是也能忍受。最近开了一个新项目,有不少同事从java过来的,他们就实在是受不了,优化编译速度就变得很重要了。

优化之前和之后的对比

在优化之前我们的一次完整编译时间是2分21秒

具体的耗时任务在Run Tasks中:

可以看到具体的耗时任务如上,主要是kapt相关的编译和编译kotlin代码,以及最后的transformClassedWithXXX。

优化之后的完整编译时间31s

优化之后的增量编译时间15s

看完这里大家是不是已经开始直呼,**,这样也可以!别着急,下面就带大家一起来搞一搞,好东西一定要分享不是吗?

觉得文章不错的小伙伴欢迎关注专栏Android高级进阶,我会定期分享Android知识点及解析,还会不断更新的BATJ面试专题,欢迎大家前来探讨交流,如有好的文章也欢迎投稿。

Android高级进阶​zhuanlan.zhihu.com

优化步骤

1.优化gradle配置:

在项目根目录创建一个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

在上面的配置中,我们首先调整了gradle的配置,然后开启了缓存和kotlin和kapt的增量编译。

如果项目中使用了kapt请使用最新版本的kapt,当前写该文章时kapt的最新版本为1.3.31

2.优化app的build.gradle

1.在项目的app目录中的build.gradle文件中修改:

//如果有用到kapt添加如下配置
kapt {
useBuildCache = true
javacOptions {
option("-Xmaxerrs", 500)
}
}//在Android代码块中添加如下配置:(可优化最上图中transformClassDexBuilderForDebug的时间)
android {
dexOptions {
preDexLibraries true
maxProcessCount 8
}
}

2.其他不太重要的优化,好像对时间影响不算特别大

优化版本号的配置,如果是debug版本不要使用动态版本号

//原配置
defaultConfig {
...
minSdkVersion 19
targetSdkVersion 28
versionCode gitVersionCode
versionName currentName
...
}
//修改为
defaultConfig {
...
minSdkVersion 19
targetSdkVersion 28
versionCode 1
versionName "1.0.0"
...
}
applicationVariants.all { variant ->
...
if (variant.buildType.name == "release") {
versionName = currentName
versionCode = gitVersionCode
}
...
}

以前我们的配置上versionCode是使用的git的提交次数作为版本号的,在本地debug状态的时候其实最好是写死版本号,如果版本号变化会导致需要重新生成Manifest文件以及完整的编译应用,导致InstantRun无法使用(PS其实我们一直没用InstantRun)。所以修改为写死版本号,然后在applicationVariants中判断如果是release才使用正常的版本号。然后还有一个就是使用依赖版本的时候,尽量不要使用+号的版本依赖,使用固定版本号速度会更快。

希望大家省下的编译时间,能够好好陪陪家人。 如果觉得不错的朋友也请帮我点个关注,你的喜欢是我最大的动力~

accessibility-service 高版本无法编译_今天我把APP的编译速度缩短了近5倍相关推荐

  1. 在高版本chrome播放摄像头实时RTSP视频流,并抓图、录像、回放、倍速等

    近期研究在VUE中播放RTSP实时视频,客户要求延迟低于300毫秒,并且要求支持多路同时播放,支持H.265格式视频,比较了下目前市场上常见的几种方案,以供大家参考! 一.海康威视官方WEB解决方案: ...

  2. java半解释半编译_编译型语言、解释型语言、半编译半解释型语言

    计算机不能直接理解任何除机器语言以外的语言,所以必须要把程序员所写的程序语言翻译成机器语言,计算机才能执行程序.将其他语言翻译成机器语言的工具,被称为编译器. 编译器翻译的方式有两种:一种是编译,一种 ...

  3. java虚拟机编译_[四] java虚拟机JVM编译器编译代码简介 字节码指令实例 代码到底编译成了什么形式...

    前言简介 前文已经对虚拟机进行过了简单的介绍,并且也对class文件结构,以及字节码指令进行了详尽的说明 想要了解JVM的运行机制,以及如何优化你的代码,你还需要了解一下,java编译器到底是如何编译 ...

  4. 加拿大达内科技_美股继续暴跌模式 达内教育却“暴走”股价近翻倍

    北京时间2月28日消息,美股继续暴跌模式,隔夜美股再次大幅下挫,本周,道指已经狂泄3200点,不过,中概股达内教育本周却丝毫没有受大盘暴跌的影响,在本周连续三天暴涨,股价接近翻倍.截至收盘,达内教育涨 ...

  5. 打印倍数_英语精读:3d打印的速度有望提高到100倍

    今天分享一篇来自<经济学人>Espresso的短文"Light work: 3D printing".先来说说Espresso,这是<经济学人>推出的新闻早 ...

  6. android serviceconnection 码源分析,Android 7.0以上Accessibility Service DispatchGesture调用流程...

    概述 Accessibility Service被广泛用于各类自动点击的app,但早期,它并没有提供丰富的API,受到控件的高度约束,能达成的效果与Instrumentation相去甚远. Andro ...

  7. 深入探索编译插桩技术(一、编译基础)

    前言 成为一名优秀的Android开发,需要一份完备的知识体系,在这里,让我们一起成长为自己所想的那样~. 现如今,Gradle + 编译插桩 的应用场景越来越多,无论是 各种性能优化中的插件工具制作 ...

  8. python游戏中调整箭头下落速度_入门 | 三行Python代码,让数据预处理速度提高2到6倍...

    原标题:入门 | 三行Python代码,让数据预处理速度提高2到6倍 选自TowardsDataScience 作者:George Seif,机器之心编译 在 Python 中,我们可以找到原生的并行 ...

  9. as工程放到源码编译_关于AS高版本SDK编译生成的apk放入低版本android源码中集成编译...

    做dfu功能的时候,遇到的这样一个问题.添加了dfu的依赖之后,会要求编译的sdk为28,我的AS版本默认生成的是27.然而target版本是25. // The DFU Library is imp ...

最新文章

  1. 联想拯救者Y9000-ubuntu-nvidia-驱动安装
  2. 跟我学Spring Cloud(Finchley版)-07-Ribbon入门
  3. 智源-计算所虚假新闻检测大赛 | 探秘假新闻中的视觉信息
  4. 简单了解线程和进程、多进程和多线程、并发和并行的区别
  5. mysql建模之前需要会什么_mysql – 什么是建模我简单表的最佳方法?
  6. c语言多线程转python多线程,一个Socket能否被多线程写入(转)
  7. go append 方法_Go 的 append 操作是线程安全的吗
  8. 哈夫曼树【最优二叉树】【Huffman】
  9. windows7 上搭建NFS服务器--haneWIN
  10. 计算机设置新用户名和密码怎么设置路由器,怎么修改无线路由器密码和用户名【图】...
  11. boren -飞机大战6
  12. android pppd参数介绍,android 3G pppd 调试记录
  13. yyyy-MM-dd HH:mm:ss和时间戳之间的转换
  14. 【特征工程】词袋模型/TF-IDF模型/词汇表模型的代码实现(文本特征提取)
  15. web前端需要学习什么?需要掌握什么技术
  16. anaconda环境配置pytorch总结,GPU调用失败方法总结
  17. 在线时间戳计算时间差
  18. 『摄影知识』自然光的应用
  19. 各个省市对应车牌号字母
  20. Chip天线(WiFi/蓝牙陶瓷芯片天线) 选型

热门文章

  1. 一阶电路暂态响应的结果分析。_【2020考研】南京邮电大学813《电路分析》考试大纲...
  2. wps里为什么没有华文楷体_【上寮金贝幼儿园父母课堂】“为什么老师发的照片里没有我家孩子?”...
  3. 澳网:公茂鑫/张择创历史 中国男网夺大满贯首胜
  4. 解决Oracle 本地可以连接,远程不能连接问题
  5. 并发框架Disruptor
  6. node.js调用ejs模板,在浏览器上打印出ejs模板内代码的解决方案
  7. 终于解决H3C交换机reset saved-configuration后不能启动的问题
  8. 为什么统计学家应该关注数据挖掘
  9. iOS初级开发学习笔记:APP生命周期的学习总结
  10. UEFI和Legacy及UEFI+Legacy的区别 做系统时注意事项