kmm是Kotlin Multiplatform Mobile(kt移动跨平台)的缩写,虽然目前还不是正式版本,但也是可以用了
kmm的跨平台实现方式是将代码分成三块:
安卓原生代码
ios原生代码
kotlin共享代码,其中在安卓部分会将kotlin共享代码编译为jvm文件并当做lib加入到安卓原生代码中,而ios则是将kotlin共享代码编译成native(oc?)代码,然后当做framework引入
(图引自kt官网)
这样既可以跨平台,又保证了平台灵活性,并且性能相对于flutter会更好
缺点就是目前未release,并且用的人少资料少,可能双端的原生代码写的会多一些,目前跨平台ui(compose-multiplatform)还没有ios版,所以目前可以先试试,等出了跨平台ui后应该就真正实现跨平台了
前置环境一个macos系统(苹果电脑),因为编译ios需要用macos和xcode
android studio 北极狐版本(2020.3.1)以上
jdk环境,可以直接下载一个jdk-mac安装包,就可以直接将环境变量配置上去了
正文首先在as上装一个kmm插件(用于创建kmm demo)
然后new project,使用kmm插件创建
创建成功后并sync完成后,选中androidApp并点运行,就可以直接运行起安卓app
好了,kmm完事了!
emmm,怎么可能,下面在运行一下ios
选择iosApp
发现出现一个x
这里可以修改一下iosApp规则
将这里的iosApp.xcworkspace改成iosApp.xcodeproj,iosApp中会同时生成xcworkspace和xcodeproj可以看做是as中project和model的区别,相当于我们选择一个具体的model来执行
我们在点击运行,发现报错了(后来发现好像不报这个错了?但还是保留吧)
因为我第一次接触ios开发,所以我也不太清楚是什么具体问题,但直觉来看应该是编译环境问题,我用的是m1的macos,所以可能是默认kotlin编译为native用的x86,而我看到kotlin共享模块的gradle配置处有配置ios,所以我们稍微改一下并测试一下就好了
原配置如下:
可能是走到else里了,由于我们不是专门搞ios的,并且目前只有一个m1苹果电脑,所以就简单的改为如下配置:
再次点击运行,然后提示没有导入共享的模块
这里查了一下,是没有将framework引入到xcode项目中,所以我们用xcode打开iosApp项目并将framework导入
我们先用xcode打开项目,点open a project,然后选择这个文件
这时候xcode里空的什么都没???弄得我一脸懵,然后才知道得将model导入进去,如下
选择目录中的iosApp.xcodeproj文件并确定,然后可以发现左边栏有文件夹了
然后我们去as中生成一下framework
双击这个命令生成ios所使用的共享framework
先点击蓝色的iosApp文件打开配置文件,并点击这个加号
点击add other再点add files,将我们生成的framework引入进去,目录如下
让后将上面的目录配置到framework path中
内容: ${SRCROOT}/../shared/build/bin/ios/podReleaseFramework/
配置成功后我们再次在as中点击运行,发现ios模拟器启动起来了,程序也运行上去了,但是as不知道为什么崩了(已提交反馈),正常到这里应该就可以了,但是现在as崩了,但也可以从xcode中运行,不过需要简单配置一下
我们由于xcode执行只能走xcode的东西,不能直接调用gradle去让共享kt代码编译,这时我们可以使用xcode的脚本功能
将这个脚本拖到最上面先于xcode编译,内容如下:
# 防止找不到 JAVA_HOME 环境变量(如果使用 zsh)
if [ -f ~/.zshrc ]; then
echo "zsh"
source ~/.zshrc
fi
# 防止找不到 JAVA_HOME 环境变量(如果使用 bash)
if [ -f ~/.bashrc ]; then
echo "bash"
source ~/.bashrc
fi
cd "$SRCROOT"
cd ../ # 这里为 Android 工程的目录名
# kmmsharedmodule 为 KMM 模块,Gradle project 名http://www.kaotop.com/file/tupian/20220518/1622193265424.png
./gradlew :shared:clean :shared:linkPodReleaseFrameworkIos -PXCODE_CONFIGURATION=${CONFIGURATION}
ps:这里会用到jdk环境,需要配置JAVA_HOME,如果之前没有安装过,就可以直接在官网下载一个macos的jdk的安装版,这样环境变量就直接配置好了
pps:如果想要提升速度,可以将:shared:clean去掉,一般不会有情况,如果有情况可以手动调用
ppps:当然这个脚本只是在xcode运行的时候使用的,如果只在as中运行iosApp的话可以将这个脚本去掉,否则可能会出现共享代码编译两次导致浪费时间的问题
然后就可以用xcode的运行功能了.
完事.
结语当然,我没用过xcode开发,所以可能会有配置或者写错的地方,如果有请大佬指出
其次,由于kmm可能未来还会改api,所以文章可能有部分会过时,但是我尽量及时修改
文章部分参考该大佬的文章:KMM(Kotlin Multiplatform Mobile)入门(二)在现有工程中集成 KMM | 可爱的程序猿 - CoderYuan.com
最后,EDG牛逼!!! EDG牛逼!!! EDG牛逼!!!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)