Skip to content

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

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

すべての提案を実装する必要はありません。特定のプロジェクトに適用可能なものだけを実装してください。

互換性の確認

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

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テストと共通テスト(common tests)の関係の確認

新しいAndroidソースセットのレイアウトでは、Androidインストゥルメンテーションテスト(Android-instrumented tests、新しいレイアウトでは androidInstrumentedTest に改名)と共通テストの関係が変わります。

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

  • commonTest 内のコードが androidAndroidTest で利用可能であった。
  • commonTest 内の expect 宣言に対して、androidAndroidTest で対応する actual 実装を持つ必要があった。
  • commonTest で宣言されたテストが、Androidインストゥルメンテーションテストとしても実行されていた。

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

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

Androidフレーバーの実装の調整

以前は、Kotlin Gradleプラグインは、debugrelease ビルドタイプ、または demofull などのカスタムフレーバー(flavor)を含むAndroidソースセットに対応するソースセットを先行して(eagerly)作成していました。 これにより、val androidDebug by getting { ... } のような式を使用してソースセットにアクセスできました。

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

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

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