Gradle 編譯的那些坑

說到 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。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 說明 本文主要介紹和Gradle關(guān)系密切、相對不容易理解的配置,偏重概念介紹。部分內(nèi)容是Android特有的(例如...
    搬磚的小明閱讀 16,157評論 1 62
  • Gradle配置最佳實踐 本文會不定期更新,推薦watch下項目。如果喜歡請star,如果覺得有紕漏請?zhí)峤籭ssu...
    Solang閱讀 1,764評論 0 4
  • 大家平時都用什么app呀! 推薦幾個好玩的好用的嘛
    痣哥說行閱讀 304評論 0 0
  • 1.讀納蘭性德寫的詞,你會感受其中有那么個飽含摯意深情,且十分凄惋動人的主旋律,久久地在你心上縈回,且聽這首《蝶戀...
    有說有笑有情調(diào)閱讀 842評論 0 0
  • 時間不會在一個點停留,也不會有盡頭!可是我們卻會消失在某個時間點。所說時間短暫,可我依然覺得滿足。我并不富裕,可我...
    別不開心閱讀 461評論 0 2

友情鏈接更多精彩內(nèi)容