メインコンテンツまでスキップ

Androidソースセットレイアウト

新しい Android ソースセットのレイアウトは Kotlin 1.8.0 で導入され、1.9.0 でデフォルトになりました。このガイドに従って、非推奨のレイアウトと新しいレイアウトの主な違いを理解し、プロジェクトを移行する方法を理解してください。

ヒント

すべての提案を実装する必要はなく、特定のプロジェクトに適用できるものだけを実装してください。

互換性の確認

新しいレイアウトには Android Gradle plugin 7.0 以降が必要で、Android Studio 2022.3 以降でサポートされています。Android Gradle plugin のバージョンを確認し、必要に応じてアップグレードしてください。

Kotlin ソースセットの名前を変更する

該当する場合は、プロジェクト内のソースセットの名前を、次のパターンに従って変更します。

以前のソースセットのレイアウト新しいソースセットのレイアウト
targetName + AndroidSourceSet.nametargetName + AndroidVariantType

{AndroidSourceSet.name} は、次のように {KotlinSourceSet.name} にマップされます。

以前のソースセットのレイアウト新しいソースセットのレイアウト
mainandroidMainandroidMain
testandroidTestandroidUnitTest
androidTestandroidAndroidTestandroidInstrumentedTest

ソースファイルを移動する

該当する場合は、ソースファイルを次のパターンに従って新しいディレクトリに移動します。

以前のソースセットのレイアウト新しいソースセットのレイアウト
レイアウトには追加の /kotlin SourceDirectories があったsrc/{KotlinSourceSet.name}/kotlin

{AndroidSourceSet.name} は、次のように {SourceDirectories included} にマップされます。

以前のソースセットのレイアウト新しいソースセットのレイアウト
mainsrc/androidMain/kotlin
src/main/kotlin
src/main/java
src/androidMain/kotlin
src/main/kotlin
src/main/java
testsrc/androidTest/kotlin
src/test/kotlin
src/test/java
src/androidUnitTest/kotlin
src/test/kotlin
src/test/java
androidTestsrc/androidAndroidTest/kotlin
src/androidTest/java
src/androidInstrumentedTest/kotlin
src/androidTest/java, src/androidTest/kotlin

AndroidManifest.xml ファイルを移動する

プロジェクトに AndroidManifest.xml ファイルがある場合は、次のパターンに従って新しいディレクトリに移動します。

以前のソースセットのレイアウト新しいソースセットのレイアウト
src/AndroidSourceSet.name/AndroidManifest.xmlsrc/KotlinSourceSet.name/AndroidManifest.xml

{AndroidSourceSet.name} は、次のように {AndroidManifest.xml location} にマップされます。

以前のソースセットのレイアウト新しいソースセットのレイアウト
mainsrc/main/AndroidManifest.xmlsrc/androidMain/AndroidManifest.xml
debugsrc/debug/AndroidManifest.xmlsrc/androidDebug/AndroidManifest.xml

Android テストと共通テストの関係を確認する

新しい Android ソースセットのレイアウトは、Android インストルメント化テスト(新しいレイアウトでは androidInstrumentedTest に名前が変更されました)と共通テストの関係を変更します。

以前は、androidAndroidTestcommonTest の間の dependsOn 関係がデフォルトでした。これは次のことを意味していました。

  • commonTest のコードは androidAndroidTest で使用できました。
  • commonTestexpect 宣言には、androidAndroidTest に対応する actual 実装が必要でした。
  • commonTest で宣言されたテストは、Android インストルメント化テストとしても実行されていました。

新しい Android ソースセットのレイアウトでは、dependsOn 関係はデフォルトでは追加されません。以前の動作を優先する場合は、build.gradle.kts ファイルで次の関係を手動で宣言してください。

kotlin {
// ...
sourceSets {
val commonTest by getting
val androidInstrumentedTest by getting {
dependsOn(commonTest)
}
}
}

Android フレーバーの実装を調整する

以前は、Kotlin Gradle plugin は、debug および release ビルドタイプ、または demofull などのカスタムフレーバーを含む Android ソースセットに対応するソースセットをすぐに作成していました。これにより、val androidDebug by getting { ... } のような式を使用してソースセットにアクセスできるようになりました。

新しい Android ソースセットのレイアウトは、Android の onVariants を使用してソースセットを作成します。これにより、このような式は無効になり、org.gradle.api.UnknownDomainObjectException: KotlinSourceSet with name 'androidDebug' not found のようなエラーが発生します。

これを回避するには、build.gradle.kts ファイルで新しい invokeWhenCreated() API を使用します。

kotlin {
// ...
@OptIn(ExperimentalKotlinGradlePluginApi::class)
sourceSets.invokeWhenCreated("androidFreeDebug") {
// ...
}
}