内容来源:2017 年 10 月 28 日,沪江资深Android工程师何梁伟在“沪江技术沙龙 - 探寻跨平台开发最佳实践”进行《Kotlin 跨平台,还有Native》演讲分享。IT 大咖说(微信id:itdakashuo)作为独家视频合作方,经主办方和讲者审阅授权发布。
阅读字数:2615 | 7分钟阅读
摘要
Kotlin 作为一门跨平台的语言,不仅可以支持 Android 、JVM、前端的开发,今年 Kotlin 发起了 Native 的项目,让 Kotlin 可以实现原生侧的跨平台开发。
Kotlin 简介
Kotlin 主要是由俄罗斯圣彼得堡的JetBrains开发团队所发展出来的编程语言,正式发布是在2012年。它在 github 上的提交量自从2014年就逐步增长,到2017年google IO 宣布支持 Kotlin 后增长更加迅速。
Kotlin 跨平台
Kotlin 作为一个跨平台的语言在各个平台都有应用,包括 Server、Android、JavaScript、Native、DSL。
Kotlin for Server Side
在 Server 上 Kotlin 的表现力很强,通常在使用Java 进行开发的时候相对来说会比较繁琐,由语言所带来的噪音也会更多。而通过 Kotlin 来实现功能则会更简洁便利。
后端的 Java 是不支持协程的,虽然有一些方法能够解决这方面的问题,但是相对 Kotlin 原生对协程的支持还是有一定差距。
由于Kotlin 的母公司本身做的就是 IDE 开发,所以在IDE 插件的支持上更加丰富,使用时能够获得更多的能帮助。另外它的学习成本很低,无论原先是 Java 还是 Android 开发都能迅速的转换到 Kotlin 上。
后端开发对框架有着比较强的依赖,Kotlin 在这方面也没有落后。Spring 在5.0版本以后就支持了 Kotlin 的API调用,另外还有Vert.X、Ktor、kotlinx.html等框架同样支持Kotlin。
Kotlin for JavaScript
就我们使用的体验来看,Kotlin 相比 JavaScript 并没有太大的优势,但是由于Kotlin 能够转化为JavaScript,所以它能够在将多个平台的业务逻辑控制在一套代码内的方向上走的更远。
Kotlin for Android
出于 google 官方对Kotlin 的支持,它在Andriod 平台的开发非常方便。Andriod Studio 对 Kotlin有着大量的支持,并且从3.0开始默认支持Kotlin 开发。另外Java 和 Kotlin 是可以进行互操作的,在使用 Kotlin 开发的过程中随时都可以切换到Java 继续开发,这对于还不熟悉Kotlin 的开发者来说会相当便利的。
Kotlin Native
上图是Kotlin Native 的发展情况,从v3.0开始Kotlin Native才正式支持windows 平台的开发。
上面就是Kotlin Native 的 Hello World 代码,可以看出这段代码其实和Java 的差别不大。不过在Java 中这段代码需要写在class 内,而Kotlin 没有这方面限制。
在代码编写完成后要通过Kotlinc 进行编译,编译完成后会生成一个hello.kexe 文件 ,运行该文件就可以执行代码。
目前Kotlin Native 的开发平台有Mac OS、Ubuntu、Microsoft Windows,应用平台包括iOS、Raspberry Pi、Android。
Kotlin 要做原生平台的开发,面临的首个问题就是如何与其他语言代码通信,其中最重要的是于C 语言的交互。要做到这点需要完成3个步骤,首先是创建 .def 文件,然后用cinterop 工具生成 bindings,最后编译Kotlin / Native 项目。
.def 文件
图中展示的是.def 文件的配置。Headers 是对需要引入的头文件的定义,linkerOpts.osx,linkerOpts.linux 分别是不同平台对应的包,后面的值是包的搜索路径。staticLibraries 则是用到的静态库的依赖,下面的libraryPath 是这些库的搜索路径。在导入git2.h文件的时候默认会同时导入依赖,而对于不需要的部分可以通过headerFilter 配置过滤。通过上面的.def 文件就可以去生成需要的库。
基本类型
在正式开发的过程中,所处理的更多是类型之间的映射。基本类型中Int 类型被映射到Kotlin的IntVar 中,char 则相对于 ByteVar 。
指针
在C 语言的开发中经常会碰到处理指针操作,Kotlin 也在这方面进行了对应的映射。下图就是他们之间的映射关系。
Kotlin 提供了.pointed 来获取指针对应的值(*),.ptr 获取指针(&)。
指针转换
指针转换在原生开发中十分常见,虽然安全性有些问题,但是应用场景还是有很多。Kotlin 也提供了指针转换的操作,上图是实践案例。
Strings
String 基本上在所有的语言中都是比较特殊的类型,在开发过程中C 语言传递字符串,有时传递的是char 指针。Kotlin 中提供了获取这些指针的方法,以此来拿到字符串。不仅如此还可以将字符串反向转换成对应的char 指针。
回调
回调会传递对应的引用,Kotlin 也提供了一些方法去创建对应的Object的引用,并且能拿到所需要的值。
内存
内存管理对开发者来说成本还是比较大的,于是Kotlin 两种管理内存方式,一种就是原生的,直接申请内存释放内存。另一种方式相对更方便,Kotlin 提供了memScoped 闭包,在这个闭包中只需要申请内存,释放内存会自动进行。
.klib
前面提到的都是Kotlin 与C 语言交互,而要能够应用就需要进行编译,对于库文件的编译要使用 -p library参数。上图中编译出来的是一个.klib文件,可以被其他的Kotlin 程序复用。
Kotlin 还提供了klib的管理工具,可以进行第三方库的安装以及管理,并且还能查看库的内部情况。对于库的引用与Java很类似,直接通过import就能完成。