ビジネスロジックを共有する、クロスプラットフォーム・モバイルアプリケーション開発のためのソリューションの1つとして、Kotlin Multiplatform Mobile(以下、KMM)があります。
JetBrainsによって開発されたKMMは、iOSとAndroidの間でコードを共有できるため、開発にかかる時間と労力を大幅に削減できます。また、表現力豊かなプログラミング言語「Kotlin(コトリン)」を活用することで、KMMはネイティブのパフォーマンスと柔軟性を維持しながら、シンプルかつ効率的なコード記述が可能です。
KMMと他のクロスプラットフォームソリューションの決定的な違いは、プラットフォーム固有の機能を完全に抽象化しようとしない点です。この技術はコアロジックに共通のコードベースを提供する一方で、両プラットフォーム固有の機能を実装するためにネイティブAPIへの自由なアクセスを可能にしています。その結果、共有のビジネスロジックとネイティブユーザー体験というそれぞれの長所を兼ね備え、開発者がアプリケーションの構造を自由にコントロールできるようになります。
KMMは、エンドユーザー向けにネイティブ品質の高い水準を維持しながら、無駄な作業を排除して開発プロセスを簡素化したいチームにとって、効果的と言えます。既存のプロジェクトやツールとの統合が簡単なため、徐々にKMMの採用は広まりを見せ、2024年以降のモバイルアプリ開発における選択肢の1つになるでしょう。
【 原点 】
KMMの歴史は、2017年に遡ります。KMMの初めての進化は、Kotlin1.2にKotlinのマルチプラットフォーム機能が初めて登場した時でした。このバーションでは、開発者は複数のプラットフォームにコンパイル可能な共有コード記述ができましたが、当時はKotlin/JVMとKotlin/JSの方に焦点が当てられていました。
Kotlin/Native(Kotlinを他のプラットフォームの中でも特にiOS用のネイティブバイナリにコンパイルできるようにする機能)が、本格的に注目されるようになったのは、2018年後半のKotlin1.3のリリースからです。Kotlin/Nativeは、Kotlinのマルチプラットフォーム化の大きな転換点となりました。当初、Kotlin/NativeはiOS、Linux、WindowsなどのAndroid以外のプラットフォームをターゲットにしていました。
これにより、Kotlinによるクロスプラットフォーム開発が本格始動し、様々なプラットフォームでビジネスロジックを共有し、再利用可能なライブラリを利用できるようになりました。しかし、初期段階の開発プロセスは断片的かつエコシステムも未成熟で、モバイル固有の機能の対応は限られていました。
【 誕生 】
さらに、Kotlinのマルチプラットフォーム機能の改良を重ね、クロスエコシステムになる可能性に気付いたJetBrainsは、2019年にKMMを正式に発表しました。
KMM は主にモバイル開発の範囲で機能することを目的としており、AndroidやiOSアプリ開発にKotlinで共有コードを書くことが可能になりました。ネイティブパフォーマンスやユーザー体験に一切妥協しないクロスプラットフォーム・ソリューションの需要が高まっていたため、これは自然な対応だったと言えます。
KMMは、「一度書けばどこでも実行できる」という考え方ではなく、ロジックとアプリのコアモジュールのみを共有し、UIやその他のプラットフォーム固有のコンポーネントなど、その他はすべてネイティブのままにすることを提唱しています。このハイブリッドモデルは、コード再利用のあらゆるメリット活かしながら、特定のプラットフォーム体験も実現可能です。
【 成長 】
JetBrainsはツールの改善、iOS開発のサポート、ライブラリやフレームワークのエコシステムの拡充を通じて、KMMの改良を続けてきました。2020年にリリースされたKotlin1.4は、Kotlinコンパイラの改善、マルチプラットフォームのサポート、Android StudioやIntelliJ IDEAなどIDEとの統合がさらに深まりました。また、Kotlinのコミュニティも拡大し、プラグイン、ライブラリ、サードパーティツールもKMMの成長と成熟に影響し、モバイル分野におけるKMMの地位はどんどんと向上していきました。
そして2021年までに、KMMは実験的な段階からアルファ版へと進み、より広く採用できる状態になりました。パフォーマンスが向上するにつれ、開発者の体験や安定性も改善され、KMMは生産的なクロスプラットフォームのソリューションを求める企業や開発者から注目を集め始めました。特に、Kotlinの経験者にとっては、既存のコードベースや知識を再利用できる点が大きな魅力となりました。
【 現在 】
現在のKMMは、効果的かつ柔軟なクロスプラットフォームモバイル開発の手段として広く活用されています。コードの再利用性だけでなく、ネイティブ性能とユーザー体験の両立を実現し、クロスプラットフォーム開発の可能性を限りなく広げています。
モバイルアプリ開発には「AndroidやiOSを中心とした複数のプラットフォームに対応する必要がある」という課題が常にあります。
▼ 関連記事 ▼
モバイルアプリ開発の基本〜知識から気をつけたいポイントまで解説〜
従来の開発では、プラットフォームごとに別々のコードベースで開発/維持/アップデートする必要がありました。そのため、それぞれのプラットフォームの開発における専門知識を要求され、コスト増加や開発サイクルの延長、プラットフォーム間の機能互換性や、ユーザー体験の一貫性など、課題が複雑化していました。
このような課題を解決すべく誕生した、React Native、Flutter、Xamarinなどクロスプラットフォーム開発フレームワークは、単一のコードで複数のプラットフォームに対応するアプリケーションを構築することが可能です。しかしこれらのフレームワークを使用した開発の中には、ネイティブAPIへのアクセス制限やパフォーマンスの低下、新しい言語/フレームワークの習得などの課題が残っているものもあります。
また、ほとんどのフレームワークにおいて、サードパーティのツールやプラグインに頼らざるを得ないのが現状です。しかし、これらは常に最新の状態にアップデートされているとは限らず、プラットフォーム固有の機能を全てサポートできるとも限りません。その結果、ユーザーの期待しているネイティブ体験から遠ざかってしまうケースもしばしばあります。
したがって、冒頭に述べた「複数のプラットフォームに対応する」という課題を解決するために求められているのは、「パフォーマンスやユーザー体験を犠牲にすることなく、様々なプラットフォームで効率的にコード共有を提供するソリューション」です。このソリューションで特に開発者が必要としているのは、既存の知識と専門知識を活用しながら、必要に応じてプラットフォーム固有の機能を柔軟に利用できるコードの再利用の仕組みです。
KMMは、クロスプラットフォームモバイル開発への新たなアプローチを提供し、この問題を解決しようとしています。KMMは、AndroidとiOS間でアプリのコアロジックやビジネスモジュールを共有しつつ、プラットフォーム固有のコード(主にネイティブUIや独自機能の処理)を分離して管理することが可能になります。これにより、大幅なコード再利用の実現、開発期間とコストの削減をしながら、高品質なネイティブユーザー体験を維持できます。
KMMの当初のアイデアは、共有コードとプラットフォーム固有のコードを分離することでした。名前が示す通り、共有コードには主にKotlinで記述されたビジネスロジック、データモデル、そしてUI以外のコンポーネントが含まれ、AndroidとiOSの両プラットフォームで共有できるようになっています。
一方、プラットフォーム固有のコードは、通常UIコンポーネントやデバイス固有の機能を含み、AndroidではKotlin、iOSではSwiftやObjective-Cなどのネイティブ言語で記述されます。このようにコードを分離することで、それぞれのプラットフォームの特性を活かした最適なユーザー体験を提供することが可能になります。
KMMは、Kotlin Multiplatform Gradleプラグインを主要なツールとして使用し、プロジェクト内の必要なライブラリやモジュール、コンパイル、およびパッケージ化を管理します。このGradleプラグインにより、複数のターゲットプラットフォーム向けにコンパイルする共有モジュールを指定することが可能になります。また、プラットフォーム固有のソースセットを追加で指定する機能もあり、同じプロジェクト構造内でプラットフォームごとのコードを書くことができます。このGradleとの統合により、Android開発者が習得しやすいのも特徴です。
また、iOS開発向けのKMMは、Appleの開発環境であるXcodeと連携しています。開発者は共有Kotlinモジュールを作成し、Xcodeでの開発内でそれらを依存関係としてリンクすることができます。さらに、KMMは依存関係を管理するためのCocoaPods統合などのツールを提供し、Objective-CやSwift互換のバイナリを生成することを簡単にします。これにより、既存のiOSプロジェクトでKotlinコードを簡単に使用できるようになります。
開発を効率的に行うために、ライブラリやフレームワークの活用は欠かせません。KMMには、以下のようなライブラリがあり、プラットフォーム間でシームレスに共有できるように設計され、コードの再利用を促進しています。
・Ktor:ネットワーク処理
・SQLDelight:データベース管理
・Kotlinx.serializatio:データシリアル化用
これらのライブラリを使用することで、開発者はアプリケーションロジックの大部分を一度だけ記述し、UIやデバイス固有の機能にはプラットフォーム特有のライブラリを利用することができます。
KMMは、ビジネスロジックを重視したモバイルアプリケーションの開発に多く活用されています。具体的には、認証、データストレージ、ネットワーキング、アプリケーションのビジネスルールなどの基本的なロジックをプラットフォーム間で共有することができます。ユーザー認証、トランザクション処理、データ同期などのコア機能を共有ライブラリでKMMを活用し、各ターゲットプラットフォームにネイティブのUIを構築します。これにより、プラットフォーム間での動作が均一になり、コードの重複が大幅に削減されるため、コストと手間が軽減されます。
また、これまでKotlinでAndroidアプリを開発していたチームにとっては、新たな言語やフレームワークを学ぶことなく、既存のKotlinの知識を活かしてクロスプラットフォームアプリの開発をスムーズに開始できるというメリットがあります。これにより、既存のAndroidアプリをiOSに拡張するハードルが大幅に下がり、ネイティブアプリの品質とパフォーマンスを維持しつつ、クロスプラットフォーム開発を導入することが可能になります。
他にも、AndroidやiOSの両方のライブラリやSDKの開発にも活用されています。分析ツール、決済処理ライブラリ、認証サービスなどに関係する企業は、プラットフォーム間でコードベースを共有することでKMMを活用し、機能の一貫性を保ちながら最小限のメンテナンス負荷で運用できます。
さらに、共通のコアロジックや懸念点を共有することで、KMMは必要に応じて無駄な再開発に時間やリソースを費やすことなく、MVP(最小限の実用製品)の早期実装を実現します。これにより、市場投入までの時間を短縮、開発コストの削減、早期のユーザーフィードバックに基づいた変更を簡単に実現することができます。
ここまで解説してきたように、KMMはクロスプラットフォームモバイル開発へのアプローチとして大きな可能性を秘めています。しかし、その普及を妨げたり、効果を十分に引き出せない原因となる課題を抱えています。その課題を以下でまとめていきます。
・KMMエコシステムの相対的な未成熟さ
React NativeやFlutterなどの定着しているクロスプラットフォームフレームワークと比較すると、KMMは誕生から日が浅く、ライブラリやツールが豊富とは言えません。そのため、特定の機能を一から開発したり、他ライブラリ取り入れる必要があり、開発の遅延や複雑化を招く可能性があります。
・AndroidとiOSの両方の開発環境を知っておく必要がある
KMMによって開発者がコアロジックを共有できるようになったとしても、UIやその他のネイティブ機能についてはプラットフォーム固有のコード(AndroidはKotlin/iOSはSwiftやObjective-C)で記述する必要があります。そのため、両方の知識や経験のない開発チームにとっては壁となる可能性があります。
・ツールのサポート
開発者のJetBrainsやコミュニティによる、KMMツールの改善は続いていますが、プラットフォーム間で共有されたコードのデバックやテストなど、一部の機能は改善中です。そのため、合理的な開発が行えない可能性があります。
クロスプラットフォームモバイル開発に効果的なソリューションを探している開発者や組織の間で支持されているKMMは、ツール、パフォーマンス、エコシステムのサポート面でさらなる発展が期待されています。
KMMは、IDEとの統合、デバック、テスト、ドキュメントの改善などの機能強化により、開発体験を向上させ、あらゆる開発者にとって、シンプルで使いやすい開発を目指しています。さらに、ライブラリエコシステムの拡充も見込まれ、多くのサードパーティ製ライブラリがKMMに組み込まれるか、KMM用に開発されることで、カスタム実装の削減と開発スピードの向上が期待されています。
今後もKMMの導入は、クロスプラットフォーム開発においてバランスの取れたアプローチを求める組織で進んでいくと予測できます。共有コードとプラットフォーム固有の機能を活用することで、開発コストと市場投入までの時間を短縮し、ユーザー体験を損なうことなく実現できると期待されており、KMMはモバイルアプリケーション開発の未来において大きな役割を果たすと考えられています。