Gradle 编译的那些坑

说到 Gradle 编译,相信每个 Android 开发者都或多或少曾经被坑过。因为gradle依赖的仓库都在国外,而国内访问国外网络都情况大家也都懂得。我司的情况就更严重了,20 多个内部依赖,50 多个三方依赖。然后光 root gradle 文件里就有这么多仓库(不要问我为什么):

repositories {
       jcenter()
       mavenCentral()
       google()
       maven {
           url "http://127.0.0.1:8081/nexus/content/repositories/releases/"  // 127.0.0.1 代指内部 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 就要好久。万一中间再遇到什么坑,那就有得搞了,有时候一两天都不一定能解决。本篇文章就是笔者总结的遇到的 gradle sync 中遇到的一些坑。

先试试重启大法?

重启试试? Invalidate Caches and Restart 了解一下?

大坑:JCenter 被墙

如果你最近突然发现 jcenter 上的东西一直拉不下来,那大概率是 jcenter 被墙了。
解决方案:
全局替换 jcenter 源到 aliyun mirror:

~/.gradle 目录下新建 init.gardle 文件,输入以下内容:

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 过来对应目录,以为这样就能解决了。却发现 gradle sync 无论如何也无法重试,挂了代理,切换 offline mode... 都尝试未果。 后来经分析 Gradle 在每个项目的 .gradle 目录下生成了一份 hash 映射,对应每个版本一份。在第一次获取这个依赖库的时候生成,此后就一直根据这个 hash 查找。然而有个很坑爹的问题是,这个 hash 值在没台电脑下都不一致。而 gradle 在下载依赖时,只会根据依赖包命和版本号判断对应依赖是否已经存在在缓存中。所以就出了这个现象:明明缓存里有,但 gradle 编译就是找不到,然后又一直不会去下载。
解决方案:
删除工程目录下的 .gradle 目录和本地 ~/.gradle/caches/modules-2/files-2.1 下的所有文件,然后重启 AS 进行 sync。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,457评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,837评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,696评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,183评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,057评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,105评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,520评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,211评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,482评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,574评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,353评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,897评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,489评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,683评论 2 335

推荐阅读更多精彩内容

  • 说明 本文主要介绍和Gradle关系密切、相对不容易理解的配置,偏重概念介绍。部分内容是Android特有的(例如...
    jzj1993阅读 15,509评论 1 62
  • Gradle配置最佳实践 本文会不定期更新,推荐watch下项目。如果喜欢请star,如果觉得有纰漏请提交issu...
    Solang阅读 1,611评论 0 4
  • 大家平时都用什么app呀! 推荐几个好玩的好用的嘛
    痣哥说行阅读 276评论 0 0
  • 1.读纳兰性德写的词,你会感受其中有那么个饱含挚意深情,且十分凄惋动人的主旋律,久久地在你心上萦回,且听这首《蝶恋...
    有说有笑有情调阅读 774评论 0 0
  • 时间不会在一个点停留,也不会有尽头!可是我们却会消失在某个时间点。所说时间短暂,可我依然觉得满足。我并不富裕,可我...
    别不开心阅读 395评论 0 2