Kotlin 2.0.0 全面迁移指南

社区Android

picture.image

Kotlin 2.0.0引入了大量令人印象深刻的功能, 这对开发人员来说是一个诱人的更新. 不过, 从Kotlin 1.9.x迁移到2.0.0并不像人们希望的那样简单.

一个重大变化是, Kotlin 2.0 默认不启用KAPT, 因此必须从 KAPT 迁移到 KSP.

Kotlin 2.0.0 的主要功能

KSP取代KAPT: 抛弃 KAPT, 拥抱 KSP. KSP更快, 更高效, 能更好地与 Kotlin 代码集成, 减少注解处理开销, 缩短构建时间.

🛡️ 增强的类型系统: Kotlin 2.0.0新的类型推断和改进的空安全功能让你的代码更加健壮, 最大限度地减少运行时错误, 使你的应用更具弹性.

🎯 简化协程: 最新的协程更新简化了异步编程, 使编写和维护并发代码变得更容易--这是现代高性能应用所必须的.

🛠️ 工具和集成开发环境支持: 随着Kotlin 2.0.0, JetBrains工具支持水平的提高, 提供了更好的集成开发环境性能, 更快的索引和增强的代码分析功能, 使开发更顺畅, 更直观.

准备迁移: 更新工具

在开始迁移之前, 请确保你的开发环境是最新的:

插件

确保你拥有必要插件的最新版本. 例如, 如果你正在使用Glide, Dagger等库或任何其他依赖于KAPT的库, 请先将所有依赖库转移到 KSP. 这一主动步骤将帮助你避免在迁移过程中出现编译错误.

const val daggerVersion = "2.52"
const val glideVersion = "4.16.0"

object DaggerHilt {
    const val hiltAndroid = "com.google.dagger:hilt-android:$daggerVersion"
    const val hiltCompiler = "com.google.dagger:hilt-android-compiler:$daggerVersion"
}

object ImageLoader {
    const val glide = "com.github.bumptech.glide:glide:$glideVersion"
    const val glideCompiler = "com.github.bumptech.glide:ksp:$glideVersion"
}

object Ksp {
    const val version = "2.0.10-1.0.24"
}

object Kotlin {
    const val version = "2.0.10"
}
工具

将 Gradle 等工具更新到最新版本. 确保将 gradle-wrapper.properties 设置为兼容版本:

distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https://services.gradle.org/distributions/gradle-8.9-bin.zip
networkTimeout=10000
validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
Android Studio

确保使用最新版本的 Android Studio(目前是 Koala), 以便与 Kotlin 2.0 完全兼容.

迁移到 Kotlin 2.0.0

按照该文档一步步指导顺利过渡:

第 1 步: 在 Gradle 版本目录中添加版本和插件

首先更新项目的 libs.versions.tomlBuildSrc.kts 文件, 以包含必要的 Kotlin 和 Compose Compiler 版本.

[versions]
kotlin_version = "2.0.0"

[plugins]
compose-compiler = { id = "org.jetbrains.kotlin.plugin.compose", version.ref = "kotlin_version" }

或者, 直接在根目录 build.gradle.kts 文件中添加:

id("org.jetbrains.kotlin.plugin.compose") version Kotlin.version apply false
第 2 步: 修改根级 Gradle 文件

将 Compose Compiler 插件添加到根目录下的 build.gradle.kts 文件, 以确保它在所有模块中都可用.

plugins {
    alias(libs.plugins.compose.compiler) apply false
}

然后, 将插件应用到每个使用 Jetpack Compose 的模块:

plugins {
    alias(libs.plugins.compose.compiler)
}
第 3 步: 使用 KSP 重新编译

更新到 KSP 版本 2.0.0-1.0.22 之后, 在 Android Studio 中重新编译项目. 编译成功表明你的项目现在运行的是 Kotlin 2.0.0.

清理旧的编译器配置

迁移后, 确保删除任何过时的配置, 清理项目.

第 4 步: 移除旧的编译器版本

不再需要指定 kotlinCompilerExtensionVersioncomposeOptions 块. 删除它以避免任何冲突.

composeOptions {
    // Remove this block
    // kotlinCompilerExtensionVersion = libs.versions.compose.compiler.get()
}
第 5 步: 在使用 Compose 的模块中应用插件

每个使用 Jetpack Compose 的模块都需要显式地应用 Compose 编译器插件, 特别是如果你有自定义的 Gradle 脚本的话.

plugins {
    alias(libs.plugins.compose.compiler)
}
第 6 步: 可选 - 配置新的 Compose 编译器

要进行额外的自定义, 比如启用强跳过模式, 可以如下配置新的 Compose 编译器:

composeCompiler {
    enableStrongSkippingMode = true
}

其他小建议

  • 同步Gradle: 进行这些更改后, 将项目与 Gradle 同步, 以应用更新.
  • 全面测试: 运行你的项目并进行大量测试, 确保一切都能在新编译器下正常运行.
注意 :-

这是一个工作项目结构示例. 根据你的项目, 可能需要对步骤进行相应调整. 每个公司的 Gradle 设置都不尽相同, 因此请将本指南作为参考, 而非复制粘贴.

custom_compose_library.gradle

