b9d8acfb5367c475302fa056842f6fc2

大家有没有感觉,在开发过程中,如果是纯 java 项目,等项目越来越大之后,编译的时间也越来越长!

如果添加了 kotlin ,编译会变的更慢!

kotlin配置

在跟 gradle 中添加配置

1
2
3
4
5
6
7
8
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中添加配置

1
2
3
4
5
6
7
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注解处理任务的构建缓存。

1
2
3
kapt {
  useBuildCache = true
}

Kotlin 1.2.60

使用 Gradle workers:

对 worker 进行了优化,使编译更快!

1
kapt.use.worker.api=true

Kotlin 1.3.20

支持的 Gradle 最低版本是 4.1,相应的 Android Graldle Plugin 则是 3.0。

通过并行任务来构建更快的Gradle

Kotlin Gradle插件现在可以在项目中并行执行任务。而Gradle Worker API支持并行执行。将以下配置添加到gradle.propertieslocal.properties文件中以启动该功能:

1
kotlin.parallel.tasks.in.project=true

这个功能对于自定义了源文件路径的项目非常有用,原本独立的源路径都支持并行编译了。 对于多平台项目,也可以对不同目标平台并行构建。 而Android,debug和release的编译任务可以并行执行。

性能

除了减少内存占用并提高运行时性能之外,此版本还为范围遍历带来了编译器优化,使迭代速度更快。

跳过Kapt编译

在Gradle中为kapt Kotlin任务增加了对Compile Avoidance的支持,从而提高了构建速度。 当kapt缓存没有发生更改并且只有方法体在依赖关系中发生变动时,它会跳过其编译。如下设置

1
kapt.include.compile.classpath=false

gradle.properties中启用。但请注意,该设置还会关闭编译类路径中的AP发现,但如果将AP添加到kapt *配置,则不会对你有任何影响。

在后续版本中会默认开启这个配置。

Kotlin 1.3.30

KAPT 支持注解处理器增量编译

KAPT 已经支持注解处理器增量编译,该特性仍处灰度实验阶段,你可以通过在gradle.properties中添加以下配置来启用它:

1
kapt.incremental.apt=true

需要指出的是,在现有版本中引入任何非增量编译的注解处理器或者依赖的变化(截止目前,包括内部声明的修改)都会导致该模块的注解处理过程退化为非增量模式。

后续会持续跟进该项功能的完善。

调试功能的提升

当你在调试协程代码时,你可以看到有一个单独的异步堆栈 “Async stack trace” 显示挂起时的变量。看一个例子:

img

当程序在 suspend 函数或者 Lambda(例子的第 13行)中的断点停止时, “Async stack trace” 显示了变量在上一次挂起时的状态(12行)。你可以浏览 suspend 函数在当前协程中从上一个挂起点的全部的堆栈 (第12、4行)并确认变量的值:

img

这会帮助你更方便的理解当前协程的运行状态。

在调试 Kotlin 代码时,你可以选择 “Kotlin” 模式来查看变量。点击 Kotlin icon,你就可以看到变量的 Kotlin 名字,而不是底层的 Jvm 名字:

img

指定 JVM 字节码版本为 9 – 12

如果你的程序运行在 JVM 9, 10, 11, 或者 12 等版本下,你可以设置 jvmTarget到对应的版本了。这个设置会影响生产的 class 文件的字节码版本,它们不是后向兼容的,这一点请注意。相比之下,新目标版本不会有任何字节码优化也不会有任何新特性,不过这种情况不会长久的。

1
2
3
4
5
6
android{ 
		// work-runtime-ktx 2.1.0 and above now requires Java 8
    kotlinOptions {
        jvmTarget = "1.9"
    }
}

Java 编译器选项

Kapt 使用 Java 编译器来运行注解处理器。 以下是将任意选项传给 javac 的方式:

1
2
3
4
5
6
7
kapt {
    javacOptions {
        // 增加注解处理器的最大错误次数
        // 默认为 100。
        option("-Xmaxerrs", 500)
    }
}

非存在类型校正

一些注解处理器(如 AutoFactory)依赖于声明签名中的精确类型。默认情况下,Kapt 将每个未知类型(包括生成的类的类型)替换为 NonExistentClass,但你可以更改此行为。将额外标志添加到 build.gradle 文件以启用在存根(stub)中推断出的错误类型:

1
2
3
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 开发中,会碰到各种问题,尤其是下面文件在打包的时候或者编译的时候会报错,如果遇到问题,请添加如下代码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
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

欢迎关注微信公众号