为什么要迁移
因为kapt的编译速度很慢,而为什么慢?
APT android-apt annotationProcessor kapt KSP科普
APT(Annotation Processing Tool)
这个东西只在编译的时候使用,不会打包到apk中-
android-apt
在Java时代 代码编译期间我们可以通过注解的方式去生成代码,最开始的时候我们使用android-apt(个人开发者开发的)只支持javac的方式
需要引入插件classpath'com.neenbedankt.gradle.plugins:android-apt:1.8'
-
annotationProcessor
后来谷歌在Android Gradle 插件 2.2 出了个APT代替android-apt就是annotationProcessor 可以直接使用不需要引入插件同时支持Javac和Jack的方式编译,其他功能基本与android-apt相同APT的流程上分为
代码扫描找到注解 -> 根据注解处理操作 -> 生成Java代码
-
kapt
顾名思义就是你使用Kotlin就用它, annotationProcessor只支持Java
使用的时候,需要添加插件apply plugin: 'kotlin-kapt'
kapt流程上分为
kotlin源码 -> 生成Java Stubs -> APT(上面那个扫描生成) -> 生成源码
然后当你的项目用了ButterKnife greendao ARouter Glide Hilt Dagger等框架 然后又用上了kapt你会发现编译速度变得极其缓慢,究其原因就是在生成Java Stubs 的时候耗费了大量时间
-
KSP
就是谷歌新出的为了解决kapt缓慢的方案KSP流程上分为
kotlin源码 -> KSP -> 生成源码
少了一个步骤毫无疑问会快了官方说 “速度提高多达2倍”
开始迁移
- 首先Project下的build.gradle kt的版本必须对应ksp的版本
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.8.10"
classpath 'com.google.devtools.ksp:symbol-processing-api:1.8.10-1.0.9'
- 模块下的build.gradle
plugins {
id 'com.google.devtools.ksp' version '1.8.10-1.0.9'
}
- kapt改成ksp
kapt 'androidx.room:room-compiler:2.5.0'
dependencies {
ksp 'androidx.room:room-compiler:2.5.0'
}
- 删除kapt
apply plugin: 'kotlin-kapt' - 删除kapt配置
然后就是结局各种坑
- Could not find method ksp() for arguments
出现这个就是没有下载下来一般是gradlePluginPortal()这个的原因
或者就是model配置的版本不正确
settings.gradle
pluginManagement{
repositories{
gradlePluginPortal()
google()
mavenCentral()
}
}
dependencyResolutionManagement {
repositories {
google()
mavenCentral()
}
}
然后很多库要由Transform升级到了AsmClassVisitorFactory才支持KSP 然后你就被迫配升级Gradle8.0
Kotlin Symbol Processing API | Kotlin Documentation (kotlinlang.org)
所以你就必须使用Giraffe版本的Android Studio
以下是具体配置
gradle-wrapper.properties
distributionUrl=https\://services.gradle.org/distributions/gradle-8.0-bin.zip
project build.gradle
classpath 'com.android.tools.build:gradle:8.1.0-alpha11'
model build.gradle
删除 buildToolsVersion
id 'com.google.devtools.ksp' version '1.8.10-1.0.9'
kotlinOptions {
jvmTarget = JavaVersion.VERSION_17
}
compileOptions {
kotlinCompilerExtensionVersion = "1.4.2"
sourceCompatibility JavaVersion.VERSION_17
targetCompatibility JavaVersion.VERSION_17
}
以上完成基本上就能用了
然后是不兼容的库需要处理
aRouter建议迁移到 TheRouter有工具可以一键迁移
目前能用的版本
cn.therouter:plugin:1.1.3-rc3
id 'therouter'
implementation "cn.therouter:router:1.1.3-rc3"
ksp "cn.therouter:apt:1.1.3-rc3"
greendao建议直接换room
ButterKnife建议使用插件干掉