Android项目在构建(组包)时,Gradle会自动将从Maven私服(或任何配置的仓库)获取的依赖包(AAR、JAR等)下载到本地的Gradle缓存目录中。
下面详细解释这个过程和相关的概念:
详细过程
-
声明依赖:在你的
build.gradle
(通常是app/build.gradle
或 library module 的build.gradle
) 文件中,你使用implementation
、api
等关键字声明了项目所需的依赖项。dependencies {implementation 'com.google.code.gson:gson:2.8.9'implementation 'com.squareup.retrofit2:retrofit:2.9.0'// 这些坐标指向了Maven仓库中的包 }
-
配置仓库:你需要在项目级别的
settings.gradle
或build.gradle
中告诉 Gradle 应该去哪些仓库寻找这些依赖。通常会配置公司的私服地址(如 Nexus、Artifactory)和公共仓库(如 Google、Maven Central)。dependencyResolutionManagement {repositories {maven { url "https://你的私服地址/nexus/repository/maven-public/" } // 私服优先google() // 公共仓库mavenCentral() // 公共仓库} }
-
解析依赖(下载):当你执行构建命令(如
./gradlew build
)或同步项目(Sync Project with Gradle Files)时,Gradle 的依赖解析机制会开始工作:- 按顺序检查仓库:Gradle 会按照你在
repositories
块中声明的顺序,依次去这些仓库中查找你声明的依赖。 - 私服优先:如果你的私服配置在第一位,并且私服中存在
gson:2.8.9
,Gradle 就会从私服下载。 - 下载到本地缓存:一旦在某个仓库中找到对应的依赖,Gradle 就会将其下载到你的本地 Gradle 缓存目录中。
- 按顺序检查仓库:Gradle 会按照你在
-
使用本地缓存:在后续的构建中,只要版本号没有改变,Gradle 就不会再次发起网络请求去下载相同的依赖,而是直接使用本地缓存中的副本,这极大地加快了构建速度。
本地缓存目录在哪里?
Gradle 的本地缓存默认存放在用户主目录下的 .gradle/caches
文件夹中。
- Windows:
C:\Users\<你的用户名>\.gradle\caches\modules-2\files-2.1
- macOS / Linux:
~/.gradle/caches/modules-2/files-2.1
在这个目录下,你会看到依赖包按照 组名/ artifact名/版本号
的结构被组织和存储。
特殊情况与注意事项
- IDE(Android Studio)的作用:当你点击 Android Studio 的 “Sync Project” 按钮时,它本质上就是在触发 Gradle 的依赖解析和下载任务,所以效果和命令行执行
./gradlew build
是一样的。 - 离线模式(Offline Mode):Gradle 和 Android Studio 都支持离线模式。开启后,构建系统将只使用本地缓存中的依赖,不会连接任何网络仓库。如果缓存中没有所需的依赖,构建就会失败。
- 缓存清理:有时为了解决一些诡异的依赖问题(比如本地缓存的文件损坏或与私服最新版本不一致),开发者会选择清理本地缓存。可以使用命令行
./gradlew cleanBuildCache
或直接手动删除~/.gradle/caches
目录(注意,这会清空所有项目的 Gradle 缓存,下次构建需要重新下载所有依赖)。 - SNAPSHOT 版本:对于版本号以
-SNAPSHOT
结尾的依赖(如1.0.0-SNAPSHOT
),Gradle 默认会每隔 24 小时检查一次远程仓库是否有更新。如果私服上的 SNAPSHOT 版本有了新的构建,Gradle 会再次下载并更新本地缓存。你可以通过--refresh-dependencies
参数强制刷新所有 SNAPSHOT 依赖。
总结
阶段 | 行为 | 位置 |
---|---|---|
构建/同步时 | Gradle 从配置的仓库(私服、公服)解析依赖 | 网络 |
首次下载 | 将找到的依赖包下载并存储到本地 | ~/.gradle/caches/ |
后续构建 | 优先使用本地缓存中的依赖包,无需联网 | ~/.gradle/caches/ |
所以,你的 Maven 私服是依赖的来源,而本地 Gradle 目录是依赖的缓存,目的是为了提升构建效率和保证构建的可重复性(在无法连接私服时也能使用缓存进行构建)。