Kotlin 技术月报 | 2025 年 1 月

为了帮助社区的小伙伴们更好地了解 Kotlin 相关的最新动态,我们决定使用月报的形式,整理展示最近一个月的 Kotlin 技术动态。

月报的主要内容包括:整理展示最近一个月的最新技术动态,精选博客,精选视频以及社区活动等方面的信息。

最新动态

Kotlin 2.1.20-Beta1 已发布

What's new in Kotlin 2.1.20-Beta1

  • IDE 支持:支持 2.1.20-Beta1 的 Kotlin 插件捆绑在最新的 IntelliJ IDEA 和 Android Studio 中,无需在 IDE 中更新插件,只需在构建脚本中更改 Kotlin 版本为 2.1.20-Beta1。
  • Kotlin K2 编译器新特性:从 Kotlin 2.1.20-Beta1 开始,K2 实现的 kapt 编译器插件对所有项目默认启用。自 Kotlin 1.9.20 推出新的 kapt 插件实现以来,团队不断改进其内部实现,使其行为与 K1 kapt 相似并显著提高性能,遇到问题可暂时恢复到以前的插件实现并向问题跟踪器报告。
  • Gradle 支持情况:Kotlin 2.1.20-Beta1 与最新稳定版 Gradle 8.11 兼容并支持其功能,Gradle 8.7 至 8.11 版本均受支持,但使用 Kotlin 多平台 Gradle 插件时在 JVM 目标中调用 withJava () 函数可能会出现弃用警告,团队计划尽快修复。

此外 Kotlin 2.1.10-RC2 也已于近期发布,详情信息可见:github.com/JetBrains/k...

新版本 IDE 的启动速度变快了?原来是在背后做了这些!| 技术解析

打开项目时也许是开发者需要等待的最常见场景。IntelliJ IDEA 需要加载和同步项目、执行索引编制以及完成许多其他小任务才能启用所有实用功能。

本文介绍了在新版本 IntelliJ IDEA 中为提高性能而采取的措施,包括通过技术改进优化 IDE 性能,分阶段同步索引编制等方式优化用户性能。通过以上优化,大约 30% 的用户认为 IntelliJ IDEA 2024.2 让他们能够更快开始编码。

精选博客

Kotlin Multiplatform 2024 年总结,Kotlin 崛起的一年

2024 年是 KMP 崛起的一年,这篇文章回顾了 2024 年 Kotlin Multiplatform(KMP)的发展。

  • 社区支持:2024 年 Google I/O 官宣支持 KMP 项目,由 JetBrains 主导开发,Google Workspace 投资支持。
  • 库支持拓展:2024 年众多 Jetpack 库新增 Kotlin 多平台支持,涵盖网络、数据处理等领域。
  • 版本更新:年初 Kotlin/Wasm 发布 Alpha 版,Compose Multiplatform 同步支持;Compose Multiplatform 1.6.10 及后续版本有 iOS、Web、编译器等更新;Kotlin 2.0 引入 K2 编译器,IntelliJ IDEA 2024.3 的 K2 模式进入稳定阶段。
  • 工具革新:KMP 未来将用基于 JetBrains Fleet 定制的独立 IDE,klibs.io 平台发布,用于搜索 KMP 库。
  • 鸿蒙适配:2024 年 Kotlin 中文开发者大会讨论 KMP 适配鸿蒙,官方研究相关方案,有 Kotlin/JS 和 Kotlin/Native 两种适配思路待确定。
  • 未来展望:2025 年 JetBrains 将强化 KMP 生态,涉及升级 iOS 版本、支持 Kotlin 转 Swift 及发布独立 IDE 等。

初探 Kotlin Multiplatform Mobile 跨平台原理

文章围绕 Kotlin Multiplatform Mobile(KMM)跨平台原理展开,涵盖开发流程、编译产物、文件解析、平台关系等内容,具体如下:

  • 开发流程:在 CommonMain 用expect定义不同平台有差异的接口,在各具体平台以actual实现,之后编译、打包、发布,宿主依类型依赖对应仓库。
  • Common 层产物:包含kotlin-tooling-metadata.json、source.jar、.jar和.module等文件,.module关联 Common 层与具体平台产物信息。
  • 具体平台产物:以 iOS 平台为例,.module文件描述产物属性、依赖和文件信息 ,其编译产物有metadata.jar和.klib。
  • 关键文件解析:.klib存放ir等,.knm由.kt经特定流程生成,记录元数据,可用 IDEA 查看 。
  • iOS 与 KMM 库关系:iOS 依赖.h和二进制文件,KMM 通过cinterop等工具实现与 OC 的互操作,将.klib处理成 iOS 可用的.framework。

