ArouterKspCompiler

Introduction: Arouter KSP annotation processor
More: Author   ReportBugs   
Tags:

Arouter KSP annotation processor

GitHub stars GitHub forks GitHub issues GitHub license

ksp 分享笔记:KSP 注解处理器分享

ArouterKspCompiler 插件是对 ARouter 官方注解处理器插件(com.alibaba:arouter-compiler)的KSP(Kotlin Symbol Processing API)版本实现,旨在使用 KSP 提升 kotlin 注解的处理速度;

Kotlin Symbol Processing(KSP)是用于处理 Kotlin 编程语言中的注解的注解处理器框架;换言之,KSP 框架是面向 Kotlin 语言的 "Java 注解处理器(APT,Annotation Processing Tool)",并且 KSP 直接兼容 Java 的注解处理;KSP 注解处理器采用增量处理的方式,只处理需要更新的注解和代码,避免重新处理整个编译过程,从而显著加速了注解处理的速度;此外 KSP 可以避免类似 KAPT 中将 Kotlin 文件转化为 Java 存根的耗时操作;

Kotlin Symbol Processing (KSP) is an API that you can use to develop lightweight compiler plugins. KSP provides a simplified compiler plugin API that leverages the power of Kotlin while keeping the learning curve at a minimum. Compared to kapt, annotation processors that use KSP can run up to 2 times faster.

接入指南:

kotlin && ksp 配置

1、 导入 KSP 插件;

因 KSP 插件和 Kotlin 版本高度相关, 因此双方需要尽量匹配,附上 KSP 发布地址KSP releases;此外KSP issues下面存在很多的 BUG 修复,因此更加推荐使用高版本的 KSP、避免 KSP 框架本身的问题;这里我会打出各种版本的插件,供大家使用,如果需要其他版本的可以提 Issue;

本插件发布在Jitpack.io, 版本号可做如下参考:

kotlin 版本号 最新 ArouterKspCompiler 建议 KSP 插件版本号
1.6.10 1.6.10-1.0.7 1.6.10-1.0.4
1.7.20 1.7.20-1.0.7 1.7.20-1.0.8
1.7.22 1.7.22-1.0.7 1.7.22-1.0.8
1.8.0 1.8.0-1.0.7 1.8.0-1.0.9
1.8.10 1.8.10-1.0.7 1.8.10-1.0.9
1.8.20 1.8.20-1.0.7 1.8.20-1.0.10
1.9.10 1.9.10-1.0.7 1.9.10-1.0.13
1.9.20 1.9.20-1.0.7 1.9.20-1.0.14
2.0.0 2.0.0-1.0.24 2.0.0-1.0.24
2.0.20 2.0.20-1.0.25 2.0.20-1.0.25
2.1.0 2.1.0-1.0.29 2.1.0-1.0.29
2.1.20 2.1.20-1.0.31 2.1.20-1.0.31

升级说明:

1.0.2->1.0.3

​ 1、使用 KotlinPoet %S 优化 Autowired 长文案格式

​ 2、修复继承多个 IProvider 接口时,收集的信息缺失

1.0.3->1.0.4

​ 1、 issues8 修复泛型类中使用@Autowired 注解时,出现的泛型类型转换错误;

1.0.4->1.0.5

​ 1、 issues9 修复 Autowired 注入 lateinit String 的崩溃问题,见 String 注入代码规则

1.0.5->1.0.7

​ 1、 issues13 修复 Autowired 注入 IProvider 的 bug;

1.0.7->xxx 1、 添加 KSP2.0(koltin2.0)版本,版本号 ArouterKspCompiler 版本号跟随 KSP 版本号;

ArouterKspCompiler 中 master 分支默认使用 kotlin 1.6.10、ksp1.6.10-1.0.4, 下文中 kotlin 版本号暂时使用 1.6.10 替代, 实际使用请按照项目 kotlin 版本、上述表格灵活替换;

根目录下配置 ksp 的版本号

