Kotlin MultiplaformとFlutterの技術選定

セイロップの設楽です。本記事では、クロスプラットフォーム技術のKotlin Multiplatform(KMP)とFlutterの違いを比較しながら、それぞれの技術選定の観点について紹介します。

クロスプラットフォーム技術について

iOSとAndroidのアプリを同時に開発できるクロスプラットフォーム技術は、開発コストの削減や開発期間の短縮に貢献するため、多くの企業で採用されています。弊社でもFlutterを用いた開発に力を入れており、多数の開発実績があります。

そんな中、近年新たなクロスプラットフォーム技術として注目を集めているのがKotlin Multiplatform(KMP)です。KMPは、Kotlinで記述された共通のビジネスロジックを複数のプラットフォームで共有可能な技術として関心が高まっています。

KMPとFlutterの比較

KMPFlutter
言語KotlinDart
コード共有の範囲ビジネスロジック
(CMPでUI共通化も可能)
ビジネスロジック + UI
プラットフォーム固有機能ネイティブ実装Flutter + ネイティブ実装

1.言語の違い

FlutterはDartを使用します。Dartはマルチプラットフォームでのアプリ開発向けに最適化された言語であり、Flutterフレームワークと連携することで、開発中のコード変更をリアルタイムに反映するホットリロードなどの強力な機能を利用できます。

一方、KMPはKotlinを使用します。Androidエンジニアにとって馴染み深いKotlinを使用するため、学習コストが低い点も魅力です。既にiOS/Androidエンジニアがいる場合は、Flutterを新たに学習するよりも素早く導入できることが期待できます。

2.コード共有の範囲

Flutterではビジネスロジック、UIを含むすべてのコードを単一のコードベースで作成します。 これによりiOS/Android間のデザイン差異がなくなるため、コード量を抑えることも期待できます。iOS/Androidチームとして分離せず、Flutterの1チームでアプリ開発を進められることもメリットです。

一方、KMPではビジネスロジック部分を共通化し、UI部分はAndroid、iOSそれぞれでネイティブ実装を行うアプローチが一般的です。開発体制としてはiOS/Android/KMPの3チームや、iOS/Android+KMPの2チームなどが想定されます。

さらに、Compose Multiplatform(CMP)を利用すれば、Kotlinを使ってAndroid、iOS、Web、Desktopなど複数プラットフォーム向けのUIを共通化することも可能です。

3.プラットフォーム固有機能

モバイルアプリ開発では、iOSやAndroidのプラットフォーム固有の機能(GPS、Bluetooth、動画再生等)を利用する要件を持つことがしばしばあります。

Flutterからプラットフォーム固有の機能を呼び出す際は、iOS/Androidのネイティブコードを記述しFlutterへ橋渡しをする実装が必要になるため、より複雑になる場合があります。

一方KMPはiOS/Androidでネイティブ実装が可能です。ネイティブAPIを直接利用するこでパフォーマンス面でも優位性を発揮します。

KMPとFlutterの技術選定のポイント

KMPFlutter
開発者の必要スキルUIはiOS/Androidのネイティブ開発経験
ビジネスロジックはKMP(Kotlin)での開発経験
Flutterでの開発経験
UIの統一OS毎に異なるUIを実現可能OS間でUIまで共通化可能
プラットフォーム機能の利用プラットフォーム固有機能がメインのアプリは◎機能がシンプルなアプリは◎

KMPとFlutterにはどちらにも長所・短所があります。どちらを選択するかはプロジェクトが求める要件や、開発体制によって判断する必要があります。

Flutterの開発体制を整えられる場合や、小規模、シンプルなプロダクトの場合などは1チームで素早く開発できるFlutterが適している可能性が考えられます。(参考: FlutterがMVP開発に最適である理由

一方、既にiOS/Androidの開発体制が整っている場合や、プラットフォーム固有機能がメインになる複雑なアプリ開発であればKMPでビジネスロジックを共通化して、工数の削減を狙うアプローチも有効です。

最後に

弊社にはFlutterやKMPの開発経験があるメンバーが多数在籍し、メンバー間のキャッチアップや情報共有が活発に行われているため、安心感をもって案件を進める事ができております。

本記事がクロスプラットフォームを導入する際の参考になれば幸いです。