绝大多数人想不到的 MMKV 封装思路

文章主要介绍了 MMKV 在 Kotlin 中的封装思路与实现,形成 MMKV-KTX 库,具体如下:

  • 支持 StateFlow 类型:借鉴 LiveData 的封装方式,通过自定义委托类,重写 MutableStateFlow 读写及相关函数,结合 MMKV 缓存逻辑,实现对 StateFlow 的支持,使数据变化可通知 UI,还可使用 Flow 操作符。
  • 支持 getAllKV ():针对 MMKV 不支持 getAll () 获取键值对的问题,利用属性委托时的属性名和类型信息,通过反射实现 getAllKV ()。同时处理了懒加载属性误判问题,确保获取的数据准确。
  • 支持 Map 用法:提出用操作 Map 方式读写 MMKV 数据,对比存 JSON 字符串和给 key 加后缀两种方案,选择后者。通过特定方式获取历史数据,处理增删查改及迭代器操作,重写 equals () 函数,实现 Map 用法。
  • MMKV-KTX 库介绍:MMKV-KTX 库具备自动初始化、类型安全等特性,支持多种数据类型,可转换为 LiveData、StateFlow、Map,还支持 getAllKV ()。给出了添加依赖和使用示例。
kotlin 复制代码
fun IMMKVOwner.getAllKV(): Map<String, Any?> = buildMap {
  this@getAllKV::class.memberProperties
    .filterIsInstance<KProperty1<IMMKVOwner, *>>()
    .forEach { property ->
      property.isAccessible = true
      this[property.name] = property.get(this@getAllKV)
      property.isAccessible = false
    }
}

Compose 编译器插件原理介绍

Reverse-Engineering the Compose Compiler Plugin: Intercepting the Frontend

本文主要介绍了 Jetpack Compose 编译器插件如何改变 Kotlin 编译器的规则,包括在不同编译阶段的作用以及如何拦截编译行为等内容。

  • Jetpack Compose 编译器插件与 Kotlin 编译器的关系:Jetpack Compose 编译器插件会向 IDE 发送诊断信息以提供用户反馈,通过拦截 Kotlin 编译器的代码编译和运行时行为来实现其功能。
  • Kotlin 编译器:着重探讨较新的 FIR 前端(k2 编译器),其通过重复编译优化数据格式。
  • 插件架构:参考 2018 年 Kevin Most 演讲,介绍了编译器插件架构的构成部分。
  • Compose 插件结构:已转移到 Kotlin 仓库,分析其文件结构及前后端职责。
  • 插件拦截功能:可在 Kotlin 编译器前后端拦截编译,以特定代码为例说明不同阶段作用。
  • IDE 错误提示:解析阶段后,FIR 将信息发送至 IDE 插件,提供如 "Composable main functions are not currently supported" 等实时错误提示。

社区活动

Kotlin 中文开发者大会视频回放

Kotlin 中文开发者大会视频回放已发布,欢迎点击以下链接观看:

相关推荐
龙之叶1 小时前
Android13源码下载和编译过程详解
android·linux·ubuntu
闲暇部落3 小时前
kotlin内联函数——runCatching
android·开发语言·kotlin
大渔歌_3 小时前
软键盘显示/交互问题
android
LuiChun11 小时前
webview_flutter_android 4.3.0使用
android·flutter
Tanecious.11 小时前
C语言--分支循环实践:猜数字游戏
android·c语言·游戏
闲暇部落13 小时前
kotlin内联函数——takeIf和takeUnless
android·kotlin
张云瀚13 小时前
《Kotlin核心编程》下篇
kotlin·kotlin核心编程
Android西红柿1 天前
flutter-android混合编译,原生接入
android·flutter
大叔编程奋斗记1 天前
【Salesforce】审批流程,代理登录 tips
android
命运之手1 天前
[ Spring ] Spring Cloud Gateway 2025 Comprehensive Overview
java·kotlin·gateway·spring-cloud