TheRouter 使用 KSP 处理注解


TheRouter 在1.1.4-rc2开始,已经将KSP能力合并至主分支,不再是单独的功能分支了,下面介绍一下如何使用 KSP

什么是KSP

KSP全称:Kotlin Symbol Processing。
借助官网的描述:KSP 提供了一种基于 Kotlin 的轻量级的编译期插件 API,其编译速度最快可以达到 kapt 速度的两倍。

从原理角度讲,Android项目构建过程中,可用的注解处理器总共有三种:APT、KAPT、KSP。
APT 比较好理解,就是 JDK 提供的注解处理器,通常在 Gradle 项目中不需要引入什么额外插件,只需要在依赖时使用 annotationProcessor "cn.therouter:apt:x.x.x,但是他不支持 Kotlin 注解的解析。
KAPT 最早是 Kotlin 推出的APT,用于兼容 Kotlin 代码的注解,但是他的实现比较简单粗暴,内部实际上是包了一层APT,他编译时首先处理 Kotlin 的注解解析,如果无法解析,再用APT去解析,所以相当于同一个模块,如果是Java、Kotlin混编时,会执行两遍注解解析。
KSP 是基于语法分析的注解解析,严格来讲,他不仅仅可以用来做注解解析,还可以做一些基于语法分析的事情,比如自定义的代码语法检查,相当于替代了一部分 lint 可以做的事情。正因为基于语法分析来做的,所以性能必然是比 KAPT 高,毕竟编译期一定会先走一遍语法分析。

TheRouter 的 KSP 使用

第一步

在项目中所有使用了注解的模块,对应的build.gradle文件中都需要加入如下依赖,所有模块都要添加,不能只添加子模块

注意 ,使用KSP以后,如果之前使用了kapt需要将原本的kapt依赖删掉

// Gradle7.x以下版本,这样加入 KSP插件
apply plugin: 'com.google.devtools.ksp'
// 删除之前的kapt依赖(如有)
// apply plugin: 'kotlin-kapt' 

// Gradle7.x及以上版本,提供了新的方式,也这样加入 KSP插件
// 当然,也可以继续使用上面那种方式
plugins {
    id "com.google.devtools.ksp"
    // 删除之前的kapt依赖(如有)
    //id 'org.jetbrains.kotlin.kapt'
}


dependencies {
    // 从1.1.4-rc2 开始在正式版本支持ksp,此前需要使用beta版本,但用法一致
    ksp "cn.therouter:apt:1.1.4-rc4"
    // 删除之前的kapt依赖(如有)
    // kapt "cn.therouter:apt:1.1.4-rc4"
}

第二步

在项目根目录build.gradle引入 kapt 插件的 classpath :

注意,版本号需要在KSP官网https://github.com/google/ksp/releases,找到跟自己项目中 Kotlin 版本号对应的KSP插件版本号。例如,我的 Kotlin 版本号是 1.5.31,所以 KSP 插件的版本号就使用对应的1.5.31-1.0.0

// Gradle7.x以下版本,这样加入 
buildscript {
	dependencies {
		classpath "com.google.devtools.ksp:symbol-processing-gradle-plugin:xxx-xxx"  
	}
}

// Gradle7.x及以上版本,提供了新的方式,也这样加入  
// 当然,也可以继续使用上面那种方式
plugins {
    id "com.google.devtools.ksp" version 'xxx-xxx' apply false
}

相关推荐:

跨模块依赖注入跨模块依赖注入

模块化能力支持项: 支持跨模块依赖注入 支持自定义注入项的创建规则,依赖注入可自定义参数 支持自定义服务拦截,单模块mock调试 支持...

13 mins
业务节点订阅(自动初始化)能力介绍业务节点订阅(自动初始化)能力介绍

模块化开发时,可能每个模块都有自己需要初始化的一些代码。以前的做法是把这些代码都在`Application`里声明,但是这样可能随着业务变动每次都需要修改`Application`所在模块。`TheRouter`的单模块自动初始化能力就是为了解决这样的情况,可以只在当前模块声明初始化方法后,将会在业务场景时自动被调用。

8 mins
动态化能力支持:ActionManager动态化能力支持:ActionManager

Action 本质是一个全局的系统回调,主要用于预埋的一系列操作,例如:弹窗、上传日志、清理缓存。 与 Android 系统自带的广播通知类似,你可以在任何地方声明动作与处理方式。并且所有 Action 都是可以被跟踪的,只要你愿意,可以在日志中将所有的动作调用栈输出,以方便调试使用。

6 mins