2025年12月22日

KMPとCMPでモバイルアプリを作ってみた


Content
みなさん、こんにちは。Androidエンジニアの松田です。

AndroidエンジニアでありながらiPhoneユーザである大矛盾を抱える私は、Androidの技術でiOSアプリが作れたらいいのに・・と感じており、そんな中KMPCMPに興味を持ちました。

最近色々な場面でKMPCMPという単語を耳にする機会が増え、KMPCMPが盛り上がっている中に私も混ざりたい!ということで、KMPCMPを使って簡単なアプリを作ってみました。

本記事では、実際に作ってみて感じたことを紹介いたします。

本記事を読んでいただく方々にとって、KMPCMPに興味を持つ第一歩になれたら嬉しいです。

KMPとは

KMP (Kotlin Multiplatform) とは、Android / iOS / Web / Desktopなど、様々なプラットフォームで動くコードをKotlinで記述できるフレームワークです。

KMP = ロジック部分の実装を共通化できるフレームワーク、と捉えていただくのがわかりやすいかと思います。

CMPとは

CMP (Compose Multiplatform)とは、KotlinJetpack Composeを使って、Android / iOS / Web / Desktopなど、複数のプラットフォームでUIを共有できるフレームワークです。

CMP = UI部分の実装を共通化できるフレームワーク、と捉えていただくのがわかりやすいかと思います。

今回作ったアプリ

ロジック部分の実装を共通化するKMPと、UI部分の実装を共通化するCMPを組み合わせて、今回は、飲食店検索アプリを作ってみました。

概要

指定した条件をもとに、飲食店を検索できるアプリです。

今回は無料で使用できるホットペッパーAPIを利用して、データを取得しました。

アプリを起動すると、最初に飲食店検索画面が表示されます。右下のフローティング アクション ボタン (FAB) から検索条件設定画面を開き、調べたい飲食店の条件を指定することができます。

今回は条件として、都道府県 / ジャンル / キーワード を指定できるよう実装しました。

使用したIDE

今回は、信頼と実績のAndroid Studioを使用しました。

Android Studioの他に、IntelliJ IDEAでもKMPCMPを利用することができます。

使用したライブラリ

今回以下のライブラリを使用しました。

  • Ktor
    • 主にKotlinで書かれた、非同期クライアントおよびサーバー用のライブラリです。
    • APIとの通信を行うために使用しました。
  • Kamel
    • CMPプロジェクトのために設計された、画像などの非同期メディアの読み込み・キャッシュ・デコードおよび表示を扱うためのライブラリです。
    • 飲食店の画像を表示させるために使用しました。

 

KMP・CMPを使ってみて

実際にKMPCMPを使ってみてよかった点、あまりよくなかったと感じた点をそれぞれ紹介します。実装してみて思ったことと、ビルドしたアプリを使ってみて思ったこととで、2つの視点から紹介します。

よかった点

実装してみて

  • KotlinでiOSアプリが作れたことに感動しました。
    • Swiftへの苦手意識が強く、iOSアプリを実装するハードルが高かったのですが、親しみのあるKotlinでiOSアプリを作ることができて嬉しかったです。
  • Androidのネイティブアプリを作るのと同じ要領で実装できました。
    • 個人的に、普段ネイティブアプリを作る感覚とほぼ変わらず実装できたように感じます。
    • Android Studioで最初に作られるフォルダ構成もわかりやすく、抵抗感なく実装に着手できました。
    • Androidを実装していたら、iOSでも動くアプリが作れた!くらいの感覚でした。(個人の感想です)

アプリを使ってみて

  • iOSとAndroidとで、UXの一貫性が保たれていました。
    • このアプリには最低限の機能しかありませんが、この範囲内では、動作や挙動に大きな違いはなく、スムーズに操作できました。

  

左からAndroid、iOS

あまりよくなかった点

実装してみて

  • ビルドが少し不安定でした。
    • ビルド時間が長い時で5〜10分ほどかかる場合があり、大規模なプロダクトの場合はさらに時間がかかるかも、と感じました。
    • CMPに関連するiOSファイルでビルドが失敗することがありましたが、翌日には問題なくビルドできるようになるケースもありました。明確な原因特定には至っていませんが、CMPは安定版として提供されているものの、比較的新しい技術である点も影響している可能性があると感じました。
  • ライブラリ選定が難しかったです。
    • KMPに対応しているライブラリかどうか判断するのに初めのうちは苦労しましたが、klibs.ioと呼ばれる、KMPライブラリの検索プラットフォームに出会い、ライブラリ選定時に活用しました。

アプリを使ってみて

  • UI面で少し違和感を感じました。
    • プルダウンなどのUIパーツがAndroidすぎるため、iPhoneユーザからすると使った時に違和感を感じてしまうかもと感じました。(CMPで共通化しているため、当たり前なのですが・・)

  

左からAndroid、iOS

さいごに

KMPCMPを組み合わせることで、KotlinでもiOSアプリを作ることができました。

実際に触ってみて、KMPによるロジック共通化については有効であり、開発スピードが向上すると感じましたが、CMPによるUI共通化については、ビルドの安定性やUI要件によっては課題が出るかも、と感じました。
そのため、プロダクトの仕様と相談しながら技術選定するのが良いかと思います。
プロダクトの規模が大きいものについては、ロジックを KMP で共通化し、UI は各 OS ごとに実装するのがよさそうです。
反対に規模が小さい場合や UI/UX の差異が大きな問題にならない場合は、KMP と CMP を組み合わせるのも一つの選択肢だと感じました。

最後まで読んでいただき、ありがとうございました。

We are hiring!

現在、システムサポート株式会社ではAndroid/iOSエンジニアを募集しております。
一緒にモバイルアプリチームを発展していく仲間を心よりお待ちしておりますので、何なりとお問い合わせください!

キャリアサイト: コチラ
doda / リクルートなどでも公開しておりますのでご確認ください。

  • 必須要件
    • Swift、Kotlinいずれかを用いたモバイルアプリ開発の経験
  • 歓迎条件
    • Webアプリケーション開発経験をお持ちで自己研鑽にてSwift、Kotlinを用いたモバイルアプリ開発を経験されている方
  • 魅力
    • MAU200k+を誇る規模のモバイルアプリ開発なども行えるSIerとしては珍しいtoC向けアプリもあります!
    • また、DroidKaigiやiOSDCへの参加なども積極的に推奨しているため技術力向上も狙えちゃいます!
    • リモートワーク+フルフレックスなどWLBも充実してますので是非是非ご応募ください!

2025年12月22日 KMPとCMPでモバイルアプリを作ってみた

Category モバイル

ご意見・ご相談・料金のお見積もりなど、
お気軽にお問い合わせください。

お問い合わせはこちら