KMP 2024 年总结,Kotlin 崛起的一年
2024 Google I/O 上正式官宣了 KMP(Kotlin Multiplatform)项目,它是 Google Workspace 团队的一项长期「投资」项目,由 JetBrains 开发维护和开源的项目,简单来说,JetBrains 主导,Google Workspace 投资并提供技术支持。

当然,Kotlin Multiplatform 和 Compose Multiplatform 虽然都是 JetBrains 维护的项目,它们经常被一起提及,但是他们其实是两个项目 :
- Kotlin Multiplatform:提供了 Kotlin 的跨平台
- Compose Multiplatform:Compose UI 的跨平台框架,提供 UI 跨平台能力
用 JB 官方的话说就是:借助 Compose Multiplatform,开发者可以将 Kotlin Multiplatform 的代码共享能力推向应用逻辑之外。
而在 2024 年 Google 和 JetBrains/Kotlin 为许多 Jetpack 库添加了 Kotlin 多平台支持, 例如:
- Ktor 通过处理 REST 服务消耗来简化网络任务
- kotlinx.serialization 将数据转换为 JSON 等格式
- Okio 管理基本的文件 I/O
- SKIE 适配了类型和协程在 iOS 上的使用
- CocoaPods 集成支持使用 iOS 特定的依赖项
- Room 从版本 2.7.0-alpha01 开始 支持 Android、PC和 iOS
- Datastore 从版本 1.1.0 开始添加 KMP 支持
- Lifecycle 和 ViewModel 从 2.8.7 开始支持 Android、PC 和 iOS
- ····
回到 KMP 的迭代更新上,在今年年初,Kotlin/Wasm 发布 Alpha 版,支持将 Kotlin 代码编译为 WebAssembly, 同步 Compose Multiplatform也开始支持 Kotlin/Wasm

另外 Compose Multiplatform 在 2024 具有典型意义的更新有:
-
从 Compose Multiplatform 1.6.10 开始:
-
iOS 进入 Beta 阶段,适用于 ProMotion 120 Hz,增加原生风格控件适配
-
Web Alpha
-
Compose 编译器已合并到 Kotlin 代码库中,从而让项目支持 Kotlin 2.0 的迁移
-
-
从 1.7.0 开始:
-
iOS 相关性能优化,触摸交互优化等:

-
桌面支持
dragAndDropSource和dragAndDropTarget的拖放功能:
-
另外一个重大更新就是 Kotlin 2.0 系列发布,引入了 K2 编译器,统一了 Kotlin 支持的所有平台,所有编译器后端现在都共享大量逻辑和统一的管道,例如开发 KMP 库分发的下一代格式,让 KMP 库的开发和 JVM 库开发一样简单。

还有随着 IntelliJ IDEA 2024.3 版本开始,K2 模式正式脱离 Beta 阶段,开始进入稳定版本阶段,K2 模式显著提高了 Kotlin 代码分析的稳定性、内存的消耗效率和 IDE 的整体性能,并支持 Kotlin 2.1 语言功能等。
K2 模式代表 IDE 中对 Kotlin 支持的几乎完全重写。
K2 模式下除了编译性能的巨大提升之外,在 Kotlin 代码分析、补全和导航速度方面也取得了巨大进步:

其实这些年随着 Kotlin 的发展,其本身的性能表现已经相当不错,例如在 bddicken/languages 的语言基准测试比较的图形化展示上看,Kotlin 的整体性能表现就挺不错:

还有一个有意思的更新在于,Kotlin Multiplatform 未来将采用基于 JetBrains Fleet 定制的独立 IDE ,而在官方调整过的 Kotlin Multiplatform Roadmap 优先关键事项里,可以看到其中就包含了「独立的 Kotlin Multiplatform IDE,专为多平台开发量身定制的开发环境」的相关内容:

其实在此之前, Kotlin Multiplatform 官方就开始推荐使用 JetBrains Fleet 作为开发工具,而这次是更激进的采用基于 JetBrains Fleet 的独立 Kotlin Multiplatform IDE 的计划,其核心在于:
- Fleet 里可以在 Kotlin 代码直接跳转到对应的 Swift 代码:

