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 目錄是依賴的緩存,目的是為了提升構建效率和保證構建的可重復性(在無法連接私服時也能使用緩存進行構建)。