KC Blog

【Compose Multiplatform】プロジェクト移行の検討と開発ガイド

6 min read
CrossPlatform#CMP#Kotlin

はじめに

Compose Multiplatform(CMP)は開発者にクロスプラットフォーム開発の強力なツールを提供します

しかし、ComposeプロジェクトからCMPへの移行にはいくつかの課題もあります

本記事では移行プロセスにおける重要なポイントと注意点を詳しく説明します

{% include table/compose-multiplatform-category.html %}

初期移行コスト

最初に、CMPがどのようにクロスプラットフォームを実現しているかを理解する必要があります

そのため、プロジェクト構造を

理解するのに少し時間がかかります

以下で簡単に確認していきましょう

CMP開発では、複数のフォルダ構造に慣れる必要があります:

<img src="/images/compose/009.png" alt="Cover" style="width: 30%"/ class="prose-img">

共通コードはcommonMainに配置します:

<img src="/images/compose/010.png" alt="Cover" style="width: 30%"/ class="prose-img">

各環境で必要なライブラリをインポートします:

Cover

デフォルトではlib.version.tomlを使用して設定するため

.tomlについて理解する必要がありますが

実際には非常に簡単です

公式のデフォルト設定で十分機能します

特別な設定が必要でない限り

以前書いたメモがこちらにあります

参考まで

ComposeプロジェクトからCMPプロジェクトへのライブラリ移行参考

  • 元々Androidプロジェクトでよく使われるライブラリや公式推奨のライブラリを使用していた場合(表の左側)

    CMPで開発を試みた後、使用するライブラリの移行コストにいくつかのメリットを見つけることができます(表の右側)

    これは、Compose開発でほとんど使用したことのあるものだからです

{% include table/compose-multiplatform-compare.html %}

発生する可能性のある問題

  1. クロスプラットフォームの要件の違い:

    例えば、AndroidはContextが必要ですが、iOSは必要ありません:

    完全なメモ:【Compose Multiplatform】KoinでAndroidのContextを扱うクロスプラットフォームアプリの実装

  2. プラットフォーム固有の実装:

    例えば、モバイルではローカルの永続ストレージがよく使われます

    Androidでは、この問題を処理するためにDataStoreを使用します

    では、複数のプラットフォームでどのように使用すればよいでしょうか?

    expectとactualキーワードの使用:

    個別に実装する必要があるにもかかわらず

    いくつかの一般的なライブラリは

    CMPがKotlin実装でサポートしています

    そのため、プラットフォーム別の実装でも、純粋な.ktで書くことができます

    上記のiosMainで実装されたDataStoreのように

    完全なメモ:【Compose Multiplatform】ローカル永続ストレージをDataStoreで実装する方法

  3. CMPライブラリの互換性問題やバグが継続的に修正されている:

    例えば、SQLDelight 2.0.0バージョンではiOSでビルドエラーが発生します:

    • 解決策1:stately-commonをインポートする

    • 解決策2:バージョン2.0.1以上にアップグレードする

    理由はこちらのディスカッションスレッドで確認できます:こちらをクリック

    SQLDelightの完全なメモ:【Compose Multiplatform】SqlDelightデータベースの実装

将来の展望

Googleは2024年5月14日のブログでKMPへのサポートについて言及しています:

Cover

これは将来的により多くのライブラリがサポートされる可能性があることを意味するかもしれません。

まとめ

  • CMPは強力なクロスプラットフォーム開発機能を提供しますが、新しいプロジェクト構造への適応が必要です
  • ほとんどの一般的なライブラリには対応するCMPバージョンがあります

例えば、Compose Appの開発でよく使用されるものは直接使用できます

DataStore、Roomなど

  • プラットフォームの違いを処理する際、expectとactualキーワードが非常に役立ちます
  • ライブラリのバージョン互換性の問題に注意してください

現在の開発では

いくつかの設定互換性の問題に遭遇しています

例:Kotlin 2.0.0でのRoom互換性の問題

CMPでCocoaPodsを設定する際のembedAndSignエラーなど

  • Googleの最新アップデートに注目して、さらなるサポートとリソースを得ましょう

GPTに直接尋ねてみましたが

それほど正確ではないかもしれません

多くの互換性問題は自分で調査する必要があります

あるいは将来的にデータがより豊富になれば、より正確な回答が得られるかもしれません