一.移动端跨平台方案
1.1开发背景
- 基础模块逻辑相对复杂,多端研发成本高
- 双端逻辑代码膨胀,无法保证完全一致,问题排查难
- 逻辑代码穿插在各个模块中,现有跨端复用方案迁移成本高
1.2跨平台方案
1.3 选择KMM
场景:
- UI很不重要或者UI很重要,交互复杂对性能要求很高,原生UI是第一选择
- 有很多可收拢的逻辑层面代码
- 已有代码,重点考虑迁移成本
- 考虑学习成本和更轻量化的方案
- 注重性能
- 注重原生能力的融合,不要桥接
KMM可以做
- Android 的开发语言koltin语言开发来开发Android/iOS的共享库
- 更贴合 Android & iOS 平台。Android 平台产物 aar,iOS 平台使用 Kotlin Native 编译,产物 framework
- 与平台无关的 common 逻辑可以跨更多的平台,如 Mac、Linux、Windows、Web 等
二.KMM介绍
2.1什么是KMM
_KMM(Kotlin Multiplatform Mobile)_是一个用于跨平台移动开发的 SDK。借助 KMM,您可以开发多平台移动应用程序,并在 Android 和 iOS 之间共享部分应用程序,例如核心层、业务逻辑、表示逻辑等。
KMM 使用Kotlin的多平台功能和专为移动开发设计的功能,使用 Android Studio的Kotlin Multiplatform Mobile (KMM) 插件可帮助您开发适用于 Android 和 iOS 的应用程序。
2.2什么是KMM插件?
适用于 Android Studio的Kotlin Multiplatform Mobile (KMM) 插件可帮助您开发适用于 Android 和 iOS 的应用程序。
使用KMM插件,你可以。
-
直接从Android Studio在iOS目标上运行、测试和调试你应用程序的iOS部分。
-
快速创建一个新的多平台项目。
-
将一个多平台模块添加到现有项目中。
KMM插件只在MacOS上工作。这是因为按照苹果的要求,iOS模拟器只能在macOS上运行,而不能在其他任何操作系统上运行,如微软的Windows或Linux。
2.3什么是Kotlin/Native,它与KMM有什么关系?
Kotlin/Native是一种将 Kotlin 代码编译为原生二进制文件的技术,它可以在没有虚拟机的情况下运行。它由基于LLVM的 Kotlin 编译器后端和 Kotlin 标准库的本机实现组成。
Kotlin/Native主要是为了允许在不希望或不可能使用虚拟机的平台上进行编译,如嵌入式设备和iOS。它特别适用于开发者需要制作一个不需要额外的运行时或虚拟机的独立程序的情况。而这正是iOS开发中的情况。
用Kotlin编写的共享代码,用Kotlin/JVM为Android编译成JVM字节码,用Kotlin/Native为iOS编译成本地二进制文件。这使得在这两个平台上与KMM的集成是无缝的。
三.KMM搭建
3.1代码工程结构
使用KMM插件默认创建目录结构
- AndroidApp 应用代码
- iosAPP 应用代码
- Android&ios的共享公共代码
- Android平台差异代码
- ios平台差异代码
3.2ios运行
- ios运行除了可以用xcode运行外,也可以直接通过Android studio 插件直接运行
- 通过Android studio 插件运行,必须是苹果系统
3.2iosApp编译kotlin共享库
cd “$SRCROOT/…” ./gradlew :shared:embedAndSignAppleFrameworkForXcode注意顺序,要将Run Script脚本放到 Complie Souces前面
3.3iosApp依赖共享库生成的Framework
在Build Settings选项卡上,切换到All build settings 并在Search Paths下指定Framework Search Path:
(
S
R
C
R
O
O
T
)
/
.
.
/
s
h
a
r
e
d
/
b
u
i
l
d
/
x
c
o
d
e
−
f
r
a
m
e
w
o
r
k
s
/
(SRCROOT)/../shared/build/xcode-frameworks/
(SRCROOT)/../shared/build/xcode−frameworks/(CONFIGURATION)/
(
S
D
K
N
A
M
E
)
!
[
]
(
h
t
t
p
s
:
/
/
i
m
g
−
b
l
o
g
.
c
s
d
n
i
m
g
.
c
n
/
i
m
g
c
o
n
v
e
r
t
/
755
f
d
143
a
670828633131
a
c
f
38
f
6072
e
.
p
n
g
)
在
∗
∗
B
u
i
l
d
S
e
t
t
i
n
g
s
选项卡上,在
L
i
n
k
i
n
g
∗
∗
下指定
∗
∗
O
t
h
e
r
L
i
n
k
e
r
标志
∗
∗
:
(SDK_NAME)![](https://img-blog.csdnimg.cn/img_convert/755fd143a670828633131acf38f6072e.png)在**Build Settings选项卡上,在Linking**下指定**Other Linker 标志**:
(SDKNAME)![](https://img−blog.csdnimg.cn/imgconvert/755fd143a670828633131acf38f6072e.png)在∗∗BuildSettings选项卡上,在Linking∗∗下指定∗∗OtherLinker标志∗∗:(inherited) -framework shared3.4运行
3.5 代码分析
3.6 共享库能力扩展
共享库想要扩展,引用一些第三方库的能力也很方便
-
Android非常简单的,和普通 Android 开发没有区别,只要通过 gradle 引入需要的库,就可以调用里面的代码。
-
iOS 则是通过 cinterop 这个能力生成 Kotlin 识别的三方库头文件实现能力调用的。 使用了 Kotlin CocoaPods 插件。引入一个三方库,最终通过cinterop生成 klib 文件,里面包含了导出的头文件函数(knm 文件),最后代码里 import 进来就可以直接使用了。
四.KMM展望
4.1遇到问题
iOS平台调试问题
使用 Android Studio 执行在 iOS 上一步编译的 Kotlin Multiplatform Mobile 代码时,可能很难找到变量的值。此外,我们目前只能通过打印日志进行调试。随着 iOS 项目的增长,编译速度也逐渐变慢,这会影响 iOS 调试的效率。
Kotlin Native 多线程问题
Kotlin Native 对多线程之间的对象共享有非常严格的内存模型,要求冻结多线程之间共享的所有变量。在研究 Kotlin Multiplatform Mobile 技术的早期阶段,我们经常被InvalidMutabilityException.
什么是 Kotlin 多平台移动 (KMM)?
Kotlin Multiplatform Mobile 是一个用于 iOS 和 Android 应用程序开发的 SDK。它提供了创建跨平台和本机应用程序的所有综合优势。
它受到许多世界领先公司的信任,包括飞利浦、Netflix、Leroy Merlin 和 VMWare。
应用程序逻辑的单一代码库
为您的 Android 和 iOS 应用程序的网络、数据存储、分析和其他逻辑维护单一代码库。
实施本机 UI 并利用特定于 Android 和 iOS 设备的其他功能。
Hi,下午7:00-7:30分享移动端跨平台开发KMM,邀请您参加 !
主题:移动端跨平台开发KMM
分享人:young
时间:7月20日 7:00-7:30 时长:30分钟
分享内容:移动端跨平台开发KMM,业务共享,原生UI。
分享受众:对移动端开发感兴趣的相关人员