はじめに
東京通信大学で情報工学などを学びながらAndroidアプリ開発をしている者です。
個人でKotlin Multiplatform(KMP)を用いてアプリを開発したので、振り返ろうと思います。
なぜKMPを採用したのか
前提:iOS/Andoirdの両方で動作するアプリを開発したい。
懸念点:学習コストが高くなること、開発期間が長くなること。
- Android開発でKotlinを使用(学習コストを高くしない)
- KMPでビジネスロジック・CMPでUIを共通化できる(開発期間を短縮)
- expect/actualを用いてプラットフォーム固有のAPIをKotlinで扱える。(パフォーマンス)
今回は、上記のような背景がありKMPを選択しましたが、iOS/Androidで動作するアプリを単一のコードで実現できる技術であるクロスプラットフォームとしてKMP以外にFlutterやReact Nativeがあり(他にも存在する)、プロジェクトにおける特定の要件やチームの専門知識などの条件がある上での意思決定に知識を持った上で参加したいと思って、これらの特徴を調べました。
クロスプラットフォーム技術の種類とその特徴
Flutter
- 単一のコードからネイティブコンパイルされたマルチプラットフォームアプリケーションを構築することができるオープンソース。
- Googleがサポート、2014年にSkyという名前で導入され、2018年のFlutter Liveで正式発表された。
- iOS/Android、Web、デスクトップなどで動作する。
- Dartという言語を使用する。
- 公式サイト
KMP
- ネイティブプログラミングの利点を維持しながら、異なるプラットフォーム間でKotlinコードを効率的に利用できるオープンソース。
- Jetbrainsによって開発され、2017年に部分的に導入、2023年11月にStableになった。2024年のGoogle I/OでAndroidとiOS間のビジネスロジックを共有することのサポートを発表。
- iOS/Android、Web、デスクトップ、サーバーサイド開発に用いられる。
- Kotlinという言語を使用する。
- 公式サイト
React Native
- Reactを用いてiOS/Androidアプリを構築することができるフレームワーク
- Metaがサポートしており、2015年に発表された。
- React(JavaScript/TypeScript)という言語を使用する。
- 公式サイト
プラットフォーム固有のAPIに対する扱い
- Flutter/React Native
- OS固有のAPI(カメラやBluetoothなど)にアクセスするためには、プラットフォームチャネルやネイティブモジュールという仕組みが必要で、データを変換する必要があるため、オーバーヘッドが増えてしまう。
- KMP
- expect/actualパターンを利用することで、Kotlinで直感的に記述することができ、データを変換する必要がないため、オーバーヘッドが少ない。
おわりに(自分用)
- KMPを採用した理由として、個人で開発することができるかどうかという要因があった。
- KMPを使う利点としてFlutterやReact Nativeを比較するとプラットフォーム固有APIの扱いによるパフォーマンスの優位性があることを知った。
- 今回のプロジェクトではプラットフォーム固有のAPIを扱う場面が少なかったため、自分の技術スタック的に判断したことになることを各クロスプラットフォームを学ぶことで理解できた。
間違っているところや気になる点などがありましたら、コメントしていただけると嬉しいです。