Kotlin-KCP的应用-修改SDK版本号
背景
在 SDK 开发中,一般会暴露获取 SDK 版本号的接口,获取的版本号一般为 String 类型,比如:
1 | // sdk接口 |
上述方式可以通过在 gradle.properties
中配置版本号,然后在 build.gradle
中读取版本号生成至 BuildConfig.java
中,例如:
1 | // gradle.properties |
上述方式在 SDK 发版时只需修改 gradle.properties
中的版本号即可
但是上述方式有一个弊端:SDK 提供的版本号为 String 类型,第三方根据版本号进行适配开发时不太方便,第三方需要自己实现版本号大小的判断,笔者希望 SDK 自身可以暴露判断版本号大小的接口
方案
基于上述需求,SDK 暴露的获取版本号接口就不能返回 String 类型了,Sdk
接口修改如下:
1 | interface Sdk { |
下面是 Version
对象的定义[1],版本号规则不尽相同,以下是示例:
1 | class Version internal constructor( |
第三方进行版本适配开发时,可以如下操作,就比较方便了:
1 | val version = sdk.getVersion() |
上述方案是不是比较友好了?:happy:,不知道读者有没有发现,在哪里修改版本号呢?
细心的读者可能已经发现,Version.CURRENT
是调用的 VersionCurrentValue#get()
方法,VersionCurrentValue#get()
方法会创建 Version
对象的实例,只需要修改 VersionCurrentValue#get()
方法传入版本号即可。等下,每次发版时都要修改 VersionCurrentValue#get()
方法?
隐隐感觉到一丝不妥,要是哪次发版时忘记修改 VersionCurrentValue#get()
方法,这不惨了😢
“人非圣贤孰能无过” 呢,还是让程序帮我们生成版本号吧,同时兼容方案一:只修改 gradle.properties
即可
使用 KCP 在编译阶段修改 VersionCurrentValue#get()
方法
实现
在上篇 Kotlin-KCP的应用-第二篇 中笔者记录了搭建 KCP 环境的基本步骤,这里不再赘述,有兴趣的读者可以先看下上篇文章
上图是本项目的组织架构,简单介绍下:
-
sample:包含
Version
及测试类 -
version-plugin-gradle:kcp 中的 gradle plugin 部分
-
version-plugin-kotlin:kcp 中的 kotlin compiler plugin 部分
sample 模块不做介绍,下面主要实现其他两个模块
build.gradle.kts - project level
在项目级别的 build.gradle.kts 脚本中配置插件依赖
1 | buildscript { |
version-plugin-gradle
首先配置下 build.gradle.kts 脚本
build.gradle.kts - module level
1 | plugins { |
VersionGradlePlugin
创建 VersionGradlePlugin
实现 KotlinCompilerPluginSupportPlugin
接口
1 | class VersionGradlePlugin : KotlinCompilerPluginSupportPlugin { |
因为版本号需要在外部配置传入 Gradle Plugin,这里需要创建 VersionExtension:
1 | open class VersionExtension { |
至此 Gradle 插件编写完成
version-plugin-kotlin
接下来编写 Kotlin 编译器插件,首先配置下 build.gradle.kts 脚本
build.gradle.kts - module level
1 | plugins { |
VersionCommandLineProcessor
实现 CommandLineProcessor
1 |
|
VersionComponentRegistrar
实现 ComponentRegistrar
1 |
|
VersionClassGenerationInterceptor
1 | class VersionClassGenerationInterceptor( |
VersionClassBuilder
1 | class VersionClassBuilder( |
Multiple
1 | data class Multiple<out A, out B, out C, out D, out E>( |
VersionMethodVisitor
1 | class VersionMethodVisitor( |
应用
sample - build.gradle.kts
1 | plugins { |
Test
1 | fun main() { |
happy~
参考
参考
KotlinVersion.kt
↩︎