Kotlin
KotlinNative

Kotlin/Nativeをさわりだけさわってみた

まえがき

この記事は モバイルファクトリー Advent Calendar 2017 19日目の記事です。

この記事は2017年12月執筆の記事です。Beta版に対しての言及であるため、参照時にはご留意願います。

Kotlin/Native

元々はJetBrains社が開発したJVM言語で、Androidの統合開発環境がInteliJベースで有ることから、目下利用用途はAndroid開発に使用されることが多い言語でした。今年のGoogleI/OでAndroidの正式開発言語として採用され、急速に注目度が高まっています。
また、JVM言語であることからJavaの資産の大部分を流用できるため、サーバサイド言語としても注目が集まっています。

そんなJVM言語のKotlinでしたがKotlin/NativeはKotlinのモダンな書き味そのままにiOS、JS(wasm)、Windows、Mac、Linuxに対応できるそうです。

Android/iOS両対応

目下皆さんがKotlin/Nativeに興味を持つのは、Android, iOSの両対応でしょう。

Android対応状況

  • arm32 and arm64

atomは現段階では未対応な模様

iOS対応状況

  • arm64

iPhone5c、iPhone5以下が現段階で未対応なもよう

とはいえ、iPhone5についてAppleのサポートが終わっていますので、今から作り始めるならそこまで気にならないかもしれません。

仕組み

@amay077 さんの https://qiita.com/amay077/items/45b1ad4b9c5d3a03cf9c の記事が参考になりました。

要約

  • Kotlinコードのレベルで共通化ができる
  • 周辺ライブラリは実行環境によるのでjavaの資産が流用できないわけではないが、java.*系を使うにはメソッド単位で大量のbridgeを書く必要がある。
    • なのでkotlin系のライブラリでも、中身でjava.*に依存してるとそのライブラリ自体をbridgeする必要がある。

とりあえずiOSアプリをビルドしてみる

Kotlinコンパイラをビルド

JetBrains/kotlin-nativeリポジトリのREADMEを実施すればできます。

事前準備して

  • JDK
  • Xcode 9.2(Macなら)
    • iOS向けじゃなければCLangあたりがあれば大丈夫かと。多分。

dependenciesを更新して

./gradlew dependencies:update

コンパイラとコンパイルライブラリをbuild

./gradlew bundle

1時間かかるって書いてるけど、手元のMacBookPro13inだと2時半。。。

BUILD SUCCESSFUL in 2h 25m 13s

build後はプロジェクト全体で1.4G
必要最低限のdist以下で800M程度です。

dist/binにPATHを通す

export PATH=$PATH:$HOME/local/kotlin-native/dist/bin

iOSプロジェクトを作る

JetBrains/kotlinconf-spinnerのサンプルプロジェクトを参考に作ると良いでしょう。
OpenGL系で少しモリモリ感ありますが。

が、今回はちょっとkotlincのbuildに時間とられてしまったので、sampleプロジェクトをそのまま使ってみる。すいません。。

ディレクトリ構成

kotlin-native
├── external
└── samples
    └── fullstack
        ├── KotlinCMakeModule
        ├── clients
        │   ├── android
        │   ├── cli
        │   ├── ios
        │   │   └── konf-demo.xcodeproj
        │   ├── shared
        │   └── webassembly
        ├── common
        │   └── src
        ├── content
        ├── getopt
        ├── gradle
        ├── httpserver
        ├── json
        ├── kurl
        ├── sql
        └── utils
            ├── android
            ├── ios
            └── src

xcodeprojありました。これをXcodeで開いてみます。

TARGETS > konf-demo > Build Phasesを見てみる

この辺にキモになりそうな設定がありそうです。

Remove Original Binary

rm -f "$TARGET_BUILD_DIR/$EXECUTABLE_PATH"

Compile Kotlin Sources

$SRCROOT/../../gradlew -p $SRCROOT compileKonanApp -Pdisable.android=true

Replace Original Binary

cp "$SRCROOT/build/konan/bin/iphone/app.kexe" "$TARGET_BUILD_DIR/$EXECUTABLE_PATH"

あとは普通にbuild

あああ。AppleDeveloperCenterの登録が。。。

というわけで、ここで断念。片手落ちな結果ですが、続きは後々追記致します。。

まとめ(途中経過)

  • 運用を想定するなら、まだ時期尚早そう。
  • Rx系とかbindingsが整うの待ち
    • でも整えば、View以外を共通化してMVVMとかもできそう

次は @lycoris102 さんの「[Unity] 今年個人的に買ったアセット紹介2017」です。がっかりランキングも知りたい。