Android Gradle Plugin 3.1.1中添加测试sourceSets失效问题
解决Android Studio 3.1+ Gradle升级后测试模块代码引用失效的问题
我之前在升级AGP(Android Gradle Plugin)到3.1以上版本时,也碰到过和你一模一样的问题——之前通过sourceSets直接引用:testcore模块源码目录的方式突然失效了。这是因为新版本的插件对模块隔离和依赖管理做了更严格的规范,直接跨模块引用源码目录的方式不再被默认支持。下面给你两个可行的解决办法:
方案一:将:testcore转为测试专用的Android Library模块(推荐)
这是最符合Gradle最佳实践的方式,后续版本升级也不容易出问题:
- 把
:testcore模块改成标准的Android Library(如果还不是的话),确保它的build.gradle顶部是apply plugin: 'com.android.library'(或者新版的plugins { id 'com.android.library' })。 - 在需要使用
:testcore的模块的build.gradle中,添加测试依赖:
// 单元测试依赖 testImplementation project(':testcore') // 如果需要在Instrumented测试(androidTest)中使用,再加上这行 androidTestImplementation project(':testcore')
这样Gradle会自动处理:testcore的编译路径和依赖传递,完全适配新版本的AGP。
方案二:调整sourceSets配置的路径引用方式
如果暂时不想修改:testcore的模块类型,可以改用通过project对象获取绝对路径的方式配置sourceSets,避免相对路径解析的问题:
sourceSets { test { // 直接通过project对象获取testcore模块的测试源码目录 java.srcDirs += project(':testcore').file('src/test/java') } // 如果你的项目有Instrumented测试,同样适配androidTest androidTest { java.srcDirs += project(':testcore').file('src/androidTest/java') } }
这种方式绕过了相对路径的解析问题,让Gradle能正确识别跨模块的源码目录。
为什么旧配置会失效?
Android Gradle Plugin 3.1.0及之后的版本,强化了模块之间的代码隔离机制,默认不允许直接引用其他模块的源码目录——它期望模块间的代码共享通过依赖声明来实现,而不是直接的目录引用。这也是为了更好地支持增量编译、模块隔离和构建缓存等新特性。
内容的提问来源于stack exchange,提问作者Matt Carron
相关产品推荐
相关产品推荐

