@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
复制代码
生成字节码类的主要逻辑流程:
doTaskAction–>buildConfigData -->BuildConfigByteCodeGenerator–>ClassWriter
复制代码
主要流程拆分
-
生成buildConfigData类,这是一个Builder的设计模式
-
添加一些默认的属性比如:BUILD_TYPE、FLAVOR、DEBUG等
-
isPresent则生成BuildConfigByteCodeGenerator否则生成BuildConfigGenerator
-
如果是BuildConfigGener