JetBrains开发者日见闻(一)之Kotlin/Native 尝鲜篇

本文介绍了作者参加JetBrains开发者日的体验,重点探讨了Kotlin/Native,包括其基本介绍、开发iOS HelloWorld应用的过程、运行原理分析、项目结构解析以及开发体验。文中还对比了Kotlin/Native和Flutter,并给出了学习这两项技术的建议。
摘要由CSDN通过智能技术生成

简述:
今天我们来讲点Kotlin中比较时髦的东西,有的人可能会说:“不像你之前的风格啊,之前的文章不是一直在死扣语法以及语法糖背后秘密。当你还在死扣泛型语法的时候,别人的文章早就说了Kotlin/Native和Kotlin1.3的新特性”。瞬间感觉自己out了,今天我们就说说这些时髦的东西,也许你能看到一些和别人不一样的东西哦。

前段时间你们的熊猫小哥哥(也就是我),由于对Kotlin过度热爱,一天偶然看到2018 JetBrains开发者日-Kotlin专场活动,脑袋一热,瞬间心动了,马上就买了门票和火车票去北京(第一次一个人去北京)参加活动了。因为看到有Kotlin中文社区两位大佬(这两位大佬是我一年多以前开始写Kotlin的时候就关注了他们)的演讲日程以及JetBrains资深布道师Hali的演讲,没有过多思考直接买票,不要怂就是干。最后顺便和Kotlin社区的大佬们面个基啥的,谢谢大佬们的热情款待。此次北京之行收获挺多的,有时候知道一些最新技术方向和动态会比你埋头闭门造车好的很多。

因为在我的公众号上(Kotlin开发者联盟),有一些小伙伴希望我能从北京的开发者会上带点东西回来,所以总结了一下结合自己实际的开发,给大家带来以下几篇文章。

  • 1、Kotlin/Native1.0 Beta(尝鲜篇)
  • 2、Kotlin中1.3版本新特性都有哪些?
  • 3、Kotlin中的Coroutine(协程)在Android上应用(协程学前班篇)
  • 4、Ktor异步框架初体验(Ktor学前班篇)

那么,今天就开始第一篇,看过一些大佬写关于Kotlin/ Native的文章,基本上都是翻译了Kotlin Blog的官网博客, 具体如何实践的还是比较少的。今天我不打算这么讲,既然今天的主题是时髦那就讲点有意思的东西。一起来看下今天提纲:

一、重新认识Kotlin语言

在开始之前,我觉得有必要一起重新来认识一下Kotlin这门语言,很多人一直都认为它不就是门JVM语言和Java、Scala一样都是跑在JVM虚拟机上。其实Kotlin并不仅仅是一门JVM语言,它的野心是真的大,JVM语言已经无法满足它的雄心壮志了。它是一门多平台的静态编译型语言,它可以用于JVM上(只不过在JVM层面比较出名而已,导致很多人都认为它是门JVM语言),实则它可以编译成JavaScipt运行在浏览器中也可以编译成IOS的可运行文件跑在LLVM上

二、Kotlin/Native的基本介绍

用官方的话来说Kotlin / Native是一种将Kotlin代码编译为本机二进制文件的技术,可以在没有虚拟机的情况下运行。它是基于LLVM的后端,用于Kotlin编译器和Kotlin标准库的本机实现

Kotlin/Native目前支持以下平台:

  • — iOS (arm32, arm64, emulator x86_64)
  • — MacOS (x86_64)
  • — Android (arm32, arm64)
  • — Windows (mingw x86_64)
  • — Linux (x86_64, arm32, MIPS, MIPS little endian)
  • — WebAssembly (wasm32)

为了更好说明Kotlin/Native能力,下面给出张官方的Kotlin/Native能力图:

对于Kotlin/Native之前一直没有去玩过,只是经常听到社区小伙伴们说编译起来巨慢,感觉好时髦啊。抱着好奇心,并且也符合我们这篇文章时髦的主题,决定一步步带大家玩一玩。

三、Kotlin/Native开发IOS HelloWorld

1、需要准备的开发工具
  • AppCode 2018.1(建议下载最新版本,这里不是最新版本不过也能玩哈,最新版本应该到了2018.3)
  • Kotlin/Native Plugin 181.5087.34(注意: 插件和AppCode IDE的版本匹配问题,建议把IDE安装好,然后IDE搜索下载会默认给最佳匹配的插件版本的)
  • Xcode 9.2(注意: 这里Xcode版本需要AppCode版本匹配,否则会有问题的,不过不匹配的话IDE会有提示的,建议如果AppCode 2018.1(Xcode 9.2), AppCode 2018.3(Xcode 10.0))
