KMP探索与实践分享

本人所作的内部技术分享,脱敏同步

项目介绍

项目背景

为了解决视频转WebP动图的痛点问题

  1. 用的是外部工具,黑盒过程不可控

  2. webp体积过大,存在OOM风险

  3. 帧率、质量没有统一标准

期望提供一个视频转webp工具约束生产流程

方案选型

业务后台(链路长) vs 脚本工具(门槛高) vs KMP Compose(技术栈匹配能内部闭环)

建设过程

新建项目方式:

  1. 官方模板代码:https://github.com/JetBrains/compose-multiplatform-template

  2. Kotlin Multiplatform Mobile plugin

实践项目结构介绍

Compose编程关键点

•composable 可组合的UI

•mutableStateOf 更新发起点

•remember 刷新前后状态继承

|

1
val taskList = remember { mutableStateOf(LinkedList<TaskData>()) } // list是更新点且可继承状态	Box(Modifier.wrapContentHeight(), contentAlignment = Alignment.TopCenter) {   ListTaskView(taskList.value)} // view data bindtaskData.value = TaskData(inputPath = inputPath.value, outputPath = outputPath.value)taskList.value.addFirst(taskData.value) // list新增一个条目 // 条目状态变更taskData.value.inputPath = filePathtaskData.value.outputPath = outputPathtaskData.status.value = ConvertSuccess

|

KMP介绍

KMM, KMP, KMP Compose到底都是个啥?

KMM(Kotlin Multiplatform Mobile)

KMP(Kotlin Multiplatform)

KMP Compose(Kotlin Multiplatform Compose)

跨平台框架对比

|

|
|
|
|

|

| Flutter
| React Native
| Kotlin Multiplatform
|

|
UI支持
| 较强
| 较强
| 强
|

|
开发语言
| Dart
| Javascript
| Kotlin
|

|
迁移成本
| 高
| 高
| 低
|

|
运行环境
| Flutter引擎
| JSCore
| 纯原生
|

|
性能
| 较高
| 一般
| 高
|

KMP、Flutter和React Native都是用于开发跨平台移动应用的框架,各有其优缺点。

KMP发展趋势

应用阵营:百度、快影、McDonald’s、Netflix… https://www.jetbrains.com/help/kotlin-multiplatform-dev/case-studies.html

KMP跨平台原理

KMP 的核心原理是通过 Kotlin K2编译器将共享的 Kotlin 代码编译成适用于目标平台的原生代码,从而实现在不同平台上共享代码的目的。

项目结构与运行

项目结构


共享模块中的平台命名文件和平台特定模块中的文件有何区别?平台特定模块更多是作为一个应用入口。

依赖管理

公共依赖(e.g. Koin, Apollo, Okio

特定平台依赖 (e.g. Glide, Fresco, AFNetworking, YYModel)

构建运行

项目形态

  • 共享一段逻辑
    共享应用的独立共同逻辑。

  • 共享逻辑但保持原生UI
    开始新项目时使用Kotlin Multiplatform,只需实现一次数据处理和业务逻辑,并且保持 UI 原生。

  • 共享逻辑与UI
    使用Compose Multiplatform提高开发效率,共享逻辑与UI的代码。

What’s more

官方示例:https://github.com/android/kotlin-multiplatform-samples

Reference

KMP Development
跨平台开发的后起之秀
Kotlin Multiplatform Mobile 跨平台原理