CrossFly 是一个开源框架(Apache 2.0),你用纯 Java 编写 UI 和逻辑,它通过 LibGDX/OpenGL 在 GPU 上渲染,并编译为桌面端(Windows、macOS 和 Linux)、Android 和 iOS 的原生二进制文件,以及可在 Chrome、Firefox、Safari 等任何现代浏览器中运行的 WebGL 构建。搭配 CrossFly Sync 即可实现离线优先的数据。
Kotlin Multiplatform(KMP)是 JetBrains 的开源(Apache 2.0)技术,用于在 Android、iOS、桌面和 Web 之间共享代码——逻辑、网络、数据——而 UI 按平台保持原生。Compose Multiplatform 是其可选的共享 UI 工具包(Skia 渲染),自 2025 年 5 月起在 iOS 上稳定。
真正重要的差异
两个 JVM 表亲,在语言、UI 和工具上下了两注很不一样的赌。
它是 Kotlin 优先,而非 Java
KMP 的共享代码是 Kotlin。Kotlin 在 JVM 上与 Java 的互操作很好,但 Kotlin/Native(iOS)和 Kotlin/Wasm 是 Kotlin 工具链——并不是“运行你现有的 Java”。一个纯 Java 的企业团队不得不押注 Kotlin 作为其共享语言。
CrossFly 让你从头到尾留在 Java。没有全团队的语言迁移——你的 Java 开发者、库和惯用法直接带进每个平台的应用里。
iOS 的互操作层有损耗
在 iOS 上,Kotlin 只能通过一个生成的 Objective-C 桥与 Swift 对话。那层翻译正是尖锐棱角所在:可空整数被装箱、密封类失去穷尽 switch、Kotlin Flow 变成笨拙的回调、泛型坍缩为 Any?。JetBrains 那套地道的修复方案 Swift Export 尚未就绪。
CrossFly 只有一条在 GPU 上绘制的渲染与逻辑路径——没有 Kotlin→Obj-C→Swift 的边界要跨越,所以那些互操作损耗从一开始就不会出现。
iOS 上的共享 UI 还年轻
如果你也想共享 UI,那就是 Compose Multiplatform——它直到 2025 年 5 月才在 iOS 上达到稳定,文本框无障碍落地得更晚,而 web/Wasm 仍在测试版。它是 Skia 渲染(不是原生控件),所以在 iOS 上看起来像 Material,而非 Cupertino。
CrossFly“自己绘制 UI”的模型就是整个框架,而非一个新近才稳定的层——从第一天起就在桌面和移动上有一套一致的 UI。(如果你需要按平台的原生外观,KMP 的原生 UI 选项是一项真正的优势——见公平对待那一栏。)
构建矩阵就是那笔税
KMP 意味着 Gradle-multiplatform——JetBrains 自己都称之为“令人不知所措”——外加脆弱的 CocoaPods 集成、一个只在 macOS 上工作的 iOS 插件,以及缓慢的 Kotlin/Native 编译。预期会有实实在在的搭建和迭代摩擦,尤其是在 iOS 一侧。
CrossFly 单语言、单工具链的模型让构建故事简单得多——在你和一个能在三个平台上运行的应用之间,活动的零件更少。
CrossFly 领先之处
Kotlin Multiplatform 真正强大之处
CrossFly 对比 Kotlin Multiplatform 一览
| 维度 | CrossFly | Kotlin Multiplatform |
|---|---|---|
| 语言 | Java | Kotlin |
| 运行时 | 原生二进制(JVM 血统) | 原生二进制(Kotlin/Native,JVM 血统) |
| 共享的内容 | UI + 逻辑,一份代码 | 默认共享逻辑;UI 原生或经 Compose MP |
| UI 模型 | 各处一套 GPU 绘制的 UI | 按平台原生,或 Compose MP(Skia) |
| iOS UI 成熟度 | 核心框架 | Compose MP iOS 自 2025 年 5 月起稳定 |
| iOS 互操作 | 一条路径,无 ObjC 桥 | Kotlin↔Objective-C 桥(Swift 经生成层) |
| 构建/工具 | 单一 JVM 工具链 | Gradle-multiplatform + CocoaPods;iOS 插件仅限 macOS |
| 离线优先 | CrossFly Sync(双向) | 从库里拼装 |
| 桌面 | 一等公民(Win/mac/Linux) | 经 Compose for Desktop 成熟 |
| 许可 | 开源(Apache 2.0,Core) | 开源(Apache 2.0) |