Android 源集布局
新的 Android 源集布局在 Kotlin 1.8.0 中引入,并在 1.9.0 中成为默认布局。请参考本指南以了解弃用的布局与新布局之间的主要区别,以及如何迁移您的项目。
您无需执行所有建议,只需执行适用于您特定项目的建议即可。
检查兼容性
新布局要求使用 Android Gradle 插件 7.0 或更高版本,并且受 Android Studio 2022.3 及更高版本支持。请检查您的 Android Gradle 插件版本,并在必要时进行升级。
重命名 Kotlin 源集
如果适用,请按照以下模式重命名项目中的源集:
| 旧版源集布局 | 新版源集布局 |
|---|---|
targetName + AndroidSourceSet.name | targetName + AndroidVariantType |
{AndroidSourceSet.name} 与 {KotlinSourceSet.name} 的映射关系如下:
| 旧版源集布局 | 新版源集布局 | |
|---|---|---|
| main | androidMain | androidMain |
| test | androidTest | androidUnitTest |
| androidTest | androidAndroidTest | androidInstrumentedTest |
移动源文件
如果适用,请按照以下模式将源文件移动到新目录:
| 旧版源集布局 | 新版源集布局 |
|---|---|
该布局具有额外的 /kotlin SourceDirectories | src/{KotlinSourceSet.name}/kotlin |
{AndroidSourceSet.name} 与 {包含的 SourceDirectories} 的映射关系如下:
| 旧版源集布局 | 新版源集布局 | |
|---|---|---|
| main | src/androidMain/kotlin src/main/kotlin src/main/java | src/androidMain/kotlin src/main/kotlin src/main/java |
| test | src/androidTest/kotlin src/test/kotlin src/test/java | src/androidUnitTest/kotlin src/test/kotlin src/test/java |
| androidTest | src/androidAndroidTest/kotlin src/androidTest/java | src/androidInstrumentedTest/kotlin src/androidTest/java, src/androidTest/kotlin |
移动 AndroidManifest.xml 文件
如果您的项目中包含 AndroidManifest.xml 文件,请按照以下模式将其移动到新目录:
| 旧版源集布局 | 新版源集布局 |
|---|---|
| src/{AndroidSourceSet.name}/AndroidManifest.xml | src/{KotlinSourceSet.name}/AndroidManifest.xml |
{AndroidSourceSet.name} 与 {AndroidManifest.xml 位置} 的映射关系如下:
| 旧版源集布局 | 新版源集布局 | |
|---|---|---|
| main | src/main/AndroidManifest.xml | src/androidMain/AndroidManifest.xml |
| debug | src/debug/AndroidManifest.xml | src/androidDebug/AndroidManifest.xml |
检查 Android 与公共测试之间的关系
新的 Android 源集布局改变了 Android 仪器化测试(在新布局中重命名为 androidInstrumentedTest)与公共测试(common tests)之间的关系。
此前,androidAndroidTest 与 commonTest 之间的 dependsOn 关系是默认存在的。这意味着:
commonTest中的代码在androidAndroidTest中可用。commonTest中的expect声明必须在androidAndroidTest中有对应的actual实现。- 在
commonTest中声明的测试也会作为 Android 仪器化测试运行。
在新的 Android 源集布局中,默认不再添加 dependsOn 关系。如果您希望保留之前的行为,请在 build.gradle.kts 文件中手动声明以下关系:
kotlin {
// ...
sourceSets {
val commonTest by getting
val androidInstrumentedTest by getting {
dependsOn(commonTest)
}
}
}调整 Android flavor 的实现
此前,Kotlin Gradle 插件会预先创建与 Android 源集相对应的源集,这些源集包含 debug 和 release 构建类型或自定义变体(如 demo 和 full)。这使得可以通过 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") {
// ...
}
}