前言
大家好,我是未央歌,一个默默无闻的移动开发搬砖者~
想到跨平台,大家现在首先想到的估计都是 Flutter,但是今天不讲他,我们聊聊另外一个跨平台移动开发领域颇具影响力的技术- KMP(Kotlin Multiplatform)。
KMP 是一种面向移动端开发的跨平台框架,使用 Kotlin 语言编写,可实现在多平台(桌面 / Andropid / iOS / Web / 服务器)上共享代码和逻辑。通过 KMP 框架,我们可以编写一次代码,然后在不同的平台上进行部署和运行,极大提高了开发效率和代码重用性。
软件安装
Android Studio
Xcode
- 仅限 Mac 用户,用于 iOS 应用开发和测试
- 个人不建议在 App Store 直接下载 Xcode,可以安装 Xcodes 然后从上面下载,这样可以下载安装历史版本的 Xcode
- CocoaPods 的安装,执行 brew install cocoapods。如果这一步不成功,可以看看我上一篇文章,了解如何安装环境拿到一台新MAC,如何快速配置并运行Flutter项目
如果你使用 Windows 或者 Linux,可以忽略 Xcode 和 CocoaPods 的安装。但是也意味着你无法开发测试 iOS 应用,不过你还是可以体验 KMP 在桌面、Android 和 Web 平台的强大功能!
创建项目
使用 JetBrains KMP 脚手架
- Kotlin Multiplatform wizard >> JetBrains 提供的一个在线模板库,帮助我们快速生成一个包含所有必要配置的 KMP 项目模板。可以选择新建项目,也可以直接下载不同 UI 风格的模板
- 我们这次把所有平台都勾选上,然后下载下来并解压,使用 Android Studio 打开项目
项目初识
- 主要看 composeApp 目录,src 下分别有对应 4 个平台的目录,存放各个平台特定代码。commonMain 则是存放所有平台共享的代码
- 另外 shared 目录下的 src 也是有如上几个类似的目录,用来存放可以在多个模块间共享的代码,比如工具类、业务逻辑代码【注意:此处的代码都需要保持清洁,摒弃平台特性】
运行项目
启动 Android 应用
- 打开项目之后,默认会为 composeApp 模块创建 Android 运行配置,直接点击运行即可
启动 iOS 应用
- 需要安装 Kotlin Multiplatform 插件,才能直接运行
- 安装完插件之后,下拉选项就有 iosApp 的选项
- 点击右边的编辑选项,可以选择运行的对应机器,iOS 模拟器创建方法见我上一篇文章拿到一台新MAC,如何快速配置并运行Flutter项目
- 启动运行之后如下图
启动桌面应用
-
使用 gradle 命令运行,一会就会弹出一个桌面应用弹窗了 ./gradlew run
-
运行如果遇到如下问题,去oracle 官网下载对应的版本(如 java 17) android gradle plugin requires java 17 to run. you are currently using java 11
- 如果是 M 系列芯片的选择 Arm 64 DMG installer
- 如果是 intel 系列的选择 X64 DMG installer
- 安装完之后输入以下命令,查看所在路径,然后复制
/usr/libexec/java_home -V
- 配置环境变量,不知道如何配置的,可以看看我上一篇文章,了解如何配置拿到一台新MAC,如何快速配置并运行Flutter项目,配置如下
JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk-17.jdk/Contents/Home PATH=$JAVA_HOME/bin:$PATH:. CLASSPATH=$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar:. export JAVA_HOME export PATH export CLASSPATH
- 最后执行命令,输出如果是对应的版本即可
java -version
启动 Web 应用
- 使用 gradle 命令运行,会在默认浏览器中打开应用
./gradlew wasmJsBrowserRun
Flutter 对比
- 技术方向
- KMP 使用 Kotlin 语言开发,实现代码的最大化共享,同时充分利用每个平台的原生优势
- Flutter 使用 Dart 语言开发,使用 Skia 渲染引擎绘制 UI
- 性能对比
- KMP 的性能优势在于其编译为原生代码的能力,有着与原生应用相媲美的性能。KMP 应用可以直接调用平台 API,减少开销
- Flutter 虽然在渲染性能上非常出色,但由于其使用自己的渲染引擎,但在某些复杂交互或动画场景下,性能会弱于 KMP
- 扩展维护
- KMP 的可扩展性体现在其对平台特定功能的灵活支持。开发者可以轻松添加或修改特定于平台的实现,而不影响其他平台的代码
- Flutter 虽然可以通过平台通道与原生代码交互,但相比 KMP,这种集成可能更复杂,且需要更多的工作量来维护,成本更高
- 学习成本
- KMP 允许高达 80% 的代码跨平台共享,提高开发效率且降低维护成本。但学习曲线相对较陡,且社区支持和资源仍在发展中
- 提供了快速开发的优势,支持热重载,加快了迭代速度。Flutter 的社区相对活跃,降低了上手难度
最后
如果你对 Android 和 Flutter 感兴趣,可以订阅我的专栏:
感谢大家的支持,码字实在不易,其中如若有错误,望指出,记得点赞关注加收藏哦 ~