Andorid&Kotlin编译速度原理剖析(上)

@get:Optional

abstract val versionName: Property<String?>

//版本号

@get:Input

@get:Optionalabstract

abstract val versionCode: Property<Int?>

//父类NonIncrementalTask的唯一抽象方法,也就是BuildConfig的主要逻辑处理方法

override fun doTaskAction() {

//获取类里面的属性包括一些自定义的属性

val buildConfigData = BuildConfigData.Builder()

.setBuildConfigPackageName(buildConfigPackageName.get())

.apply {

//此处省略了BUILD_TYPE、FLAVOR、DEBUG等属性的获取,思路是一样的

if (hasVersionInfo.get()) {

versionCode.orNull?.let {

addIntField(“VERSION_CODE”, it)

addStringField(“VERSION_NAME”, “${versionName.getOrElse(”“)}”)

}

}

//

val generator: GeneratedCodeFileCreator =

if (bytecodeOutputFile.isPresent) {

//创建一个JVM字节码BuildConfig,Kotlin版本进行了改造

BuildConfigByteCodeGenerator(byteCodeBuildConfigData)

} else {

//创建一个java文件的BuildConfig,java版本的GenerateBuildConfig一直是这种方案

BuildConfigGenerator(sourceCodeBuildConfigData)

}

}

//调用内部实现类,用JavaWriter创建 generator.generate()

}

}

复制代码

可以看到GenerateBuildConfig已经改成了Kotlin,同时其他的系统Task也都变成了Kotlin版本。看来谷歌也是下了血本了。Kotlin的相关知识比如协程、suspend、非阻塞式挂起函数、扩展函数、泛型也会写一些文章欢迎点赞关注,给作者一些动力。言归正常可以看到GenerateBuildConfig继承了NonIncrementalTask,这个父类也是Kotlin版本改造后才有的基本上其他的系统Task也都继承于这个类。主要作用是一个增量编译处理类。内部有一个抽象方法doTaskAction,也就是GenerateBuildConfig里面的主要逻辑实现方法。同时还有个cleanUpTaskOutputs方法在doTaskAction之前调用,主要作用于确保在任务运行之前删除任务输出。

生成Java类的主要逻辑流程:

doTaskAction–>buildConfigData -->BuildConfigGenerator–>JavaWriter

复制代码

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值