大家有没有感觉,在开发过程中,如果是纯 java 项目,等项目越来越大之后,编译的时间也越来越长!
如果添加了 kotlin ,编译会变的更慢!
kotlin配置
在跟 gradle 中添加配置
buildscript {
ext.kotlin_version = '1.3.50'
//...code
dependencies {
classpath 'com.android.tools.build:gradle:3.6.0-alpha12'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
}
}
在 build.gradle中添加配置
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
apply plugin: 'kotlin-kapt'
dependencies {
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:2.0.0"
}
这样我们就可以使用 kotlin 进行开发了。
优化
其实 google 为了让 kotlin 编译更快,做了很多优化措施!在 kotlin 版本的升级过程中一直在优化~
Kotlin 1.2.20
缓存kapt任务
目前默认情况下,对于kapt的缓存是禁用的,即使是使用-build-cache,因为Gradle没法为注解处理器映射输入和输出。
通过在kapt配置中设置useBuildCache,您可以显式地启用Kotlin注解处理任务的构建缓存。
kapt {
useBuildCache = true
}
Kotlin 1.2.60
使用 Gradle workers:
对 worker 进行了优化,使编译更快!
kapt.use.worker.api=true
Kotlin 1.3.20
支持的 Gradle 最低版本是 4.1,相应的 Android Graldle Plugin 则是 3.0。
通过并行任务来构建更快的Gradle
Kotlin Gradle插件现在可以在项目中并行执行任务。而Gradle Worker API支持并行执行。将以下配置添加到gradle.properties或local.properties文件中以启动该功能:
kotlin.parallel.tasks.in.project=true
这个功能对于自定义了源文件路径的项目非常有用,原本独立的源路径都支持并行编译了。 对于多平台项目,也可以对不同目标平台并行构建。 而Android,debug和release的编译任务可以并行执行。
性能
除了减少内存占用并提高运行时性能之外,此版本还为范围遍历带来了编译器优化,使迭代速度更快。
跳过Kapt编译
在Gradle中为kapt Kotlin任务增加了对Compile Avoidance的支持,从而提高了构建速度。 当kapt缓存没有发生更改并且只有方法体在依赖关系中发生变动时,它会跳过其编译。如下设置
kapt.include.compile.classpath=false
在gradle.properties中启用。但请注意,该设置还会关闭编译类路径中的AP发现,但如果将AP添加到kapt *配置,则不会对你有任何影响。
在后续版本中会默认开启这个配置。
Kotlin 1.3.30
KAPT 支持注解处理器增量编译
KAPT 已经支持注解处理器增量编译,该特性仍处灰度实验阶段,你可以通过在gradle.properties中添加以下配置来启用它:
kapt.incremental.apt=true
需要指出的是,在现有版本中引入任何非增量编译的注解处理器或者依赖的变化(截止目前,包括内部声明的修改)都会导致该模块的注解处理过程退化为非增量模式。
后续会持续跟进该项功能的完善。
调试功能的提升
当你在调试协程代码时,你可以看到有一个单独的异步堆栈 “Async stack trace” 显示挂起时的变量。看一个例子:
当程序在 suspend 函数或者 Lambda(例子的第 13行)中的断点停止时, “Async stack trace” 显示了变量在上一次挂起时的状态(12行)。你可以浏览 suspend 函数在当前协程中从上一个挂起点的全部的堆栈 (第12、4行)并确认变量的值:
这会帮助你更方便的理解当前协程的运行状态。
在调试 Kotlin 代码时,你可以选择 “Kotlin” 模式来查看变量。点击 Kotlin icon,你就可以看到变量的 Kotlin 名字,而不是底层的 Jvm 名字:
指定 JVM 字节码版本为 9 – 12
如果你的程序运行在 JVM 9, 10, 11, 或者 12 等版本下,你可以设置 jvmTarget到对应的版本了。这个设置会影响生产的 class 文件的字节码版本,它们不是后向兼容的,这一点请注意。相比之下,新目标版本不会有任何字节码优化也不会有任何新特性,不过这种情况不会长久的。
android{
// work-runtime-ktx 2.1.0 and above now requires Java 8
kotlinOptions {
jvmTarget = "1.9"
}
}
Java 编译器选项
Kapt 使用 Java 编译器来运行注解处理器。 以下是将任意选项传给 javac 的方式:
kapt {
javacOptions {
// 增加注解处理器的最大错误次数
// 默认为 100。
option("-Xmaxerrs", 500)
}
}
非存在类型校正
一些注解处理器(如 AutoFactory)依赖于声明签名中的精确类型。默认情况下,Kapt 将每个未知类型(包括生成的类的类型)替换为 NonExistentClass,但你可以更改此行为。将额外标志添加到 build.gradle 文件以启用在存根(stub)中推断出的错误类型:
kapt {
correctErrorTypes = true
}
Kotlin 1.3.40
Kotlin/Native
在内存管理器中包含了一些改进以提高Kotlin/Native应用程序的性能。从基准测试中观察到性能提升了将近两倍。
Kotlin 1.3.50
改进的Java到Kotlin转换器
新的Java-to-Kotlin转换器改进版本尝试根据代码中的Java类型用法更正确地推断可空性。请注意,没有目标可以产生100%无错误的代码。目的是减少编译错误的数量,并使生成的Kotlin代码更易于使用。新的转换器也修复了许多其他已知的错误。例如,它现在可以正确处理隐式Java类型转换。
注意点
在 kotlin 开发中,会碰到各种问题,尤其是下面文件在打包的时候或者编译的时候会报错,如果遇到问题,请添加如下代码:
android{
lintOptions {
abortOnError false//防止错误提示影响打包的流程
}
packagingOptions {
//http://leoray.leanote.com/post/gradle_dependencies
//https://codelabs.developers.google.com/codelabs/android-room-with-a-view-kotlin/#2
exclude 'META-INF/atomicfu.kotlin_module'
pickFirst 'META-INF/kotlinx-io.kotlin_module'
pickFirst 'META-INF/atomicfu.kotlin_module'
pickFirst 'META-INF/kotlinx-coroutines-io.kotlin_module'
pickFirst 'META-INF/kotlinx-coroutines-core.kotlin_module'
}
}
总结
把上面的配置都加上, kotlin 的编译会快的起飞~
快到自己的项目中配置起来~
如果你喜欢我的文章,可以关注我的掘金、公众号、博客、简书或者Github!
简书: https://www.jianshu.com/u/a2591ab8eed2
GitHub: https://github.com/bugyun
Blog: https://ruoyun.vip
掘金: https://juejin.im/user/56cbef3b816dfa0059e330a8/posts
CSDN: https://blog.csdn.net/zxloveooo
欢迎关注微信公众号