プラットフォーム間でのコード共有
Kotlin Multiplatform を使用すると、Kotlin が提供するメカニズムを使ってコードを共有できます。
- プロジェクトで使用するすべてのプラットフォーム間でコードを共有します。すべてのプラットフォームに適用される共通のビジネスロジックを共有する場合に使用します。
- プロジェクトに含まれる一部のプラットフォーム間でコードを共有しますが、すべてではありません。階層構造を利用して、類似したプラットフォームでコードを再利用できます。
共有コードからプラットフォーム固有の API にアクセスする必要がある場合は、Kotlin の期待される宣言と実際の宣言 (expected and actual declarations) のメカニズムを使用します。
すべてのプラットフォームでコードを共有する
すべてのプラットフォームに共通のビジネスロジックがある場合、各プラットフォームで同じコードを記述する必要はありません。共通ソースセットで共有するだけです。
一部のソースセットの依存関係はデフォルトで設定されます。dependsOn
関係を手動で指定する必要はありません。
jvmMain
やmacosX64Main
など、共通ソースセットに依存するすべてのプラットフォーム固有のソースセットに対して。androidMain
とandroidUnitTest
など、特定のターゲットのmain
とtest
ソースセット間に対して。
共有コードからプラットフォーム固有の API にアクセスする必要がある場合は、Kotlin の期待される宣言と実際の宣言のメカニズムを使用します。
類似したプラットフォームでコードを共有する
共通のロジックやサードパーティ製 API の多くを再利用できる可能性がある、複数のネイティブターゲットを作成する必要があることがよくあります。
たとえば、iOS をターゲットとする一般的なマルチプラットフォームプロジェクトには、2つの iOS 関連ターゲットがあります。1つは iOS ARM64 デバイス用、もう1つは x64 シミュレーター用です。これらは個別のプラットフォーム固有のソースセットを持っていますが、実際にはデバイスとシミュレーターで異なるコードが必要となることはほとんどなく、その依存関係もほぼ同じです。そのため、iOS 固有のコードは両者間で共有できます。
この設定では、2つの iOS ターゲット用の共有ソースセットを持ち、iOS デバイスとシミュレーターの両方に共通する任意の API を Kotlin/Native コードから直接呼び出せるようにすることが望ましいのは明らかです。
この場合、以下のいずれかの方法で階層構造 (hierarchical structure) を使用して、プロジェクトのネイティブターゲット間でコードを共有できます。
ライブラリでのコード共有 と プラットフォーム固有のライブラリの接続 について詳しく学びましょう。
ライブラリでコードを共有する
階層的なプロジェクト構造のおかげで、ライブラリはターゲットのサブセットに対して共通の API を提供することもできます。ライブラリが公開される と、その中間ソースセットの API がプロジェクト構造に関する情報とともにライブラリアーティファクトに組み込まれます。このライブラリを使用すると、プロジェクトの中間ソースセットは、各ソースセットのターゲットで利用可能なライブラリの API のみにアクセスできます。
たとえば、kotlinx.coroutines
リポジトリの以下のソースセット階層を確認してください。
concurrent
ソースセットは runBlocking
関数を宣言し、JVM およびネイティブターゲット用にコンパイルされます。kotlinx.coroutines
ライブラリが更新され、階層的なプロジェクト構造で公開されると、そのライブラリに依存し、ライブラリの concurrent
ソースセットの「ターゲットシグネチャ」と一致するため、JVM とネイティブターゲット間で共有されるソースセットから runBlocking
を呼び出すことができます。
プラットフォーム固有のライブラリを接続する
プラットフォーム固有の依存関係に制限されることなく、より多くのネイティブコードを共有するには、Foundation、UIKit、POSIX などのプラットフォームライブラリを使用します。これらのライブラリは Kotlin/Native に同梱されており、共有ソースセットでデフォルトで利用可能です。
さらに、プロジェクトで Kotlin CocoaPods Gradle プラグインを使用している場合、cinterop
メカニズム を介して使用されるサードパーティのネイティブライブラリを扱うことができます。