Compose Multiplatform iOS 稳定版发布:可用于生产环境,并支持 hotload

随着 Compose Multiplatform 1.8.0 的发布,iOS 版本也引来的第一个稳定版本,按照官方的原话:「iOS Is Stable and Production-Ready」 ,而 1.8.0 版本,也让 Kotlin 和 Compose 在移动端有了完整的支持。

在 2023 年 4 月 Compose 发布了 Compose for iOS Alpha ,而在 2024 年的 5 月的 1.6 版本发布了iOS Beta ,一年后的今天,1.8 版本终于有迎来了 Stable 发布。

三年之期已到,龙王归来?

在官方的调查里,超过 96% 的开发者表示在 iOS 上使用 Compose Multiplatform 没有重大的性能问题,这也是官方本次 stable 的原因:

同时在性能对比也有不错的基准测试结果:

  • 启动时间与原生应用程序相当
  • 滚动性能与 SwiftUI 相当
  • 仅增加了 ~9 MB 的大小

基准测试:https://github.com/JetBrains/compose-multiplatform/tree/master/benchmarks/showcases/LazyGridImageView

如果你去看 1.8.0 的更新日志 ,就会看到 Compose 大部分都是 iOS 的亮点,基本这个版本就是为了 iOS 而发布,其中最有意思的莫过于本次加入了并发渲染支持:

Compose Multiplatform 在 iOS 现在支持将渲染任务卸载到专用渲染线程,而并发渲染可以在没有 UIKit 互操作的情况下提高性能。

用户通过直接在 ComposeUIViewController 配置块中启用 ComposeUIViewControllerConfiguration 类的 useSeparateRenderThreadWhenPossible 标志或 parallelRendering 属性,选择在单独的渲染线程上对渲染命令进行编码:

kotlin 复制代码
@OptIn(ExperimentalComposeUiApi::class)
fun main(vararg args: String) {
    UIKitMain {
        ComposeUIViewController(configure = { parallelRendering = true }) {
            // ...
        }
    }
}

而另一个 iOS 的核心实现就是 Kotlin/Native ,Kotlin/Native 是 KMP 在 iOS 支持的关键能力,它负责将 Kotlin 代码直接编译为目标平台的机器码或 LLVM 中间表示 (IR),最终为 iOS 生成一个标准 .framework ,这也是为什么 Compose iOS 能实现接近原生的性能。

鸿蒙 Compose 实现支持目前主流也是 Kotlin/Native ,不得不说 Kotlin 最强大的核心价值不是他的语法糖,而是他的编译器。

当然,Compose Multiplatform 的 UI 渲染并非直接依赖于 iOS 的 UIKit 或 SwiftUI 的原生组件,而是依赖于Skia 图形库,在 Compose Multiplatform 里是通过 Skiko (Skia for Kotlin) 这套 Kotlin 绑定库的能力进行绘制。

简单理解,Skiko 在 iOS 利用 CAMetalLayer 作为其绘图表面,Compose UI 的每一帧都会通过 Skia 引擎渲染到由 CAMetalLayer 提供的 Metal 纹理上,这层实现逻辑和 Flutter 类似。

而前面提到了 UIKit 的互操作,这也是 Compose 渐进式集成的支持之一,在 iOS 上 Compose 可以同时与 SwiftUI 和 UIKit 进行互操作,换句话说,开发者可以在 Swift/UIKit 中使用 Compose,也在 Compose 中使用 SwiftUI/UIKit 。

当然,基于 Compose iOS 的实现模式,在继承的数据绑定和状态同步交互上可能还会存在某些边界问题。

同时,就像我们之前聊过的,klibs.io 的发布也补全了 Compose Multiplatform 在跨平台最后一步,这也是 Compose iOS 能正式发布的另外一个原因:

而 1.8 下的 Compose iOS 也更新了一些细节:、

  • 与原生 iOS 物理特性匹配的滚动行为
  • 原生 selection 和从右到左支持的文本编辑
  • 与系统的拖放集成
  • 遵循系统设置(如字体大小和对比度)的自适应 UI
  • iOS 原生的导航手势

目前官方表示,许多团队(包括 Markaz、Wrike、Feres 和 Physics Wallah)已经将 Compose Multiplatform 集成到它们的大型应用中,根据 Compoes 的理念 ,可以一次集成一个屏幕或功能,所以你无需从头开始就可以使用 Compose iOS。

也就是除了 Web 路线之后,基本上 Compose 在 Stable 的节奏上已经跟上了 Flutter 。

最后,现在 Compose 开发模式下的 hot reload 已经可以使用 ,不过暂时只支持 desktop,原理大概是只支持 jvm 模式, 现在 Compose Multi 开发可以和 Flutter 一样在更改代码后立即查看结果:

在补全这一点后, Compose 跨平台的开发体验也上了一个档次,至少 hot load 的体验比 preview 好太多了,虽然还不支持类似 Flutter Attach 的模式。

至于为什么不支持 Kotlin Native 下 iOS 的 hotload ,这个可以参考过去写过 Flutter 在 iOS 上如何实现开发过程中的二进制 JIT Kernel hotload 和遇到的问题,iOS 上的 hotload 基本需要走 hack 支持。

那么,你已经用上 Compose iOS 了吗?或者说你接下来会考虑吗?

参考链接

相关推荐
千里马学框架4 天前
一起学 Android 14:ShellTransition 屏幕旋转过程深度剖析
android·智能手机·性能优化·framework·性能·屏幕旋转·rotation
美狐美颜SDK开放平台4 天前
开发直播APP时如何接入视频美颜SDK?开发流程与注意事项
android·人工智能·计算机视觉·音视频·直播美颜sdk
AFinalStone4 天前
Android7 SystemUI源码解析(七)Keyguard锁屏模块深度解析
android·systemui
致远ccc4 天前
Google Play 上架前如何测试 App?多国家 Android 环境测试
android·app测试·googleplay·多国家应用测试
ttyyttemo4 天前
Kotlin 协程中的 Job 结构化并发与取消
android
sun0077004 天前
tbox 4g/5g切换,导致wan ip 改变,导致车机旧网络不可用。需要重启车机才行
android
ai2work4 天前
ch23 综合复刻:从零做一个最小可用版本(capstone)
kotlin
其实防守也摸鱼4 天前
内网穿透与反向代理:原理、工具与实战指南
android·大数据·运维·安全·网络安全·自动化·渗透
ai2work4 天前
ch21 签名、校验与发版
kotlin
茶底世界之下4 天前
为什么预览、录制、离线导出不能共享同一个背压策略?
ios·swift