KMM(Kotlin Multiplatform Mobile)是JetBrains公司在去年8月31日推出的基于Kotlin的跨平台框架。
不同于Flutter,KMM注重的是将与平台无关的代码通用化,共用同一份Kotlin代码实现,生成两个平台的原生产物;至于平台特性相关的代码(包括UI)建议使用各自平台原生方案,各自写一份代码解决。
共用代码部分,Android平台会直接构建成aar,与普通Android依赖无差异;iOS平台会使用KN(Kotlin/Native)实现Kotlin与OC/Swift的相互调用,生成framework供现成的iOS项目直接依赖使用。可以说无论对于新建立的项目,还是旧有维护已久的项目都非常友好,入侵性不大,接入成本小,性能几乎跟原生开发一样。
UI部分,KMM没有直接提供跨平台实现,因为KMM的设计思想是,本身存在差异的事情就让它差异化实现,不做同化处理。这样的好处是紧贴原生实现,不存在平台兼容性问题和多余的性能负担。而相比其他跨平台方案,不足之处自然是需要写两份代码实现。至于说没有直接提供,是因为KMM可以在Kotlin上使用到iOS UI控件,直接用Kotlin写iOS 原生UI代码(没错,就是上文提到的KN),Android UI自然是没有问题,目前其实已经有一些KMM的跨平台UI库存在。
KMM Alpha版本发布只有半年,但它所依赖KN Beta版本早在两年半前就已经跟随Kotlin 1.3版本发布,具备一定稳定性。
可以说KMM跟Flutter的跨平台方案就是两种设计。Flutter主张一切倾向于跨平台同化,一份代码解决所有问题,是目前最火热的跨平台方案,同时也是issue最多的,好处显而易见,而代价也难以忽略。KMM主张只同化非平台相关代码,平台特性相关继续由平台自己实现。然而两个平台的UI到底算是重复工作,还是平台特性化差异,也是很难得出结论。
总而言之,KMM还算值得一试,有兴趣不妨clone个sample project探个究竟。