Xamarin跨平台应用能否使用Kotlin编写的Android/iOS业务代码
答复:Xamarin(含Xamarin Forms)集成通用Kotlin业务代码双端运行可行性
结论:完全可以实现,但不能直接把你手里现有的Android版Kotlin/Java转Kotlin代码丢进项目就用,需要先做代码跨平台改造,再按平台分别绑定集成,最终就能跑通Android和iOS双端。
具体落地步骤
- 先把现有Kotlin代码改成真正的跨平台通用代码
你手里的代码最初是给Android写的,哪怕九成以上是业务逻辑,也会隐含不少Android平台依赖,首先要做剥离:- 所有直接引用Android SDK的类(比如你提到的Bitmap这类)全部删掉,换成你自己定义的通用抽象接口,不能留任何平台专属的硬引用
- 不要直接用Android环境下编译出来的JVM版Kotlin产物,要把改造完的业务代码按Kotlin跨平台的编译规则,分别出两个包:Android端出JVM字节码包,iOS端用Kotlin/Native编译出原生Framework包,这个包是可以直接在iOS上跑的二进制文件,不依赖JVM环境
- 再在Xamarin项目里做双端绑定接入
- Android端接入逻辑很简单:把编译好的Kotlin JVM包引进来,搭配Xamarin.Kotlin.StdLib组件就能直接在C#侧调用,这套方案已经落地很多年,没有什么硬坑
- iOS端需要走Xamarin iOS的原生库绑定流程:把Kotlin/Native编出来的iOS Framework做成C#可调用的绑定库,就能在Xamarin Forms的iOS项目里直接调用业务逻辑
- 最后做抽象层的平台实现对齐
你之前替换平台类写的那些通用抽象接口,要在Xamarin的各个平台项目里写对应实现:比如你抽象了通用的图片操作接口,Android端对接系统Bitmap实现逻辑,iOS端对接UIImage实现逻辑,再通过Xamarin Forms自带的依赖注入能力把实现注入进去,业务层就能无差别调用了
几个要避开的坑
- 别想着把Android端编的Kotlin JVM包直接塞iOS项目里用,JVM字节码根本跑不了iOS,必须走Kotlin/Native编原生框架的路子
- 绑定的时候注意Kotlin和C#的类型映射:比如Kotlin的空安全类型、集合类、协程相关的对象,要在绑定时做校验,不然很容易出现类型不匹配的崩溃
- 如果你的业务代码用了Kotlin协程、Flow这类异步特性,绑定时需要额外做一层桥接,把Kotlin的异步回调转换成C#侧能识别的Task或者事件模式,不然没法正常调用异步逻辑
内容的提问来源于stack exchange,提问作者Cordis Audax Agrinova
相关产品推荐
相关产品推荐

