新卒社員がCompose Multiplatform (CMP) でAndroid・iOSアプリを開発してみた
- isana.net
- 2025年12月26日
- 読了時間: 6分
はじめに
私は2025年4月に新卒で入社したエンジニアAです。 この度、弊社のサービス「FITINSIGHT」と連携できるスマホアプリをCompose Multiplatform(CMP)を利用して開発しました。今回は社内勉強会で発表した内容をベースに、「そもそもCMPとは何か」そして「実際に開発してみた感想」を紹介させていただきます。
Compose Multiplatform(CMP)とは
CMPを一言で表すなら「複数のプラットフォーム向けのアプリケーションを単一のコード(Jetpack Compose)ベースで開発できる技術」のことです。
モバイルアプリ(Android/iOS)からデスクトップアプリケーションまで幅広い用途で活用でき、「複数のプラットフォームで一貫したユーザー体験を提供したい」「開発リソースを効率化したい」という場合に特に有効な技術です。
主な特徴
クロスプラットフォーム開発
Kotlinで記述したUIコードを複数のプラットフォームで共有できます。
柔軟なアーキテクチャ
必要に応じてプラットフォーム固有のコードを記述することも可能で、完全な共通化と部分的な共通化を使い分けられます。
宣言的UI
Jetpack Composeと同様の宣言的なアプローチでUIを構築できるため、コードが読みやすく、保守しやすくなります。
(参考)従来の命令型と宣言型の比較
▶ 従来の命令型(Android XML + Java/Kotlin)


XMLでボタンの見た目を作成
表示させるActivityでボタンを取得
クリックイベントを登録する
のように、順番に「どうやって作るか」を書く必要があります。
▶ CMPの宣言型

「ボタンがあってテキストは"押してね"、押したらこう処理して」とだけ宣言するだけで完結します。
CMPのメリットと課題
導入にあたり、感じたメリットと課題は以下の通りです。
メリット
開発効率の向上
単一のコードベースで複数のプラットフォームに対応できるため、開発時間とコストを大幅に削減できます。
一貫したUI/UX
すべてのプラットフォームで統一されたデザインとユーザー体験を提供しやすくなります。
保守性の向上
コードが一元管理されるため、バグ修正や機能追加が容易になり、メンテナンスコストが削減されます。
Jetpack Composeの知識が活かせる
Android開発でJetpack Composeの経験があれば、その知識を他のプラットフォームにも展開できます。
柔軟性が高い
共通のUIと各OS固有UIを使い分けることができます。
課題
比較的新しい技術
まだ発展途上のフレームワークであり、ドキュメントやコミュニティリソースが他の成熟したフレームワークと比べて限定的です。
ライブラリのエコシステム
マルチプラットフォーム対応のライブラリがまだ少なく、必要な機能を実装するために自前での開発が必要になる場合があります。
(参考)Geminiに聞いてみたところ、「Androidネイティブが数万なら、KMP対応ライブラリは数百〜千程度」という規模感の違いがあるそうです。
プラットフォーム固有の制約
完全にネイティブな体験を実現するには、プラットフォーム固有のコードを追加する必要があり、完全な共通化が難しい場合があります。
使ってみた感想
ここから、実際にCMPを使って開発を進めた私の感想を紹介させていただきます。
ウィザードを使っての導入が安全かつ手軽
Android Studio内のプラグインでの導入も可能ですが、今回はウィザードを使用しました。
(理由)IDE内プラグインの弱点
Android Studio自体のアップデートサイクルと、Kotlinプラグインの更新サイクルにはズレがあります。そのため、IDEの機能でプロジェクトを作ると、「数バージョン古いGradle設定」や「非推奨の構成」で生成されてしまい、書き直しやエラー対応に追われるリスクがあります。
(参考)ウィザードでの導入手順
Webウィザードにアクセス: ブラウザで kmp.jetbrains.com を開く。
構成を選択:
Project nameを入力。
Android と iOS にチェックを入れる(必要ならDesktopやWebも)。
"Shared UI" (Compose Multiplatform) が選択されていることを確認。
"Do not shared UI" を選択するとKMPになる

ダウンロード & 解凍: Download ボタンを押し、zipファイルを解凍する。
Android Studioで開く:
Android Studioを起動。
Open (Import Project) を選択し、解凍したフォルダを指定する。
Gradle Syncが完了するのを待つ。
Android開発(KotlinやCompose)の学習をすれば開発を進められる
案件の方針として、コードは限りなく共通化することになっていたため、Android開発に関する知識でほとんど問題なく進めることができました。
しかし、KotlinやComposeに関する学習が十分にできていない状態での開発であったため、初期は苦戦しました。わからない部分は公式ドキュメントや有識者の先輩方、生成AIの力を借りて開発を進めることで乗り越えました。
Swiftの知識が全くないと困る
こちらに関しては、生成AI(主に、Gemini Code Assist のエージェントモード)を利用することで学習コストを最小限にしながら開発を進められました。
特に苦戦した部分
バックグラウンド処理
こちらに関しても、完全な共通化ができませんでした。しかし、バックグラウンドでの処理自体はAndroidとiOSで共通のものになるので、共通部分(Kotlin)とSwift部分を接続するブリッジを作成しました。これにより、メンテナンス性を向上させることができました。
バグ修正
iOSのシステム上の問題で発生するエラーの解決のため、共通部分に変更を加えなければいけませんでした。その場合、テスト項目としてAndroidも確認しないといけないことになります。また、ストア配信でも、Android側の動きに問題は全くありませんが、アップデートが必要になりました。
社内で出た質問
社内向けに発表した内容としては以上までとなりますが、その際にいただいた質問と回答を3つ紹介しようと思います。
Q. 学習方法としては何を採用していましたか。
A. 基本的には公式ドキュメントを参照していました。 比較的新しい技術ということもあり、Udemyなどの動画教材はまだほとんど出回っていません。特に日本語の教材に関しては、さらに少ない印象です。
Q. UIの部分でも共通化できないものなどはありましたか。
A. 今回の開発範囲においては、UIに関する共通化できないものは見受けられませんでした。 関連する点として、「共通化されることによるUIデザインへの影響」が挙げられます。 CMPは基本的にMaterial Design(Android標準のデザインシステム)ベースで描画されるため、例えばダイアログの表示などがAndroid風になります。そのため、iOSアプリとして見た際に”iOSらしさ”が失われてしまい、ユーザーによっては違和感を覚える方がいらっしゃるかもしれません。
Q. ストア配信の手順において、従来(ネイティブ開発)との違いはありますか。
A. 基本的に違いはありません。 最終的に生成されるアプリファイル(AndroidならAAB、iOSならIPA)は従来と同じ形式であるため、ストアへのアップロードや審査の手順も変わりません。実際に、過去の社内勉強会の資料やWeb上の情報を参考にするだけで、スムーズにリリースまで完結できました。
まとめ
今回、CMPを使用してAndroid・iOS向けアプリを開発した経験を通じて、その利点と課題を実感することができました。
発展途上のフレームワークであるため、不明瞭な部分があります。一方で、スタートアップや小規模チームで複数のプラットフォームに展開したい場合には、CMPは非常に有効な選択肢だと感じました。新卒エンジニアとして、この最新技術に触れることができたのは貴重な経験となりました。
最後まで読んでいただき、ありがとうございました。