移动开发对跨平台的渴求,几乎与移动应用本身同样古老。PC时代,用户在浏览器输入一个URL就能跳转目标页面,开发范式直接。iPhone问世后,原生App成为移动体验的重要载体,App Store首页那个小小图标让开发者第一次拥有自建流量入口,移动应用生态由此爆发。Android崛起后,Web、Android、iOS多端并存,一个应用要覆盖Android、iOS和PC,往往意味着几套代码、几个团队、几倍成本,开发者开始怀念“写一套代码到处跑”的高效时代。

Facebook率先把React开发范式搬到移动端,推出React Native,但随着应用复杂度上升,性能问题逐渐显现。与此同时,Google内部做Chrome的顶尖工程师发现,移动端CPU资源极其有限,Chrome面向PC设计的架构在手机上水土不服,长列表滑动时白屏频出。他们决定重构渲染管线,从强调并发能力转向精简的即时渲染流水线,内容必须立刻出来。Flutter由此诞生,它还有一层战略意图:为未来的AI和IoT设备做准备,同时发展开发者生态、统一多端UI。

打开网易新闻 查看精彩图片

Android自身也在演进。2018年Jetpack改善了XML与Java混杂的传统开发方式,提供更完整的工程能力;2021年Jetpack Compose推出,声明式UI从Web进入移动原生开发,SwiftUI也采用类似范式。某头部互联网公司内部数据显示,Compose刚推出时人效提升达到1:1.6,但早期性能问题不少。到了2023年,KMP开始受到更多关注。如果说Flutter的核心是统一UI,那么KMP的核心就是统一业务逻辑,这代表跨平台框架的又一次代际变化。

技术上,Flutter采用自渲染,用Dart编写一套代码即可运行在Android、iOS和Web等平台,并引入Impeller逐步替代Skia,利用Vulkan等图形接口改善渲染性能。但Dart在国内接受度有限,腾讯MXFlutter等团队尝试用类TypeScript或JavaScript语言替代。行业甚至一度认为,如果Flutter使用JavaScript,可能成为更理想的跨平台框架。Flutter未来或面临生态变化,但自渲染底层技术路线不会轻易消失。

KMP的设计理念与Flutter不同。Flutter调用原生能力通常要编写Platform Channel,业务复杂后通道代码量庞大,高频交互中序列化与反序列化容易产生性能损耗甚至卡顿。KMP的Expect/Actual机制允许公共层声明统一接口,各平台提供具体实现,复用粒度既可以很粗,也可以细化到函数和属性,兼顾开发效率与原生灵活性。性能方面,KMP可直接调用平台C接口并生成各平台原生二进制代码,可能获得数倍甚至接近两个数量级的提升。因此,KMP的下一代特征主要体现在提高共享逻辑的复用效率,并在跨端一致性与原生性能之间寻找平衡。

跨平台框架的缠斗持续多年,Flutter与KMP走向不同路线:一个试图统一UI,一个专注共享业务逻辑。框架可能退潮,但具有独特价值的底层技术会被保留下来。这场跨平台战争还没有绝对赢家,只有不断演进的工具链和开发者对效率的持续追求。