Android Studio升级至3.1.0后替换Gradle依赖配置出现错误求助
解决Android Studio 3.1.0升级后替换compile为implementation的报错问题
嘿,我最近刚处理好几个和你一模一样的问题——升级Android Studio到3.1.0后,照着警告把compile换成implementation,testCompile换成testImplementation,结果项目反而报错了对吧?别慌,这其实是Gradle插件升级后依赖规则变了导致的,咱们一步步来排查和解决。
先回顾下你的情况:
- 从AS 3.0.1升级到3.1.0,构建时收到两个官方警告,提示
compile和testCompile会在2018年底停止支持,需要替换为implementation和testImplementation - 按提示修改后项目出现错误,你的app模块
build.gradle片段如下:
apply plugin: 'com.android.application'
android {
compileSdkVersion 27
defaultConfig {
applicationId "bi..."
常见问题原因&修复步骤
1. 先确认Gradle插件版本是否匹配
AS 3.1.0必须搭配com.android.tools.build:gradle:3.1.0版本的插件,很多人只改了app模块的依赖配置,却忘了更新项目根目录的build.gradle里的插件版本,这会直接导致不兼容报错。
打开项目根目录的build.gradle,检查这段配置:
buildscript { repositories { google() // AS 3.0+建议优先用google()仓库,代替之前的maven.google.com jcenter() } dependencies { classpath 'com.android.tools.build:gradle:3.1.0' // 必须和AS版本对应! } }
如果这里的版本还是3.0.1或者更低,改成3.1.0后同步项目。
2. 处理依赖传递的变化
这是最容易踩坑的点:implementation和旧的compile最大的区别是不会传递依赖。举个例子:
- 假设你有一个library模块,里面用
implementation 'com.some:third-lib:1.0'引入了第三方库 - 之前app模块用
compile project(':library'),就能直接引用到这个第三方库的类 - 现在换成
implementation project(':library'),app模块就找不到这个第三方库的类了,因为library的依赖没有传递过来
解决办法分两种:
- 如果app确实需要用到library里的第三方库,把library模块里的
implementation改成api(api等价于旧的compile,支持依赖传递) - 直接在app模块的
dependencies里手动添加这个第三方库的依赖
3. 清理Gradle缓存,重新构建
有时候旧的缓存会导致各种奇怪的报错,执行以下操作试试:
- 点击AS顶部工具栏的
Build -> Clean Project - 接着点击
Build -> Rebuild Project - 如果还是不行,手动删除项目根目录下的
.gradle文件夹和app模块的build文件夹,然后重启AS再同步构建
4. 检查测试相关的依赖变更
如果错误出在测试代码里,别忘了把所有测试相关的依赖都改对:
- 普通单元测试的
testCompile换成testImplementation - 仪器化测试的
androidTestCompile换成androidTestImplementation
比如:
testImplementation 'junit:junit:4.12' androidTestImplementation 'com.android.support.test:runner:1.0.2' androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
修复后的示例配置
给你一个参考的app模块build.gradle片段,你可以对照着调整自己的配置:
apply plugin: 'com.android.application' android { compileSdkVersion 27 buildToolsVersion "27.0.3" // 建议和compileSdkVersion版本匹配 defaultConfig { applicationId "com.example.yourapp" minSdkVersion 15 targetSdkVersion 27 versionCode 1 versionName "1.0" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } } dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) implementation 'com.android.support:appcompat-v7:27.1.1' implementation 'com.android.support.constraint:constraint-layout:1.1.3' // 测试依赖 testImplementation 'junit:junit:4.12' androidTestImplementation 'com.android.support.test:runner:1.0.2' androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2' // 如果依赖其他模块,根据需求选api或implementation api project(':mylibrary') }
内容的提问来源于stack exchange,提问作者Aashish Kumar
相关产品推荐
相关产品推荐

