Kotlin Multiplatform Mobile

2022-03-17  本文已影响0人  WLHere

简介

Kotlin Multiplatform Mobile,缩写为KMM,记住这个缩写,今后遇到它,知道是在说什么

KMM目前处于alpha阶段,预计在2022年春季发布beta版本。就是今年春天,还剩几天时间了,猜一下会不会延期?

截止到今天(2022/4/7),仍是alpha版本,也就是beta版本延期了。

KMM用于简化跨平台应用开发。使用KMM可以用kotlin写代码,并可以在android和iOS之间共享这些代码,也可以使用kotlin写平台特有的代码

跨平台的原理

使用kotlin编写,之后编译出目标平台代码

编译出不同的平台代码

借助Kotlin Multiplatform,可以让用Kotlin写的代码可以在所有平台上运行

Kotlin Multiplatform
Kotlin/Native是什么

包大小
Android 平台以 aar 的形式集成,许多依赖的 Kotlin 基础库,例如 kotlinx.coroutines 以及 kotlinx.serialization 等等都没有打进这个 aar 里,再加上编译产物又是字节码,总 size 增长只有 0.03 MB。但是 iOS 有所不同,编译产物是二进制码,再加上整个 Kotlin/Native 的基础库、Runtime 等等通通打进了这个 Framework,总 size 增长为 1.5 MB,当然后续再持续集成业务代码的话,增长幅度不会再这么惊人

KMM对比Flutter

体积

  1. 使用 Flutter 需要在 App 包内部增加两个引擎:

    • 一个是 Flutter 的渲染引擎,该引擎使用 C/C++ 开发,直接调用 OpenGL/Skia 的 API 进行绘制,从而摆脱 iOS 的 UIKit 以及 Android 的 View 组件直接渲染成需要的样式,从保证样式高度统一
    • 一个是 Dart 语言的 Runtime,用于解析并运行 Dart 语言编译的 Bundle

    这两者减小了开发者的适配成本,但增大了 APP 的包体积(其他类似的跨平台框架,如:React Native 等,也会内置 JavaScript Core 或 V8 引擎)

  2. KMM 针对不同平台生成不同的二进制依赖包,根本上还是调用了 Android、iOS 的原生 API,并不会内置引擎这类文件,对 App 的体积影响相对较小,同时也保证了性能

技术栈

风险点

适用场景

看一个例子

工程结构

image.png

android和iOS设置依赖后,可以直接引用shared工程内的"kotlin"代码

shared目录

commonMain

// expect关键字:申明是平台差异化代码
expect class Platform() {
    val platform: String
}

class Greeting {
    fun greeting(): String {
        return "Hello, ${Platform().platform}!"
    }
}

androidMain

// actual:是平台差异化代码的实现
actual class Platform actual constructor() {
    actual val platform: String = "Android ${android.os.Build.VERSION.SDK_INT}"
}

iOSMain

import platform.UIKit.UIDevice

// actual:是平台差异化代码的实现
actual class Platform actual constructor() {
    actual val platform: String = UIDevice.currentDevice.systemName() + " " + UIDevice.currentDevice.systemVersion
}

androidApp目录

fun greet(): String {
    return Greeting().greeting()
}

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val tv: TextView = findViewById(R.id.text_view)
        tv.text = greet()
    }
}

运行

Android iOS

我们哪些场景可以使用KMM?

参考文章

https://kotlinlang.org/docs/multiplatform-mobile-getting-started.html
https://blog.jetbrains.com/zh-hans/kotlin/2021/05/whats-new-in-kmm-since-going-alpha/
https://coderyuan.com/2021/05/26/KMM-1/
https://cloud.tencent.com/developer/article/1889664
https://mp.weixin.qq.com/s/e3k5JcxG1FvGlNkOyjNIFw

上一篇 下一篇

猜你喜欢

热点阅读