Структура наборов исходного кода Android
Новая структура наборов исходного кода Android появилась в Kotlin 1.8.0 и стала стандартной в версии 1.9.0. Следуйте этому руководству, чтобы понять основные различия между устаревшей и новой структурой, а также узнать, как перенести на неё проекты.
Проверьте совместимость
Для новой структуры требуется Android Gradle plugin версии 7.0 или выше. Она поддерживается в Android Studio 2022.3 и более поздних версиях. Проверьте версию Android Gradle plugin и при необходимости обновите её.
Переименуйте наборы исходного кода Kotlin
При необходимости переименуйте наборы исходного кода в проекте по следующему шаблону:
Прежняя структура наборов исходного кода |
Новая структура наборов исходного кода |
|---|---|
|
|
{AndroidSourceSet.name} соответствует {KotlinSourceSet.name} следующим образом:
Прежняя структура наборов исходного кода |
Новая структура наборов исходного кода |
|
|---|---|---|
main |
androidMain |
androidMain |
test |
androidTest |
androidUnitTest |
androidTest |
androidAndroidTest |
androidInstrumentedTest |
Переместите исходные файлы
При необходимости переместите исходные файлы в новые каталоги по следующему шаблону:
Прежняя структура наборов исходного кода |
Новая структура наборов исходного кода |
|---|---|
Структура включала дополнительные SourceDirectories |
|
{AndroidSourceSet.name} соответствует {SourceDirectories included} следующим образом:
Прежняя структура наборов исходного кода |
Новая структура наборов исходного кода |
|
|---|---|---|
main |
src/androidMain/kotlin |
src/androidMain/kotlin |
test |
src/androidTest/kotlin |
src/androidUnitTest/kotlin |
androidTest |
src/androidAndroidTest/kotlin |
src/androidInstrumentedTest/kotlin |
Переместите файл AndroidManifest.xml
Если в проекте есть файл AndroidManifest.xml, переместите его в новый каталог по следующему шаблону:
Прежняя структура наборов исходного кода |
Новая структура наборов исходного кода |
|---|---|
src/{AndroidSourceSet.name}/AndroidManifest.xml |
src/{KotlinSourceSet.name}/AndroidManifest.xml |
{AndroidSourceSet.name} соответствует {AndroidManifest.xml location} следующим образом:
Прежняя структура наборов исходного кода |
Новая структура наборов исходного кода |
|
|---|---|---|
main |
src/main/AndroidManifest.xml |
src/androidMain/AndroidManifest.xml |
debug |
src/debug/AndroidManifest.xml |
src/androidDebug/AndroidManifest.xml |
Проверьте связь между тестами Android и общими тестами
Новая структура наборов исходного кода Android меняет связь между инструментированными тестами Android (в новой структуре переименованными в androidInstrumentedTest) и общими тестами.
Раньше по умолчанию использовалась связь dependsOn между androidAndroidTest и commonTest. Это означало следующее:
Код из
commonTestбыл доступен вandroidAndroidTest.Объявления
expectвcommonTestдолжны были иметь соответствующие реализацииactualвandroidAndroidTest.Тесты, объявленные в
commonTest, также запускались как инструментированные тесты Android.
В новой структуре наборов исходного кода Android связь dependsOn не добавляется по умолчанию. Если вы хотите сохранить прежнее поведение, вручную объявите следующую связь в файле build.gradle.kts:
kotlin {
// ...
sourceSets {
val commonTest by getting
val androidInstrumentedTest by getting {
dependsOn(commonTest)
}
}
}
Настройка реализации вариантов Android
Ранее плагин Kotlin Gradle заблаговременно создавал исходные наборы, соответствующие исходным наборам Android, содержащим debug и release типы сборки или пользовательские варианты, такие как demo и full. Эти исходные наборы становились доступными с помощью выражений, например val androidDebug by getting { ... }.
В новой структуре исходных наборов Android используются onVariants для их создания. Из-за этого такие выражения становятся недопустимыми и приводят к ошибкам, например org.gradle.api.UnknownDomainObjectException: KotlinSourceSet with name 'androidDebug' not found.
Чтобы обойти эту проблему, используйте новый API invokeWhenCreated() в файле build.gradle.kts:
kotlin {
// ...
@OptIn(ExperimentalKotlinGradlePluginApi::class)
sourceSets.invokeWhenCreated("androidFreeDebug") {
// ...
}
}
© 2010–2026 JetBrains s.r.o. and Kotlin Programming Language contributors
Licensed under the Apache License, Version 2.0.
https://kotlinlang.org/docs/multiplatform/multiplatform-android-layout.html