まえがき
この記事は モバイルファクトリー 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」です。がっかりランキングも知りたい。