gradle 7.0+ 要求所有依赖仓库必须统一声明在 settings.gradle 的 dependencyresolutionmanagement 块中,子模块 build.gradle 中禁止出现 repositories 块;需配置 repositoriesmode.set(repositoriesmode.fail_on_project_repos),并同时包含 google() 和 mavencentral()(二者缺一不可),且 pluginmanagement.repositories 与 dependencyresolutionmanagement.repositories 需分别独立配置。

Gradle 7.0+ 中子模块里写 repositories 直接报错
从 Gradle 7.0 开始,repositories 块在子模块(即 build.gradle)中被明确禁止。你如果还在某个 module 的 build.gradle 里写了:repositories { google() mavenCentral() },就会触发类似这样的错误:Build was configured to prefer settings repositories but repository 'google' was added by build file 'app/build.gradle':12。
这不是语法错误,而是 Gradle 主动拦截——它已将仓库声明权收归 settings.gradle 统一管理,子模块再私自声明,就属于策略冲突。
必须把所有仓库移到 settings.gradle 的 dependencyResolutionManagement
新版标准配置只允许一处声明依赖仓库,就是 settings.gradle 里的 dependencyResolutionManagement 块。它会自动作用于全部子模块,无需重复。
- 删掉所有
build.gradle(包括根项目和各 module)里的repositories块,哪怕只有一行google()也得清空 - 确保
settings.gradle中有且仅有如下结构(Groovy 版):
dependencyResolutionManagement {
repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
repositories {
google()
mavenCentral()
maven { url 'https://jitpack.io' }
}
}
RepositoriesMode.FAIL_ON_PROJECT_REPOS 是关键开关:它让 Gradle 在检测到任何子模块擅自声明仓库时立刻失败,而不是静默忽略——这是防误配的强制护栏,别设成 WARN_ON_PROJECT_REPOS 或删掉这行。
为什么不能只留 google()?mavenCentral() 必须一起配
很多老项目只配了 google(),以为 AndroidX 就够了,结果同步时卡在 androidx.lifecycle:lifecycle-viewmodel 或第三方库上。这是因为:
-
google()只托管 Android 官方库(androidx.*、com.android.*),不包含 Kotlin 标准库、JUnit、Retrofit、OkHttp 等通用依赖 -
mavenCentral()才是 Java/Kotlin 生态的主干仓库,90% 以上非 Google 库都首发或同步于此 - 两者顺序无关紧要,但缺一不可;漏掉
mavenCentral()就等于切断了对绝大多数开源库的访问路径
插件仓库(pluginManagement)和依赖仓库不能混用同一块
容易手滑把 google() 写进 pluginManagement.repositories,以为“反正都是仓库”。但这是两套独立系统:
-
pluginManagement.repositories只管下载 Gradle 插件(比如com.android.application、org.jetbrains.kotlin.jvm) -
dependencyResolutionManagement.repositories只管项目编译/运行时依赖(androidx.core:core-ktx、com.squareup.okhttp3:okhttp) - 两个块都要单独配
google()和mavenCentral(),不能互相替代,也不能合并
最常被忽略的是:AGP(com.android.tools.build:gradle)本身是插件,它的坐标在 google();但它依赖的某些内部库(如 com.android.tools.build:builder)却发布在 mavenCentral()。少配任何一个,都可能在某次 AGP 升级后突然构建失败。











