說到 Gradle 編譯,相信每個 Android 開發(fā)者都或多或少曾經(jīng)被坑過。因為gradle依賴的倉庫都在國外,而國內(nèi)訪問國外網(wǎng)絡(luò)都情況大家也都懂得。我司的情況就更嚴(yán)重了,20 多個內(nèi)部依賴,50 多個三方依賴。然后光 root gradle 文件里就有這么多倉庫(不要問我為什么):
repositories {
jcenter()
mavenCentral()
google()
maven {
url "http://127.0.0.1:8081/nexus/content/repositories/releases/" // 127.0.0.1 代指內(nèi)部 maven 倉庫
}
maven {
url "http://127.0.0.1:8081/nexus/content/repositories/central"
}
maven {
url "http://127.0.0.1:8081/nexus/content/repositories/snapshots"
}
maven {
url "http://127.0.0.1:8081/nexus/content/groups/public"
}
maven { url "https://jitpack.io" }
maven {
url "https://oss.sonatype.org/content/repositories/snapshots/"
}
mavenLocal()
}
每次拉一個新倉庫下來,光 sync dependencies 就要好久。萬一中間再遇到什么坑,那就有得搞了,有時候一兩天都不一定能解決。本篇文章就是筆者總結(jié)的遇到的 gradle sync 中遇到的一些坑。
先試試重啟大法?
重啟試試? Invalidate Caches and Restart 了解一下?
大坑:JCenter 被墻
如果你最近突然發(fā)現(xiàn) jcenter 上的東西一直拉不下來,那大概率是 jcenter 被墻了。
解決方案:
全局替換 jcenter 源到 aliyun mirror:
在 ~/.gradle 目錄下新建 init.gardle 文件,輸入以下內(nèi)容:
gradle.projectsLoaded {
rootProject.allprojects {
buildscript {
repositories {
def REPOSITORY_URL = 'http://maven.aliyun.com/nexus/content/repositories/jcenter'
all { ArtifactRepository repo ->
if (repo instanceof MavenArtifactRepository) {
def url = repo.url.toString()
if (url.startsWith('https://repo1.maven.org/maven2')
|| url.startsWith('https://jcenter.bintray.com/')) {
project.logger.lifecycle "Repository ${repo.url} replaced by $REPOSITORY_URL."
println("buildscript ${repo.url} replaced by $REPOSITORY_URL.")
remove repo
}
}
}
jcenter {
url REPOSITORY_URL
}
}
}
repositories {
def REPOSITORY_URL = 'http://maven.aliyun.com/nexus/content/repositories/jcenter'
all { ArtifactRepository repo ->
if (repo instanceof MavenArtifactRepository) {
def url = repo.url.toString()
if (url.startsWith('https://repo1.maven.org/maven2')
|| url.startsWith('https://jcenter.bintray.com/')) {
project.logger.lifecycle "Repository ${repo.url} replaced by $REPOSITORY_URL."
println("allprojects ${repo.url} replaced by $REPOSITORY_URL.")
remove repo
}
}
}
jcenter {
url REPOSITORY_URL
}
}
}
}
Gradle 緩存存放位置
~/.gradle/caches/modules-2/files-2.1 這個目錄下可以找到你依賴的所有 gradle 庫的包。
明明有緩存,卻提示一直拉不下來?
之前我曾遇到過某兩個庫依賴一直無法拉下來的問題,遂從別人電腦的 cache 路徑下 copy 過來對應(yīng)目錄,以為這樣就能解決了。卻發(fā)現(xiàn) gradle sync 無論如何也無法重試,掛了代理,切換 offline mode... 都嘗試未果。 后來經(jīng)分析 Gradle 在每個項目的 .gradle 目錄下生成了一份 hash 映射,對應(yīng)每個版本一份。在第一次獲取這個依賴庫的時候生成,此后就一直根據(jù)這個 hash 查找。然而有個很坑爹的問題是,這個 hash 值在沒臺電腦下都不一致。而 gradle 在下載依賴時,只會根據(jù)依賴包命和版本號判斷對應(yīng)依賴是否已經(jīng)存在在緩存中。所以就出了這個現(xiàn)象:明明緩存里有,但 gradle 編譯就是找不到,然后又一直不會去下載。
解決方案:
刪除工程目錄下的 .gradle 目錄和本地 ~/.gradle/caches/modules-2/files-2.1 下的所有文件,然后重啟 AS 進(jìn)行 sync。