Kotlin Multiplatform跨端共享代码开发指南

Viewed 0

当下市场上的跨端解决方案,如React Native、Flutter或Weex,通常由这些框架处理业务UI界面,而涉及性能或平台通用共享逻辑时,则依赖于原生开发。这通常需要至少两名原生开发人员协作统一Native层功能,传统上常用C/C++实现。现在,JetBrains的Kotlin/Native提供了另一种解决方案。

Kotlin/Native是一种将Kotlin代码编译为无需虚拟机即可运行的原生二进制文件的技术。它基于LLVM编译器后端,并实现了Kotlin标准库的原生版本。LLVM是一种编译器基础结构,允许为任何支持LLVM的目标平台编译任何语言的前端代码,这也解释了Swift能编译Android工程的原因。

Kotlin/Native支持多种平台,包括iOS、macOS、Android、Windows、Linux和WebAssembly。它提供两种与Native互操作的方式:一是通过cinterop工具解析C头文件生成Kotlin交互代码;二是直接使用现有库的互操作,如静态或动态C语言库、Swift和Objective-C框架。许多流行库如POSIX、OpenGL、Metal和Foundation都已预导入并包含在编译器包中。

从Kotlin/Native 1.3.30 Beta版本开始,它作为Kotlin Multiplatform(KMP)的目标平台之一,允许基于KMP构建跨端共享代码项目。在KMP DSL中,有几个关键概念:Target表示工程产出变体,可生成Android库、iOS框架等;Preset用于定义Target的预配置,例如通过fromPreset()设置,预设值包括androidNativeArm32、iosArm64、linuxX64等,目标名称如jvm、js和android。

要上手KMP,开发前需准备Android Studio或IntelliJ IDEA,并安装Kotlin插件1.3.21及以上版本,同时安装XCode以运行iOS工程。创建共享代码模块时,可基于Gradle构建工程(如原生Android工程),然后引用kotlin-multiplatform插件。通过kotlin.targets设置目标平台,例如配置iOS和Android平台,代码示例如下:

kotlin {
    targets {
        final def iOSTarget = System.getenv('SDK_NAME')?.startsWith("iphoneos") \
                              ? presets.iosArm64 : presets.iosX64
        fromPreset(iOSTarget, 'ios') {
            binaries {
                framework(project.name)
            }
        }
        fromPreset(presets.android, 'android')
    }
}

不同Targets可能依赖不同的三方库,可通过kotlin.sourceSets设置源集依赖,例如commonMain、androidMain和iosMain,分别配置通用、Android和iOS的依赖项。源集命名需遵循KMP的特定规则,基于target和compilation命名,如iosTest表示iOS特性的测试模块。

当两端实现存在差异化代码时,可使用expect/actual关键字。expect在common中声明,类似于接口声明,可修饰类或对象;actual修饰具体实现。例如,线程调度在不同平台上的实现不同,可通过expect声明applicationDispatcher,然后在Android和iOS中分别用actual实现。对于平台特定API的兼容,通常都需要通过expect/actual分别实现。

在iOS上,构建后会生成供iOS使用的静态库。通过XCode新建工程并配置引入对应framework,添加脚本使其编译时自动通过Gradle更新。在代码中,可以直接调用Kotlin编译生成的二进制代码,实现双端底层共享。例如,在Objective-C中通过RCT_EXPORT_METHOD调用Kotlin代码,处理网络请求等逻辑。

KMP生态中有多平台三方库支持,如序列化库Kotlin Serialization、IO库Kotlin io、网络库Ktor和数据库库sqldelight。学习KMP需要掌握Kotlin语言基础、双端开发知识以及多平台库的使用。总的来说,Kotlin Multiplatform为跨端开发提供了高效的原生代码共享方案,有助于提升开发效率和代码一致性。

0 Answers