Android Gradle Plugin(AGP)9.0以降へ更新すると、Gradle Syncやビルド時に「Using kotlin.sourceSets DSL to add Kotlin sources is not allowed with built-in Kotlin」と表示されることがあります。
AGP 9.0ではBuilt-in Kotlinが標準で有効になり、AndroidモジュールのKotlinソースディレクトリを追加する方法が変更されました。従来のkotlin.sourceSetsではなく、android.sourceSetsのkotlinソースセットへ移行する必要があります。
エラーの意味
Using kotlin.sourceSets DSL to add Kotlin sources is not allowed with built-in Kotlin
このエラーは、Built-in Kotlinが有効なAndroidモジュールで、次のような旧形式の設定が残っていることを示します。
kotlin.sourceSets.named("main") {
kotlin.srcDir("additionalSourceDirectory/kotlin")
}
AGP 9.0以降ではAndroid側がKotlinソースセットを管理するため、この方法でAndroidモジュールへソースディレクトリを追加することはサポートされません。
主な発生条件
- プロジェクトをAGP 8系からAGP 9.0以降へ更新した
- Built-in Kotlinを有効にしている
build.gradle.ktsや共通Gradleスクリプトにkotlin.sourceSetsが残っている- KSP、コード生成、独自Gradleプラグインが生成ソースを旧DSLへ追加している
- AndroidモジュールとKotlin Multiplatformの設定を同じモジュール内で混在させている
解決方法1:android.sourceSetsのkotlinへ移行する
Googleが案内している基本解決策は、追加のKotlinディレクトリをAndroidSourceSet.kotlinへ登録することです。
build.gradle.ktsの場合
android {
sourceSets.named("main") {
kotlin.srcDir("additionalSourceDirectory/kotlin")
}
}
build.gradleの場合
android {
sourceSets {
main {
kotlin.srcDir "additionalSourceDirectory/kotlin"
}
}
}
main以外のソースセットも、同じ考え方でdebug、release、androidTestなどへ登録します。
android {
sourceSets.named("debug") {
kotlin.srcDir(layout.buildDirectory.dir("generated/debug/kotlin"))
}
}
javaソースセットへKotlinを追加しない
Built-in Kotlinでは、KotlinファイルのディレクトリをAndroidSourceSet.javaへ追加する方法もサポートされません。
// AGP 9のBuilt-in Kotlinでは使用しない
android.sourceSets.named("main") {
java.srcDir("additionalSourceDirectory/kotlin")
}
// 正しい設定
android.sourceSets.named("main") {
kotlin.srcDir("additionalSourceDirectory/kotlin")
}
ディレクトリ内にJavaとKotlinが混在している場合でも、Kotlinファイルを含む追加ディレクトリはkotlin.srcDirとして登録してください。
解決方法2:設定元が外部プラグインなら更新する
自分のbuild.gradleにkotlin.sourceSetsが見当たらない場合は、Convention Plugin、buildSrc、included build、または外部Gradleプラグインが設定を追加している可能性があります。
kotlin.sourceSets、sourceSets.named、srcDirをプロジェクト全体で検索します。buildSrcとbuild-logicも確認します。--stacktraceでエラーを発生させたプラグイン名を確認します。- 該当プラグインをAGP 9対応版へ更新します。
./gradlew :app:assembleDebug --stacktrace
解決方法3:KMPモジュールの構成を見直す
Kotlin Multiplatform(KMP)のkotlin.sourceSets自体が全面的に禁止されたわけではありません。このエラーは、Built-in Kotlinを使うAndroidモジュールへKotlinソースを追加する用途で使った場合に発生します。
AGP 9の新DSLでは、org.jetbrains.kotlin.multiplatformとcom.android.libraryまたはcom.android.applicationを同じGradleサブプロジェクトで組み合わせる従来構成に制限があります。KMPライブラリは公式のcom.android.kotlin.multiplatform.libraryプラグインへ移行し、Androidアプリは必要に応じて別モジュールへ分離してください。
一時的にBuilt-in Kotlinを無効化する方法
外部プラグインが未対応で、すぐに修正できない場合は、プロジェクトのgradle.propertiesで一時的に従来動作へ戻せます。
android.builtInKotlin=false
android.newDsl=false
これは移行用の回避策です。AGP 9の新しい標準構成へ移行できたら削除してください。互換フラグへ依存し続けると、将来のAGP更新で再びビルドできなくなる可能性があります。
修正後の確認手順
kotlin.sourceSetsからAndroid用ディレクトリを追加している箇所が残っていないか検索します。- Kotlinディレクトリが
android.sourceSets.*.kotlinへ登録されていることを確認します。 - Android StudioでGradle Syncを実行します。
./gradlew clean :app:assembleDebugで再ビルドします。- 生成コードを使う場合は、生成タスクの後に対象ディレクトリへファイルが作られているか確認します。
注意点
エラーを消すために生成ソースの登録自体を削除すると、次に「Unresolved reference」や生成クラスが見つからないエラーへ変わることがあります。登録を消すのではなく、正しいandroid.sourceSetsのkotlinへ移してください。
また、src/main/kotlinのような標準ディレクトリは通常自動認識されます。標準パスを重複して登録せず、独自ディレクトリや生成ソースだけを追加します。
まとめ
AGP 9のBuilt-in Kotlinでは、Androidモジュールの追加Kotlinソースをkotlin.sourceSetsから登録できません。android.sourceSets.named("main") { kotlin.srcDir(...) }へ移行するのが正式な解決方法です。外部プラグインが原因ならAGP 9対応版へ更新し、互換フラグは一時的な回避策としてのみ使用してください。
参考:Migrate to built-in Kotlin/Android Gradle Plugin 9.0 release notes
