美文网首页
kapt迁移KSP

kapt迁移KSP

作者: KennGM | 来源:发表于2023-04-09 10:19 被阅读0次

为什么要迁移

因为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倍”

开始迁移

  1. 首先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'
  1. 模块下的build.gradle
plugins {
     id 'com.google.devtools.ksp' version '1.8.10-1.0.9'
}
  1. kapt改成ksp
    kapt 'androidx.room:room-compiler:2.5.0'
dependencies {
    ksp 'androidx.room:room-compiler:2.5.0'
}
  1. 删除kapt
    apply plugin: 'kotlin-kapt'
  2. 删除kapt配置

然后就是结局各种坑

  1. 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


目前支持KSP的库

Kotlin Symbol Processing API | Kotlin Documentation (kotlinlang.org)

Gradle插件对应表
Android studio 兼容表

所以你就必须使用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建议使用插件干掉


插件

相关文章

网友评论

      本文标题:kapt迁移KSP

      本文链接:https://www.haomeiwen.com/subject/ynduddtx.html