說(shuō)到 Gradle 編譯犁苏,相信每個(gè) Android 開(kāi)發(fā)者都或多或少曾經(jīng)被坑過(guò)。因?yàn)間radle依賴的倉(cāng)庫(kù)都在國(guó)外华蜒,而國(guó)內(nèi)訪問(wèn)國(guó)外網(wǎng)絡(luò)都情況大家也都懂得官册。我司的情況就更嚴(yán)重了,20 多個(gè)內(nèi)部依賴瓷马,50 多個(gè)三方依賴拴还。然后光 root gradle 文件里就有這么多倉(cāng)庫(kù)(不要問(wèn)我為什么):
repositories {
jcenter()
mavenCentral()
google()
maven {
url "http://127.0.0.1:8081/nexus/content/repositories/releases/" // 127.0.0.1 代指內(nèi)部 maven 倉(cāng)庫(kù)
}
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()
}
每次拉一個(gè)新倉(cāng)庫(kù)下來(lái),光 sync dependencies 就要好久欧聘。萬(wàn)一中間再遇到什么坑片林,那就有得搞了,有時(shí)候一兩天都不一定能解決怀骤。本篇文章就是筆者總結(jié)的遇到的 gradle sync 中遇到的一些坑费封。
先試試重啟大法?
重啟試試? Invalidate Caches and Restart 了解一下蒋伦?
大坑:JCenter 被墻
如果你最近突然發(fā)現(xiàn) jcenter 上的東西一直拉不下來(lái)弓摘,那大概率是 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
這個(gè)目錄下可以找到你依賴的所有 gradle 庫(kù)的包韧献。
明明有緩存,卻提示一直拉不下來(lái)研叫?
之前我曾遇到過(guò)某兩個(gè)庫(kù)依賴一直無(wú)法拉下來(lái)的問(wèn)題锤窑,遂從別人電腦的 cache 路徑下 copy 過(guò)來(lái)對(duì)應(yīng)目錄,以為這樣就能解決了嚷炉。卻發(fā)現(xiàn) gradle sync 無(wú)論如何也無(wú)法重試渊啰,掛了代理,切換 offline mode... 都嘗試未果渤昌。 后來(lái)經(jīng)分析 Gradle 在每個(gè)項(xiàng)目的 .gradle 目錄下生成了一份 hash 映射虽抄,對(duì)應(yīng)每個(gè)版本一份。在第一次獲取這個(gè)依賴庫(kù)的時(shí)候生成独柑,此后就一直根據(jù)這個(gè) hash 查找迈窟。然而有個(gè)很坑爹的問(wèn)題是,這個(gè) hash 值在沒(méi)臺(tái)電腦下都不一致忌栅。而 gradle 在下載依賴時(shí)车酣,只會(huì)根據(jù)依賴包命和版本號(hào)判斷對(duì)應(yīng)依賴是否已經(jīng)存在在緩存中曲稼。所以就出了這個(gè)現(xiàn)象:明明緩存里有,但 gradle 編譯就是找不到湖员,然后又一直不會(huì)去下載贫悄。
解決方案:
刪除工程目錄下的 .gradle
目錄和本地 ~/.gradle/caches/modules-2/files-2.1
下的所有文件,然后重啟 AS 進(jìn)行 sync娘摔。