plugins {
    id 'org.jetbrains.kotlin.jvm' version '1.6.10' apply false
    id 'com.google.devtools.ksp' version '1.6.10-1.0.4' apply false
}

在需要使用 Arouter 的模块中添加插件和参数配置:

老方法配置 kapt 的方式如下:

apply plugin: 'kotlin-kapt'

kapt {
    arguments {
        arg("AROUTER_MODULE_NAME", project.getName())
    }
}

使用 ArouterKspCompiler 之后:

plugins {
    id 'kotlin-android'
    id 'com.google.devtools.ksp'
}
// or--> apply plugin: 'kotlin-android'
// or--> apply plugin: 'com.google.devtools.ksp'
ksp {
    arg("AROUTER_MODULE_NAME", project.getName())
}

其他参数配置类似即可

注意:纯 Java 模块(没有'kotlin-android'插件)建议直接使用 annotationProcess 导入 Arouter 原生处理器(com.alibaba:arouter-compiler)即可; 原因如下:

  • 对纯 Java 项目而言使用 Ksp 没有很大的优势,相反 KSP 可能花费更多的时间去兼容、解析 Java;
  • Ksp 虽然兼容 Java, 但是兼容性不一定完美; 如可空,可变等细节上的差异,对某些 java 信息的获取不一定精准;
  • KSP 不断在迭代, 不可避免会存在潜在的问题,因此在 java 模块中直接 Arouter 注解处理器更加安全;

但是只要使用 KSP 的话, 就需要添加'kotlin-android'插件, 否则无法触发代码生成

最后如果需要模块内的生成的 KSP 代码可以被 IDE 识别, 请在模块的 build.gradle 中任意一行进行如下的配置:

android.sourceSets.all { it.java.srcDir("build/generated/ksp/${it.name}/kotlin/") }

注:ksp 生成的代码默认会被编译到 app 壳中,但是默认对 IDE 不可见, Arouter 中生成的代码也不需要对开发者可见,这句话不是必要的;

ArouterKspCompiler 接入

项目添加 jitpack 仓库

maven { url 'https://jitpack.io' }

Arouter 模块中导入 Ksp 插件:

ksp 'com.github.JailedBird:ArouterKspCompiler:1.6.10-1.0.3'

此时编译项目,可以在模块 build 文件找到对应生成的文件, 对此大家可以通过 生成文件源码、Json 路由表文件(需开启 Doc 配置生成)等对比去检验插件功能是否正常;

增量编译及其日志

建议在 gradle.properties 开启如下三个配置

# KSP Incremental processing
# https://kotlinlang.org/docs/ksp-incremental.html#program-elements
ksp.incremental=true
ksp.incremental.log=true
# track classpath
ksp.incremental.intermodule=true

三个开关分别是:

  • 增量编译, 默认开启
  • 增量编译的相关日志, 保存文件依赖和变更记录等信息(路径:build/kspcache)
  • 我不是很熟,但是建议开启

注意事项

0、 常见问题请转到本仓库的 Issue 中查看(已置顶)

1、 纯 Java 模块直接使用 annotationProcessor 导入 Arouter 原生注解处理器即可, 不要改为 ksp 导入,避免潜在的 bug

2、 如果从纯 Java 项目迁移为 kotlin、Java 混编; 就必须使用 KSP(或者 KAPT)了,不要忘记加入kotlin-android 插件, 缺少貌似会导致不生成代码

3、 ArouterKspCompiler 内部依赖'com.alibaba:arouter-annotation:1.0.6', 按照 Arouter 目前更新状态不存在变化的可能

4、 关于混淆等其他任何配置, 直接按照 Arouter 的来就可以了

5、 本人会长期维护此代码仓库:ArouterKspCompiler , 如果有问题可以提 issue、加微信 JailedBird;如果对您有帮助, 请一键三联支持一波🤣

参考文献

Apps
About Me
GitHub: Trinea
Facebook: Dev Tools