Kotlin跨平台开发

  • 今天我们来简单介绍一下使用kotlin进行跨平台开发,使得一处代码,多处运行。

一、简介
首先,我摘取了一些官方文档上的基本介绍。
kotlin语言在一开始设计的时候就有一个明确的目标,那就是能够在所有平台上使用,能够使用kotlin开发任意平台的应用。 同时kotlin还有一个重要的目标,就是能够在不同平台间共享代码。
kotlin不仅可以编译为jvm平台的字节码文件,还能够直接编译成二进制文件以及js文件。有了对 JVM、Android、JavaScript、iOS、Linux、Windows、 Mac 甚至像 STM32 这样的嵌入式系统的支持,Kotlin 可以处理现代应用程序的任何组件与所有组件。 这为代码与专业知识的复用带来了宝贵的收益,节省了工作量去完成更具挑战任务,而不是将所有东西都实现两次或多次。
它是如何工作的
总得来说,多平台并不是为所有平台编译全部代码。这个模型有其明显的局限性,我们知道现代应用程序需要访问其所运行平台的独有特性。Kotlin 并不会限制你只使用其中所有 API 的公共子集。 每个组件都可以根据需要与其他组件共享尽可能多的代码, 而通过语言所提供的 expect/actual 机制可以随时访问平台 API。
expect/actual
在一些情况下我们可能需要针对不同的平台编写不同的代码。 这时我们需要通过expect关键字在公共代码部分定义需要在不同平台实现的类或者方法,然后在各平台对应的目录下通过actual关键字去实现对应的类或方法。 如图中所示,在公共代码部分,writeLogMessage方法通过expect关键字定义。

b6bcc5fea15631814ae0208fff2e0951.png


然后我们需要在不同的平台中去实现该方法 如js平台的实现:

d02f3ecac415c8201f77f565f4e93f0f.png


jvm平台的实现:

53b7fee9d452f11f862c56180ceb462b.png


多平台库依赖其他多平台库
二、项目搭建
(一)项目创建
这里建议使用最新的idea,虽然理论上项目使用gradle构建,用Android studio应该也是没问题的,但是idea自带项目骨架,还是方便不少。
1.使用idea新建项目,在kotlin项目中选择Multiplatform Library

846eabdb4ba7144c9bb39e1f47a38949.png

e8e1d387195219a321d94715caaf2eae.png

645c8b18482e3f84db032f643064cd46.png


小技巧:

  • 默认的项目构建依赖的gradle版本本地没有,需要下载,此时可终止任务,修改本地存在的较新版本的gradle。
  • 项目默认会构建macos平台,会下载相关依赖库,如果不需要macos平台可以终止任务后在build.gradle中移除macos相关配置

(二)项目结构
创建项目后会自动生成以下目录

2d308f5381c13fbb43862b8f44a9f1df.png


commonMain目录是公共代码所在的目录

287abbc4896a5028eca3f5408c88b176.png

注:默认没有iOS目录,如果需要iOS平台需自行手动创建
commonMain内的结构和普通项目类似

d0638bea397dbfcb6c487116c2562872.png


(三)项目build.gradle
默认文件:

43d4a84a2b124526f659c0f83d763ab7.png

b6e913ecadfeef84c8fab92a51d56d9b.png


根据需求修改后的文件

9b9f01b3116ad4174d9e62e427e1852c.png

e913cf46b32625d442e8751a2b47fa15.png

191bc789e192d29001ba548dcc7af8ff.png

e540ba9a8e4d8b67e51e6f6e7fc0885c.png

提示:Kotlin版本、Gradle版本、Xcode版本、系统版本都存在依赖关系,所依赖的第三方库也存在依赖关系建议均使用最新版本可以通过maven仓库搜索查看最新版本
四、打包发布
(一)执行打包任务
打开右侧gradle面板
执行assemble任务

5c8a27b04e53641e117085ef43488dde.png


然后在项目目录下可以看到build目录

d0466f15e6449a349cf0bf4318d77b3c.png


(二)本地依赖包
在build目录我们可以找到各个平台需要的库文件

b9fe4f732aa8c1304930240973a35083.png


在bin目录下可以找到iOS平台需要的framework文件。 js目录下是js平台可以使用module。 jvm以及Android平台可以直接使用libs目录下的xxx-jvm-version.jar文件
(三)上传maven仓库
我们也可以使用maven-publish插件将库上传到maven仓库中。 构建脚本会分个平台生成多个平台的jar包,然后上传至maven。
apply plugin: 'maven-publish'

f81f87f5fac62c942bcd360205498fb3.png


在build.gralde文件中引用maven-publish插件,并配置后,在右侧gradle的面板中即可看到对应的publish任务

51e5183655655f85ddf3014a3db8334b.png


1.本地maven仓库上传
执行publishToMavenLocal任务即可将各平台库打包成jar并发布到本地的maven仓库中。 我们也可以选择性的发布某一个平台的jar到本地maven仓库中。
2.远程maven上传
执行publish任务即可将各平台库打包并发布到本地的maven仓库中。

156fb47cca8ae8b0e70af4eaacc4ee44.png


(三)npm仓库上传
对于npm仓库的上传,可直接修改build/js目录下pacakage.json的相关配置,然后执行npm publish命令进行上传
五、库的使用
kotlin跨平台技术实际上已经为我们生成了各平台对应的库,在库的使用上与以往没有什么差别。 Android和jvm平台可以使用本地或maven仓库中jvm平台的jar包 iOS平台可以使用build目录下生成的framework库文件 js平台可以将build/js目录作为module使用,或将module上传至npm
下一章我们将继续介绍在多个平台能同时使用的网络库、序列化库,使网络请求相关的代码只需要一份,即可在多个平台运行。

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