Android 模块化最佳实践

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
}

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容