import Dependencies.Versions.nav_version
import Versions.hiltNavigationComposeVersion
object Versions {
 const val composeCompilerVersion = "1.5.15"
 const val bomVersion = "2024.06.00"
 const val coinVersion = "2.7.0"
 const val composeNavigationVersion = "1.5.0"
 const val accompanist = "0.34.0"
 const val hiltNavigationComposeVersion = "1.2.0"
}
object Compose {
 const val activity = "androidx.activity:activity-compose:1.9.1"
 const val viewModel = "androidx.lifecycle:lifecycle-viewmodel-compose:2.8.4"
 const val lifecycleRuntimeCompose = "androidx.lifecycle:lifecycle-runtime-compose:2.8.4"
 const val htmlText = "de.charlex.compose:html-text:1.6.0"
 const val accompanistPlaceholderMaterial = "com.google.accompanist:accompanist-placeholder-material:0.34.0"
 const val lottieCompose = "com.airbnb.android:lottie-compose:6.5.0"
 const val constraintLayout = "androidx.constraintlayout:constraintlayout-compose:1.0.1"
 const val immutable = "org.jetbrains.kotlinx:kotlinx-collections-immutable:0.3.7"
 const val navigation = "androidx.navigation:navigation-compose:${nav_version}"
 const val hiltNavigationCompose = "androidx.hilt:hilt-navigation-compose:$hiltNavigationComposeVersion"
}
object TabLayout {
 const val accompanistPager = "com.google.accompanist:accompanist-pager:${Versions.accompanist}"
 const val accompanistPagerIndicator = "com.google.accompanist:accompanist-pager-indicators:${Versions.accompanist}"
}
object Coil {
 const val coil = "io.coil-kt:coil:${Versions.coinVersion}"
 const val coilCompose = "io.coil-kt:coil-compose:${Versions.coinVersion}"
 const val coilGif = "io.coil-kt:coil-gif:${Versions.coinVersion}"
}
object ComposeNavigation {
 const val navBase = "dev.olshevski.navigation:reimagined:${Versions.composeNavigationVersion}"
 const val navHilt = "dev.olshevski.navigation:reimagined-hilt:${Versions.composeNavigationVersion}"
 const val navMaterial = "dev.olshevski.navigation:reimagined-material:${Versions.composeNavigationVersion}"
}
object ComposeBom {
 const val composeBom = "androidx.compose:compose-bom:${Versions.bomVersion}"
 const val material = "androidx.compose.material:material"
 const val material3 = "androidx.compose.material3:material3"
 const val foundation = "androidx.compose.foundation:foundation"
 const val ui = "androidx.compose.ui:ui"
 const val uiToolingPreview = "androidx.compose.ui:ui-tooling-preview"
 const val uiToolingDebug = "androidx.compose.ui:ui-tooling" // use with debugImplementation
 const val materialIconsExtended = "androidx.compose.material:material-icons-extended"
 const val windowSizeUtils = "androidx.compose.material3:material3-window-size-class:1.2.1"
}
object Paging {
 const val pagination = "androidx.paging:paging-runtime-ktx:3.2.0" // Todo Remove Later Need to update in sometime
 const val paginationCompose = "androidx.paging:paging-compose:3.3.1"
}

custom_compose.gradle


android {
  buildFeatures {
    compose true
  }
  composeCompiler {
    enableStrongSkippingMode = true
  }
}
dependencies {
  implementation platform(ComposeBom.composeBom)
  androidTestImplementation platform(ComposeBom.composeBom)
  implementation ComposeBom.material
  implementation ComposeBom.material3
  implementation ComposeBom.windowSizeUtils
  implementation ComposeBom.materialIconsExtended
  implementation ComposeBom.ui
  implementation ComposeBom.uiToolingPreview
  debugImplementation ComposeBom.uiToolingDebug
  "${DependencyConfiguration.debugNoProguardImplementation.name()}" ComposeBom.uiToolingDebug
  implementation Compose.activity
  implementation Compose.viewModel
  implementation Compose.lifecycleRuntimeCompose
  implementation Compose.constraintLayout
  implementation(Compose.accompanistPlaceholderMaterial)
  implementation(TabLayout.accompanistPager)
  implementation(TabLayout.accompanistPagerIndicator)
 
  implementation(ComposeNavigation.navBase)
  implementation(ComposeNavigation.navHilt)
  implementation(ComposeNavigation.navMaterial)
  implementation(Compose.htmlText)
  implementation(Compose.lottieCompose)
  implementation(Coil.coil)
  implementation(Coil.coilCompose)
  implementation(Compose.immutable)
  implementation(Compose.navigation)
  implementation(Compose.hiltNavigationCompose)
  implementation Kotlin.serializationJson
}
总结一下

感谢你花时间阅读本指南, 了解了如何迁移到 Kotlin 2.0.0. 如果你觉得这些信息很有价值, 请考虑点赞或与其他可能受益的人分享.

一家之言, 欢迎斧正!

Happy Coding! Stay GOLDEN!

0
0
0
0
关于作者
关于作者

文章

0

获赞

0

收藏

0

相关资源
DevOps 在字节移动研发中的探索和实践
在日益复杂的APP工程架构下,如何保证APP能高效开发,保障团队效能和工程质量?本次将结合字节内部应用的事件案例,介绍DevOps团队对移动研发效能建设的探索和思考。
相关产品
评论
未登录
看完啦,登录分享一下感受吧~
暂无评论