切换Kotlin后不同SourceSet(构建变体)致DataBinding编译失败
解决Kotlin+Gradle 8.1.1下构建变体BuildB的DataBinding生成问题
1. 验证SourceSet配置正确性
检查模块级build.gradle(或build.gradle.kts)中BuildB的SourceSet是否正确关联对应res目录:
Groovy DSL示例:
android { sourceSets { buildA { res.srcDirs = ['src/buildA/res'] } buildB { res.srcDirs = ['src/buildB/res'] } } }
Kotlin DSL示例:
android { sourceSets { named("buildA") { res.srcDirs("src/buildA/res") } named("buildB") { res.srcDirs("src/buildB/res") } } }
同时确认BuildB的res目录下存在目标布局文件(如splash_screen.xml),且布局根标签为<layout>(启用DataBinding的必要条件)。
2. 确保全局启用DataBinding且变体未单独禁用
在模块级build配置中全局开启DataBinding,避免针对BuildB单独关闭该功能:
Groovy DSL示例:
android { buildFeatures { dataBinding true } }
Kotlin DSL示例:
android { buildFeatures { dataBinding = true } }
检查是否存在buildB { buildFeatures.dataBinding = false }这类配置,如有则删除。
3. 调整任务执行顺序(Gradle 8.x兼容性修复)
Gradle 8.x对任务依赖顺序的校验更严格,需确保Kotlin编译任务在DataBinding类生成之后执行,添加以下配置:
Groovy DSL示例:
afterEvaluate { tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).configureEach { dependsOn tasks.withType(com.android.build.gradle.tasks.DataBindingGenerateBaseClasses) } }
Kotlin DSL示例:
afterEvaluate { tasks.withType<org.jetbrains.kotlin.gradle.tasks.KotlinCompile>().configureEach { dependsOn(tasks.withType<com.android.build.gradle.tasks.DataBindingGenerateBaseClasses>()) } }
4. 清理缓存并重新构建
执行以下命令彻底清理缓存并重新构建BuildB:
./gradlew clean ./gradlew :yourModuleName:assembleBuildB --refresh-dependencies
也可手动删除项目根目录的.gradle文件夹和模块的build文件夹,再同步项目。
5. 校验布局文件命名与结构
- 确保BuildB的布局文件名与BuildA一致(如均为
splash_screen.xml),DataBinding生成的类名由布局文件名驼峰化而来(splash_screen.xml对应SplashScreenBinding)。 - 确认布局根标签为
<layout>包裹,示例:
<layout xmlns:android="http://schemas.android.com/apk/res/android"> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent"> <!-- 布局内容 --> </LinearLayout> </layout>
内容的提问来源于stack exchange,提问作者Anael
相关产品推荐
相关产品推荐

