KSP 与 KAPT:KSP 为何更快
比较 KSP 和 KAPT 的处理模型,并理解其性能优势。
KSP 与 KAPT:KSP 为何更快 是 CoddyKit 上的免费 Kotlin Academy 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Kotlin Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Kotlin Academy 课程共包含 4 节课。
注解处理的问题
注解处理器会在构建时生成代码。多年来,Kotlin 项目一直使用 KAPT——Kotlin 注解处理工具——它会先将 Kotlin 源代码转换为 Java 存根,再将这些存根传递给 Java 注解处理器。这种转换开销很大。
KAPT 的工作方式
KAPT 会运行 Kotlin 编译器生成 Java 存根文件,然后在这些存根上运行 Java 注解处理器(APT),最后将所有内容一起编译。每个构建步骤都会增加延迟:
- Kotlin → Java 存根编译
- 在存根上执行 Java APT 处理
- 最终编译 Kotlin 与生成的源代码
KSP 的工作方式
KSP(Kotlin 符号处理)直接运行在 Kotlin 编译器插件接口上。它原生读取 Kotlin 抽象语法树(AST)——无需生成存根,也无需 Java 中间层。处理器实现 SymbolProcessor,并遍历 KSNode 对象。
速度比较
Google 的基准测试数据显示,在增量构建中,KSP 的速度最高可达到 KAPT 的 2 倍,在全量构建中也明显更快。这些性能提升来自对存根生成的消除;在大型项目中,存根生成可能占 KAPT 构建时间的 30%–50%。
增量处理
KSP 原生支持增量处理:只重新处理自上次构建以来发生更改的符号。KAPT 对增量处理的支持有限。对于经常进行少量更改的大型代码库,这种差异非常明显。
接口差异
KAPT 处理器实现 javax.annotation.processing.AbstractProcessor(Java 接口)。KSP 处理器实现 com.google.devtools.ksp.processing.SymbolProcessor(Kotlin 接口,并支持密封类和扩展函数等 Kotlin 原生构造)。
Kotlin 原生类型信息
由于 KSP 直接读取 Kotlin AST,因此它可以看到 KAPT 存根无法准确表示的 Kotlin 特有构造:可空性、参数默认值、扩展函数、expect/actual 声明以及内联类。
多平台支持
KSP 2.x 支持 Kotlin 多平台。单个 KSP 处理器可以为 JVM、JS 和 Native 目标生成代码。KAPT 仅支持 JVM,无法处理 KMP commonMain 源代码。
从 KAPT 迁移到 KSP
大多数常用库都提供 KSP 变体:Room(KSP)、Hilt(KSP)、Moshi(KSP)和 Dagger(部分支持)。请查阅相应库的文档。当所有处理器都完成迁移后,将构建中的 kapt("...") 替换为 ksp("..."),并移除 KAPT 插件。
plugins {
id("com.google.devtools.ksp") version "2.0.0-1.0.21"
}
dependencies {
ksp("androidx.room:room-compiler:2.6.1")
}仍需使用 KAPT 的情况
当某个库尚未提供 KSP 处理器变体时,请使用 KAPT。在同一个项目中混用 KAPT 和 KSP 是受支持的,但对于使用 KAPT 的处理器,这并不能消除 KAPT 生成存根的开销。
工具与调试
KSP 处理器可以通过 KSPLogger 记录不同严重级别的消息。生成的文件会出现在 build/generated/ksp/ 中。集成开发环境(IntelliJ / Android Studio)会突出显示生成的源代码,并支持导航到这些源代码。
快速检查
为什么 KSP 在增量构建中比 KAPT 更快?
回顾:KSP 与 KAPT
要点:
- KAPT:将 Kotlin 转换为 Java 存根,然后运行 Java APT——速度慢且仅限 JVM
- KSP:通过编译器插件原生读取 Kotlin AST——速度最高可提升至 2 倍
- KSP 支持增量处理和 Kotlin 多平台
- KSP 可以识别 KAPT 存根无法表示的 Kotlin 特有构造
- 当库支持 KSP 时,将
kapt()替换为ksp()完成迁移
常见问题解答
「KSP 与 KAPT:KSP 为何更快」课时是免费的吗?
是的 — 「KSP 与 KAPT:KSP 为何更快」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Kotlin Academy 课程的其余内容,请升级到 CoddyKit PRO。 Kotlin Academy 课程共包含 4 节课。
「KSP 与 KAPT:KSP 为何更快」这节课中我会学到什么?
比较 KSP 和 KAPT 的处理模型,并理解其性能优势。 你通过在浏览器中直接运行的动手代码来练习 Kotlin Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Kotlin Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Kotlin Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。
「KSP 与 KAPT:KSP 为何更快」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Kotlin Academy 课中编写并运行代码吗?
能。每节 Kotlin Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- KSP 与 KAPT:KSP 为何更快
- 编写您的第一个 SymbolProcessor
- 使用 KotlinPoet 生成 Kotlin 源文件
- 将 KSP 处理器集成到 Gradle 构建中