- Fleet 里 rename 操作可以自动同时关联 Swift 和 Kotlin :

- 在 Fleet 里 debug 断点可以同时作用 Swift 和 Kotlin :

最后就是 klibs.io 平台发布,Klibs.io 作为 KMP Package 的 Web 服务,支持查找选定平台(JVM、Android JVM、Wasm、JS、Kotlin/Native)的特定用途的 Kotlin 多平台库,而网站的数据为来自 GitHub 和 Maven Central 的数据编制索引,并使用 AI 生成的元数据来增强搜索结果,它的目的是通过提供 KMP 相关信息来更轻松地评估库:

满足条件的情况下 klibs.io 平台自动爬出统计
当然,既然是跨平台,肯定少不了 2024 主角之一的鸿蒙, 在 2024 Kotlin 中文开发者大会里,许多大厂都分享了 KMP 适配鸿蒙的事件,而这在过去一段时间已经引起了官方的注意,Kotlin 编译组的 lead 表示,他们也在研究如何在 KMP 中支持 Harmony0S:

目前群组的讨论大概分成两部分:
- 一方提议可以通过重新使用 Kotlin/JS 编译器,直接生成 ArkTS (而不是JS),这样做可以重新使用 Kotlin/JS 生态系统中已经拥有的 TypeScript 互操作性,另一个好处是将重新使用 HarmonyOS 工具链的所有其他部分,而通过 Kotlin/Native 会有两个运行时和两个独立的垃圾回收器,维护成本更高,同时也有大佬表示,在他们 Top 级别应用下 Kotlin/JS 转换下的性能还不错。
- 而另一方则认为 Kotlin/JS 整体性能较差,国内 Top 企业在鸿蒙适配中,经常使用 C API 而不是 TS API ,因为它可以带来更好的性能,这也是为什么 Kotlin/Native 在适配中被更多 Top 企业作为最终方案的理由,所以明显 Compose + Kotlin/Native 的路线更合适,比如 ArkTS(release) 和 Kotlin/Native(release) 之间 n 体问题的性能测试下,Kotlin/Native 性能甚至可以比 ArkTS 快 10 倍。
当然最终 KMP 官方是否会确认支持,或者说才去 Kotlin/JS 还是 Kotlin/Native 方案,具体还要等 2025 的最终讨论结果。
最后,到 2025 年,JetBrains 将专注于增强 Kotlin Multiplatform 生态系统,包括将 Compose Multiplatform for iOS 升级到稳定版、Kotlin-to-Swift 导出支持和前面提到的一体化 KMP IDE 的公开版本等。
希望 2025 年 KMP 和 Compose 能正式全平台落地,感谢这个百花齐放的时代~
相关文章:
KMP 2024 年总结,Kotlin 崛起的一年
2024 Google I/O 上正式官宣了 KMP(Kotlin Multiplatform)项目,它是 Google Workspace 团队的一项长期「投资」项目,由 JetBrains 开发维护和开源的项目,简单来说,JetBrains 主导,Google Worksp…...
leecode188.买卖股票的最佳时机IV
这道题目我在买卖股票III就已经得出规律了,具体可看买卖股票的最佳时机||| class Solution { public:int maxProfit(int k, vector<int>& prices) {int nprices.size();vector<vector<int>> dp(n,vector<int>(2*k1,0));for(int j1;j&l…...
分布式消息队列RocketMQ
一、RocketMQ概述 1.1 MQ 概述 MQ,Message Queue,是一种提供消息队列服务的中间件,也成为消息中间件,是一套提供了消息生产、存储、消费全过程API的软件系统。消息即数据 1.2 MQ 用途 MQ的用途总结起来可分为以下三点 限流削峰…...
诗韵--代码之外的生活:2025 元旦歌
2025 元旦歌 1 说明2 正文3 简评 1 说明 又是一年元旦,在公司抽个空,写首诗纪念一下。 本系列博客:诗韵–代码之外的生活 2 正文 2025 元旦歌 一年又一年, 又到新元旦。 恍若零五年, 已是二五年。 工作忙连连&#x…...
SpringBoot项目启动的时候,指定jvm内存大小的3种方式
1. 通过命令行固定参数 在命令行中运行 Spring Boot 应用程序时,可以使用 -Xms 和 -Xmx 选项指定初始和最大堆内存大小。例如: java -Xms512m -Xmx1024m -jar mySpringBootApp.jar 优点: 简单明了 缺点: 是写死的,…...
学习vue3的笔记
一、vue和react的对比 1、基础介绍 vue:https://cn.vuejs.org/ vue3是2020年创建的 react:https://react.dev/ react是一个2013年开源的JavaScript库,严格意义上来说不是一个框架 2、diff算法 两个框架采用的都是同级对比策略 两节点对…...
MySQL UNION
关于《MySQL UNION》的操作,我查找到了一些有用的信息。 MySQL的UNION操作符用于将两个或多个SELECT语句的结果组合到一个结果集中,并去除重复的行。每个SELECT语句的列数和对应位置的数据类型必须相同。其基本语法格式如下: SELECT column…...
day21-ubuntu入门
小趣味docker 1.安装docker,从阿里云的yum yum install docker -y 2.需要提前准备好docker镜像,确保可用 docker -v 3.导入该游戏镜像(先用systemctl start docker) docker load < game_v2.tar 4.一条命令,在…...
开发小工具:ping地址
开发小工具:ping地址 import socketdef tcp_port_scan(ip,port):#创建套接字socksocket.socket(socket.AF_INET,socket.SOCK_STREAM)#设置超时sock.settimeout(0.2)try:#发请求result sock.connect_ex((ip,port))if result 0:print(f{ip}--{port}接口连接成功)res…...
在 Python 中使用 ADX 进行算法交易
在阅读本文前,可查阅以往文章: 技术指标-ATR 技术指标有几个分支,其中趋势指标使用最广泛。这些工具可帮助交易者确定市场趋势的方向和强度,使他们能够相应地调整交易。如果趋势指标得到有效应用,它们通常会产生积极的结果。 在…...
Unity 3D 从入门到精通:开启游戏开发的奇幻之旅
一、引言 在当今数字化的时代,游戏产业蓬勃发展,成为了全球娱乐领域的重要支柱。Unity 3D 作为一款功能强大、跨平台的游戏开发引擎,凭借其易用性、高效性和丰富的资源,吸引了无数开发者投身于游戏创作的世界。无论是独立开发者怀…...
神经网络-VggNet
2014年VggNet被推出,获取了ILSVRC2014比赛分类项目的第二名,第一名是GoogleNet,该网络在下节介绍,本节主要介绍VggNet。 VggNet可以称为是一个家族,根据层数的不同包括了A、A-LRN、B、C、D等网络结构,其中…...
用AI生成PPT,告别繁琐,一键生成高效方案
用AI生成PPT,告别繁琐,一键生成高效方案!制作PPT曾经是一件非常繁琐的工作。让人又爱又恨,爱的是它可以让你的想法可视化,恨的是,要做出一份精美的PPT,往往需要耗费大量时间和精力。现在AI技术的…...
基于 `android.accessibilityservice` 的 Android 无障碍服务深度解析
基于 android.accessibilityservice 的 Android 无障碍服务深度解析 目录 引言无障碍服务概述架构设计核心功能设计模式核心要点实现细节性能优化安全与隐私案例分析未来展望结论引言 在当今的移动应用生态系统中,无障碍服务(Accessibility Service)扮演着至关重要的角色。…...
UE5材质节点Frac/Fmod
Frac取小数 Fmod取余数 转场效果 TimeMultiplyFrac很常用 Timesin / Timecos 制作闪烁效果...
【微服务】【Sentinel】认识Sentinel
文章目录 1. 雪崩问题2. 解决方案3. 服务保护技术对比4. 安装 Sentinel4.1 启动控制台4.2 客户端接入控制台 参考资料: 1. 雪崩问题 微服务调用链路中的某个服务故障,引起整个链路中的所有微服务都不可用,这就是雪崩。动图演示: 在微服务系统…...
Kafka 性能提升秘籍:涵盖配置、迁移与深度巡检的综合方案
文章目录 1.1.网络和io操作线程配置优化1.2.log数据文件刷盘策略1.3.日志保留策略配置1.4.replica复制配置1.5.配置jmx服务1.6.系统I/O参数优化1.6.1.网络性能优化1.6.2.常见痛点以及优化方案1.6.4.优化参数 1.7.版本升级1.8.数据迁移1.8.1.同集群broker之间迁移1.8.2.跨集群迁…...
小程序租赁系统构建指南与市场机会分析
内容概要 在当今竞争激烈的市场环境中,小程序租赁系统正崭露头角,成为企业转型与创新的重要工具。通过这个系统,商户能够快速推出自己的小程序,无需从头开发,节省了大量时间和资金。让我们来看看这个系统的核心功能吧…...
SOME/IP 协议详解——远程过程调用(RPC)
文章目录 1. 传输协议绑定1.1 UDP 绑定1.2 TCP 绑定1.3 多服务实例(重要)1.4 通过 UDP 传输大型 SOME/IP 消息(SOME/IP - TP) 2. 请求 / 响应通信3. Fire&Forget 通信4. 通知事件5. 字段6. 错误处理6.1 返回码6.2 错误消息6.3…...
C++ 设计模式:命令模式(Command Pattern)
链接:C 设计模式 链接:C 设计模式 - 访问者模式 命令模式(Command Pattern)是一种行为型设计模式,它将请求封装成一个对象,从而使你可以用不同的请求对客户进行参数化,对请求排队或记录请求日志…...
观成科技:隐蔽隧道工具Ligolo-ng加密流量分析
1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具,该工具基于TUN接口实现其功能,利用反向TCP/TLS连接建立一条隐蔽的通信信道,支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式,适应复杂网…...
React第五十七节 Router中RouterProvider使用详解及注意事项
前言 在 React Router v6.4 中,RouterProvider 是一个核心组件,用于提供基于数据路由(data routers)的新型路由方案。 它替代了传统的 <BrowserRouter>,支持更强大的数据加载和操作功能(如 loader 和…...
DockerHub与私有镜像仓库在容器化中的应用与管理
哈喽,大家好,我是左手python! Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库,用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...
【Java学习笔记】Arrays类
Arrays 类 1. 导入包:import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序(自然排序和定制排序)Arrays.binarySearch()通过二分搜索法进行查找(前提:数组是…...
Golang dig框架与GraphQL的完美结合
将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用,可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器,能够帮助开发者更好地管理复杂的依赖关系,而 GraphQL 则是一种用于 API 的查询语言,能够提…...
2025盘古石杯决赛【手机取证】
前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来,实在找不到,希望有大佬教一下我。 还有就会议时间,我感觉不是图片时间,因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...
ios苹果系统,js 滑动屏幕、锚定无效
现象:window.addEventListener监听touch无效,划不动屏幕,但是代码逻辑都有执行到。 scrollIntoView也无效。 原因:这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作,从而会影响…...
如何更改默认 Crontab 编辑器 ?
在 Linux 领域中,crontab 是您可能经常遇到的一个术语。这个实用程序在类 unix 操作系统上可用,用于调度在预定义时间和间隔自动执行的任务。这对管理员和高级用户非常有益,允许他们自动执行各种系统任务。 编辑 Crontab 文件通常使用文本编…...
打手机检测算法AI智能分析网关V4守护公共/工业/医疗等多场景安全应用
一、方案背景 在现代生产与生活场景中,如工厂高危作业区、医院手术室、公共场景等,人员违规打手机的行为潜藏着巨大风险。传统依靠人工巡查的监管方式,存在效率低、覆盖面不足、判断主观性强等问题,难以满足对人员打手机行为精…...
wpf在image控件上快速显示内存图像
wpf在image控件上快速显示内存图像https://www.cnblogs.com/haodafeng/p/10431387.html 如果你在寻找能够快速在image控件刷新大图像(比如分辨率3000*3000的图像)的办法,尤其是想把内存中的裸数据(只有图像的数据,不包…...