2、创建一个Kotlin/Native项目

第一步: 选择左侧的Kotlin/Native, 并选择右侧的Sing View App with a Kotlin/Native Framework

第二步: 填写项目名和包名,选择语言Swift(这里先以Swift为例)

第三步: 最后finish即可创建完毕Kotlin/Native项目,创建完毕后项目结构如下

4、运行Kotlin/Native项目

如果你比较幸运跑起来的话,效果应该是在模拟器装一个APP并且起了一个空白页,终端上输出了"Hello from Kotlin!"的Log,类似这样:

注意: 但是你是真题测试,而且Run顶部默认只有一个IOS Device选项的话,然后你又点了Run 说明而且会报如下错误

这个问题是因为默认IOS Device选项是表示用真机调试哈,然后这边就需要一个IOS开发者账号。设置开发者账号的话,建议使用Xcode去打开该项目然后给该项目配置一个开发者账号。

设置完毕Xcode后,AppCode会自动检测到刷新的。

四、Kotlin/Native开发IOS 运行原理分析

看到上面IOS HelloWorld项目运行起来,大家有没有思考一个问题,Kotlin的代码的代码是怎么在IOS设备上跑起来呢?

实际上,在这背后使用了一些脚本和工具在默默支撑着整个项目的运行,如前所述,Kotlin / Native平台有自己的编译器,但每次想要构建项目时手动运行它明显不是高效的。 所以Kotlin团队了选择Gradle。Kotlin / Native使用Gradle构建工具在Xcode中自动完成Kotlin / Native的整个构建过程。在这里使用Gradle意味着开发人员可以利用其内部增量构建架构,只需构建和下载所需内容,从而节省开发人员的宝贵时间。

如果,你还对上述有点疑问不妨一起来研究下Kotlin/Native项目中的构建参数脚本:

  • 打开构建脚本是需要在Xcode中打开的,具体可以参考如下图:

通过以上项目可以分析到在Xcode中编译一个Kotlin/Native项目,实际上在执行一段shell脚本,并在shell脚本执行中gradlew命令来对Kotlin/Native编译,该脚本调用gradlew工具,该工具是Gradle Build System的一部分,并传递构建环境和调试选项。 然后调用一个konan gradle插件实现项目编译并输出xxx.kexe文件,最后并把它复制到iOS项目构建目录("$TARGET_BUILD_DIR/$EXECUTABLE_PATH")。

最后来看下Supporting Files中的build.gradle构建文件,里面就引入了konan插件(Kotlin/Native编译插件), 有空的话建议可以深入研究下konan插件,这里其实也是比较浅显分析了下整个编译过程,如果深入研究konan插件源码的话,更能透过现象看到Kotlin/Native本质,这点才是最重要的。

buildscript {
    ext.kotlin_version = '1.2.0'
    repositories {
        mavenCentral()
        maven {
            url "https://dl.bintray.com/jetbrains/kotlin-native-dependencies"
        }
    }

    dependencies {
        classpath "org.jetbrains.kotlin:kotlin-native-gradle-plugin:0.7"
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
    }
}

apply plugin: 'kotlin'

repositories {
    mavenCentral()
}

dependencies {
    compile "org.jetbrains.kotlin:kotlin-stdlib"
}

apply plugin: 'konan'

konan.targets = [
    'ios_arm64', 'ios_x64'
]
        
konanArtifacts {
    program('KotlinNativeOC')
}
        

五、Kotlin/Native项目结构分析

1、Kotlin/Native + Swift项目结构分析

我们知道main函数是很多应用程序的入口,ios也不例外,在AppDelegate.swift中有@UIApplicationMain的注解,这里就是APP启动的入口。

@UIApplicationMain //main函数注解入口,所以AppDelegate类相当于启动入口类
class AppDelegate: UIResponder, UIApplicationDelegate {
   

    var window: UIWindow?//默认加了UIWindow



    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
   
    // KNFKotlinNativeFramework class is located in the framework that is generated during build.
    // If it is not resolved, try building for the device (not simulator) and reopening the project
    NSLog("%@", KNFKotlinNativeFramework().helloFromKotlin())//注意: 这里就是调用了Ko
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

熊喵先生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值