はじめに
第一部 Kotlin/Nativeを利用したクロスプラットフォームアプリ開発
第1章 Kotlin/Nativeの紹介
第2章 Kotlin/Nativeの実行環境の構築
第3章 Kotlin/Nativeプロジェクトの作り方
第4章 Kotlin/Nativeプロジェクトにおけるテスト実行環境の構築方法
第5章 ライブラリを追加する方法
第6章 既存のプロジェクトに導入していくには
Kotlin/Nativeまとめ
第二部 Swift for Androidを利用したクロスプラットフォームアプリ開発
第7章 Swift for Androidとは
第8章 Swift Packageの共有:開発環境とプロジェクト構成
第9章 Swift Packageの共有:プロジェクトの作成方法
第10章 他のSwift Packageを参照する
第11章 Swift Packageの共有:メリットとデメリット
第12章 Scadeとは
第13章 ScadeのHello World
第14章 Scadeを使ったTODOアプリ開発
Swift for Androidまとめ
おわりに
この度は本書をお手に取っていただきありがとうございます。本書はKotlin/NativeとSwift for Androidを用いたクロスプラットフォームアプリ開発について紹介するものです。
基本的にソフトウェアは動作させる環境を想定し、それに合わせて開発を行います。したがって、ある環境を想定して作ったソフトウェアは他の環境では使えません。それはモバイルアプリ開発においても同様です。
しかし動作環境や求められるアプリ体験が多様化している昨今、そのような状態は開発者やユーザーの選択の幅を狭めてしまいます。そこで、単一のプログラムで複数の動作環境に対応できるクロスプラットフォームアプリの開発手法が関心を集めています。
クロスプラットフォームアプリ開発を行うと、ひとつのコードをプラットフォームをまたいでも利用できるので、同様のコードを書く工数を下げることができます。また、プラットフォーム間で仕様に差分が発生してしまうようなケースも回避できます。つまり、
・コードを統一することでデリバリーを短くしたい
・開発人数が少ないので、メンテナンスするコード量を少なくしたい
といったことを考えたことのある方には、クロスプラットフォームアプリ開発を検討してみる価値があるでしょう。
一口にクロスプラットフォームアプリ開発といっても、それを実現する仕組み・ツールは複数存在します。例えば有名なものとしては、React NativeやFlutterが挙げられます。しかしこれらのメジャーなツールは、JavaScriptやDartのようなWebフロントエンド開発で使われるような言語を利用したものが多く、モバイルアプリ開発者にとってはそれほど親しみのない環境かもしれません。
そこで本書では、モバイルアプリ開発者に親しみのあるKotlinやSwiftを用いてクロスプラットフォームアプリ開発を行うことができる、Kotlin/NativeとSwift for Androidを紹介していきます。
本書は、モバイルアプリ開発者がクロスプラットフォームアプリ開発の最初の一歩を踏み出すためのものです。本書で取り上げる開発手法はまだAlphaレベルであり、どちらかというとマイナーな存在ですが、モバイルアプリ開発者に親しみのある言語を使用できるものです。クロスプラットフォームアプリ開発に関心はあるが、なかなか時間を割けていないモバイルアプリ開発者の皆様にとって、本書を読むことで日頃の開発に新しい視点を持ち込むきっかけとなりましたら幸いです。
本書は、プラットフォームごとにふたつの部で構成されています。
出版の都合上、連番の章立てとなっていますが、第1章~第6章を第一部、第7章~第14章を第二部としています。
・第一部 Kotlin/Nativeを利用したクロスプラットフォームアプリ開発
─はじめに
─第1章:Kotlin/Nativeの紹介
─第2章:Kotlin/Nativeの実行環境の構築
─第3章:Kotlin/Nativeプロジェクトの作り方
─第4章:Kotlin/Nativeプロジェクトにおけるテスト実行環境の構築方法
─第5章:ライブラリを追加する方法
─第6章:既存のプロジェクトに導入していくには
─まとめ
・第二部 Swift for Androidを利用したクロスプラットフォームアプリ開発
─はじめに
─第7章:Swift for Androidとは
─第8章:Swift Packageの共有:開発環境とプロジェクト構成
─第9章:Swift Packageの共有:プロジェクトの作成方法
─第10章:他のSwift Packageを参照する
─第11章:Swift Packageの共有:メリットとデメリット
─第12章:Scadeとは
─第13章:ScadeのHello World
─第14章:Scadeを使ったTODOアプリ開発
─まとめ
内容や目的はそれぞれの部で異なりますが、対象読者は同じような方々を想定しています。
・すでにモバイルアプリの開発をしているソフトウェアエンジニア
・iOS/Androidのどちらかに関心・スキルがあるが、両方向けのアプリを開発したい方
それぞれのプラットフォームのアプリ開発についての、初歩的な内容については触れません。
本書の著者は「からふるぼーど」というサークルに属し、技術書典など向けに技術同人誌を執筆しています。
「からふるぼーど」というサークルは、とある小さなスタートアップに集まったエンジニアメンバーを中心に結成されました。自分たちの所属を超えてお互いの情報交換をするうちに、知識や情報を丁寧に整理してより広く共有していきたいという想いから、本書の執筆という企画をスタートさせました。
メンバー各々はそれぞれ異なるプラットフォームや分野に関心・強みがありましたが、今回はモバイルアプリの領域で活動している二人が、以前より関心の強かった「クロスプラットフォームアプリ開発」についてそれぞれ取り組み、一冊の本に仕上げました。各個人の詳細については、巻末の著者紹介を参照してください。
本書に記載された内容は、情報の提供のみを目的としています。したがって、本書を用いた開発・製作・運用は、必ずご自身の責任と判断によって行ってください。これらの情報による開発・製作・運用の結果について、著者はいかなる責任も負いません。
本書に記載されている会社名、製品名などは、一般に各社の登録商標または商標、商品名です。会社名、製品名については、本文中では©、®、™マークなどは表示していません。
本書籍は、技術系同人誌即売会「技術書典」で頒布された書籍「Kotlin&Swiftで始めるクロスプラットフォームアプリ開発入門」を底本としています。
この部では、Kotlin/Nativeを利用したクロスプラットフォームアプリ開発について解説します。
内容としては、Kotlin/Nativeに関心を持った人の最初の一歩に貢献できるよう、環境構築などにフォーカスしたものになっています。この本を読み終わった後には、Kotlin/Nativeを利用したiOSとAndroidアプリが作れている状態を目指したいと思います。
解説に入っていく前に、私がこの技術に関心を持った背景をお伝えしたいと思います。
多くのサービスは、様々なユーザーに使ってもらえるように、iOS/Android/Webなど複数のプラットフォームで提供されています。
開発は各プラットフォームごとに開発が進められていることが多く、その結果、開発リソースの肥大化や各プラットフォーム間の仕様のずれ、知識の分断などが発生しています。そういった課題の解決に向けて、ここ数年はReact NativeやFlutterといったクロスプラットフォーム開発のキーワードが、多くの関心を集めています。
かくいう私も、React Nativeを利用して、iOS/Android開発に取り組んだことがあります。具体的には、iOS/Androidで書かれた稼働状態のプロジェクトに対して、共通部分をReact Nativeに置き換えていくというものでした。その取り組みを通してコードが共通化されるため、各プラットフォーム間の仕様ずれ、知識の分断といった課題は解決できました。その一方で、採用するまでは見えていなかった辛さも、見えてくるようになりました。具体的な内容としては、以下のようなものです。
まず一番は、そもそもすべてのコードがReact Nativeで共通化できるわけではなく、結局、各プラットフォームに応じた最適化が必要になるということです。特にUI実装などは、React Nativeで実装することによりパフォーマンスなどの問題が発生し、各プラットフォームに応じた最適化が必要になります。結局、各プラットフォームの固有の知識を持った上で、React Nativeの開発にも取り組まなければなりませんでした。そして、そういった各プラットフォームに対して深い知識を持った人は多くないため、そもそも開発チームを作っていくことの難しさがありました。
また、汎用的なUIを実現するためのライブラリなど、依存するライブラリが一気に増えてしまいました。そして不幸なことに、発展途上の技術ということもあり、ライブラリの更新は頻繁で、一方React Nativeの関連ライブラリは更新されないことが多々ありました。
このような課題がある一方、React Nativeのようなツールで共通化しやすい機能部分はそもそもシンプルで、各プラットフォームで実装しても開発コストがかからない部分が多いです。そのため、React Nativeを採用することは、ただただメンテナンスの難易度を上げるだけなのではと感じました。
こういった当初の思惑と外れて、実務のプロジェクト的には使い勝手が悪く感じた部分が影響し、プロジェクトからもReact Nativeのコードは削除することになりました。そして、そのReact Nativeのコードを抜いていく作業も、普段iOS/Androdiのアプリを開発しているようなエンジニアが持っていない知識を有するエンジニアの手が必要でした。さらに、再度Nativeのコードで書いていく必要があるため、開発/検証含めて膨大な時間がかかりました。
実際、同じように、導入していたReact Nativeを削除する判断をした会社は少なくないように感じています。有名なところでは、AirBnbなども同じような理由でReact Nativeの採用をやめて、Nativeでの開発に移行するというブログを出していました。
・AirBnbのブログにあるSunsetting React Nativeの記事:
─https://medium.com/airbnb-engineering/sunsetting-react-native-1868ba28e30a
ここで、React Nativeを導入することでどうなることを期待していたのか、改めて考えてみたいと思います。
大きく期待していたのは、以下の2点です。
・メンテナンスするコードをひとつにすることで、ドメイン知識が集約
・コードを書くのが一度で済むため、開発スケジュールの短縮および開発リソースの節約
このような期待に対して、各プラットフォームの影響が出にくいロジックのような処理はうまく共通化でき、ドメイン知識の集約の課題は解決できました。しかし、開発スケジュールの短縮および開発リソースの節約に貢献したかというと、むしろ開発が遅延しやすい環境を作ってしまうこととなりました。React Nativeの実装だけではなく、各プラットフォームでの最適化が必要な部分がある点や、開発リソースの確保が難しい点、依存ライブラリ管理の難しさから運用コストが上がる点などが理由です。以上の内容から、一度コードを書くだけでいいので工数を短縮できる、という期待を達成するのは難しそうに感じました。
そういった背景の中で、なぜKotlin/Nativeに興味を持ったのかは、第1章で説明していきたいと思います。
これまでの内容から、React Nativeは不要な技術なのかというとそうではなく、使いどころがあっていなかったんだろうなという所感です。
具体的にReact Nativeが合っていそうだと感じるのは、以下のような場面です。
・開発速度を最大にして、早く多くのユーザーに使ってもらい、PMFを確かめたいようなプロジェクトの初期。Hot reload機能も、よりいっそう活きてくる。
・メンテナンスが不要な、作りきりのプロダクト。
また、上記のような場面以外にも、React Nativeを全社的にやっていくことを決意し、会社に知識を集めていくことで、前述のような課題を解決していくことも考えられると思います。
・クロスプラットフォームアプリ開発に興味がある方
・Kotlin/Nativeに興味はあるが、まだ使ったことがない方
・前述のような悩みを持ったことがある方
本部の構成は、次のようになっています。
・第1章:
─Kotlin/Nativeとは
・第2章:
─実行環境を構築する方法
・第3章:
─プロジェクトの作り方
・第4章:
─テスト実行環境の構築方法
・第5章:
─ライブラリを追加する方法
・第6章:
─既存のプロジェクトに導入していくには
紹介する実装内容は、重要な部分は記載していますが、紙面の都合によりすべては載せていません。動作可能なサンプルコードは、次のリポジトリにアップロードしてありますので、適宜参照してください。
・サンプルコードのGithubリポジトリ
Kotlinを利用して、クロスプラットフォームアプリ開発ができるKotlin/Nativeについて紹介します。Kotlin/Nativeの有する機能の中でも、iOS/Androidに向けた開発を想定した内容であるため、ServerSideを含む他のプラットフォームでの実行は今回の範囲外となります。
Kotlin/Naitveの紹介をする前に、そのようなツールが作られることとなった背景にある、Kotlin Multiplatformプロジェクトについて紹介します。
Kotlin Multiplatformプロジェクトとは、Android/iOS/JVM/JavaScript/Nativeを含む複数のプラットフォーム向けのアプリやライブラリを生成するためのプロジェクトです。マルチプラットフォームプロジェクトライブラリは、プロジェクトの共有部分をKotlinコードで一箇所で開発し、すべてまたは複数のターゲットプラットフォームで共有するのに役立ちます。
これが、Kotlinマルチプラットフォームの概観です。
Common Kotlinには言語、コアライブラリ、基本ツールが含まれています。共通のKotlinで書かれたコードは、各プラットフォームに向けてトランスパイルされ、すべてのプラットフォームで動作します。
マルチプラットフォームライブラリを使えば、共通コードとプラットフォーム固有のコードで、マルチプラットフォームで使えるロジックを再利用できます。そのため、異なるプラットフォーム用に同じコードを記述して、維持するために費やす時間を短縮できます。実装する上で、HTTP、serialization、coroutinesの管理などのタスクをカバーする一連のライブラリも利用できます。
プラットフォームとの相互運用を行うには、プラットフォームに特化したバージョンのKotlinを使用します。Kotlinのプラットフォーム固有のバージョン(Kotlin/JVM、Kotlin/JS、Kotlin/Native)には、Kotlin言語の拡張機能や、プラットフォーム固有のライブラリやツールが含まれています。これらを通じて、各プラットフォームのネイティブコード(JVM、JS、Native)にアクセスし、すべてのネイティブ機能を活用できます。
Kotlin/Nativeは、Kotlin MultiplatformプロジェクトのNativeコード向けのサブセットです。
具体的には、KotlinコンパイラおよびKotlin標準ライブラリのネイティブ実装用のLLVMベースのバックエンドです。
ターゲットとしては主に、組み込みデバイスやiOSなど、仮想マシンが望ましくない、あるいは可能ではないプラットフォームでのコンパイルを可能にするために設計されています。開発者が追加のランタイムや仮想マシンを必要としない、自己完結型のプログラムを作成する必要がある場合に利用します。
次のプラットフォームが、ターゲットとされています。
・iOS (arm32, arm64, simulator x86_64)
・macOS (x86_64)
・watchOS (arm32, arm64, x86)
・tvOS (arm64, x86_64)
・Android (arm32, arm64, x86, x86_64)
・Windows (mingw x86_64, x86)
・Linux (x86_64, arm32, MIPS, MIPS little endian, Raspberry Pi)
・WebAssembly (wasm32)
Kotlin/Nativeは、ネイティブ環境との双方向の相互運用性をサポートしています。
コンパイラは以下を作成します。
・クロスプラットフォームアプリ用の実行可能ファイル
・C/C++プロジェクト用のCヘッダーをもつ静的ライブラリまたは動的ライブラリ
・SwiftおよびObjective-Cプロジェクト用のAppleフレームワーク
また、Kotlin/Nativeから既存のライブラリを直接使用できるように、次の相互運用性がサポートされています。
・静的または動的Cライブラリ
・C、Swift、およびObjective-Cフレームワーク
そのため、C、C ++、Swift、Objective-C、およびその他の言語で記述された既存のプロジェクトに、コンパイル済みのKotlinコードを簡単に組み込むことができます。 また、既存のネイティブコード、静的または動的Cライブラリ、Swift/Objective-Cフレームワーク、グラフィカルエンジンなど、Kotlin/Nativeから直接使用することも簡単です。
POSIX、gzip、OpenGL、Metal、Foundation、および他の多くの一般的なライブラリとAppleフレームワークは事前にインポートされており、Kotlin/Nativeライブラリとしてコンパイラパッケージに含まれています。