ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Android Studio构建卡住?Gradle国内镜像配置全攻略

Android Studio构建卡住?Gradle国内镜像配置全攻略 很多人第一次用Android Studio新建工程十有八九会卡在同一个地方Gradle同步进度条转个不停左下角日志里写着Downloading https://services.gradle.org/distributions/gradle-8.7-bin.zip速度却几十KB/s甚至直接0%。运气好等个把小时运气不好直接报Could not install Gradle distribution from...重试几次依然是老样子。网上流传的主流解决办法是手动下载zip包然后塞进缓存目录听着简单实操却有一堆坑版本号要精确匹配、目录结构不能出错、Gradle缓存里还带了一串校验hash放错位置照样不认到头来还是重新下载。这篇文章要分享的是另一条路子不改本地缓存、不手动下载安装包只改配置文件让Gradle自己从国内镜像源拉取。整套操作下来新环境首次构建从几小时压缩到几分钟对新手和老手都适用。先别急着改你得先搞清楚一件事你卡住的到底是哪一步。1. 先搞清楚你到底是卡在下载Gradle还是卡在下载依赖1.1 Gradle发行版与项目依赖是两个不同的下载阶段很多人分不清下载Gradle和下载项目依赖的区别其实这是构建流程里两个独立环节。新建项目后Android Studio第一次Sync首先会读取Gradle Wrapper配置去下载对应版本的Gradle发行包就是那个gradle-x.x-bin.zip。这个包是构建引擎本身下载完会解压到本机之后构建都复用这份缓存不会重复下载。等Gradle引擎跑起来之后才会进入第二个阶段解析并下载项目依赖包括AndroidX库、Kotlin插件、第三方组件等。这些依赖是另一个仓库体系默认从google()和mavenCentral()这两个仓库拉取。很多人的感受是Gradle下载了半天好不容易装好了结果Sync依赖又卡死就是因为这两个阶段都踩了网络坑。1.2 默认配置为什么这么慢慢的根源在于默认地址都指向海外服务器。Gradle发行版的distributionUrl指向services.gradle.org依赖仓库指向google.com和repo.maven.apache.org。对于国内网络环境来说这些地址的连通性、传输速度都极不稳定几十MB的Gradle包下几个小时是常态项目依赖上百MB更是煎熬。我之前帮同事排查过一台新电脑卡在Gradle下载阶段足足一整天最后打开任务管理器看网络连接确实在跑但速度几乎为0。换到镜像源之后同样的包下载时间变成了不到两分钟。这就是配置替换的价值本地不用动任何安装文件只是把下载地址换成国内可达的镜像Gradle自身的工作机制完全不变。2. 方案一改gradle-wrapper.properties让Gradle发行包自动走镜像2.1 找到并读懂gradle-wrapper.properties这个文件位于项目的gradle/wrapper目录下注意是项目里那个gradle文件夹不是Android Studio安装目录。用Android Studio打开项目后左上角Project视图切到Project模式展开项目根目录依次进入gradle → wrapper就能看到gradle-wrapper.properties。文件内容大致长这样distributionBaseGRADLE_USER_HOME distributionPathwrapper/dists distributionUrlhttps\://services.gradle.org/distributions/gradle-8.7-bin.zip networkTimeout10000 validateDistributionUrltrue zipStoreBaseGRADLE_USER_HOME zipStorePathwrapper/dists核心就是distributionUrl这一行它告诉Gradle Wrapper你要去什么地址下载哪个版本的Gradle发行包。剩下几个参数里networkTimeout是下载超时时间单位毫秒默认10秒后面排查问题会用到。distributionBase和zipStoreBase指定缓存和解压路径一般不用改。2.2 替换distributionUrl为国内镜像地址把distributionUrl的值从官方地址改成国内镜像地址。目前我实测最稳定的是腾讯云镜像地址规则非常清晰只要把services.gradle.org/distributions替换成mirrors.cloud.tencent.com/gradle版本号保持不变distributionUrlhttps\://mirrors.cloud.tencent.com/gradle/gradle-8.7-bin.zip也就是说原来的包名是gradle-8.7-bin.zip镜像地址里也必须是同样的文件名版本不能动。你项目的目标版本用的是什么镜像地址就保持什么。常用的几个版本都很好找直接改即可。有人问能不能用阿里云镜像。阿里云在Maven仓库方面是很强但Gradle发行版的镜像可用性不如腾讯云稳定版本覆盖也不全。我建议发行版走腾讯云依赖仓库走阿里云各用各的强项。这里有个细节必须提醒properties文件里distributionUrl中的冒号前面有个反斜杠转义符也就是写法是https://不是https://。这是properties格式的语法要求否则冒号会被误判成键值分隔符导致配置解析失败。改成镜像地址的时候务必保留这个转义符否则Gradle根本读不到正确的地址。2.3 如何确认构建真的走通了镜像源保存修改后回到Android Studio点击菜单栏File → Sync Project with Gradle Files或者打开右侧Gradle工具窗口点刷新按钮。Android Studio会重新读取gradle-wrapper.properties发现distributionUrl变了就会按新地址重新下载。验证是否生效很简单观察Gradle工具窗口底部或Build输出日志如果下载地址变成了mirrors.cloud.tencent.com开头说明配置已经生效。另外一个办法是打开用户目录下的.gradle/wrapper/dists/目录找到对应版本号的文件夹看里面是否出现正在下载的.part临时文件并且文件大小在持续增长。我第一次切换镜像时下载速度直接从几十KB/s跳到3-5MB/s一个80MB左右的包刷刷就下完了。下载完成后Gradle会自动解压并把解压后的目录标记为可用整个过程不需要任何人工干预。下次再同步同一个版本会直接命中缓存连下载动作都不会有。3. 方案二全局init.gradle把依赖仓库也换成镜像3.1 为什么只改distributionUrl还不够只改Gradle发行版地址解决的是构建引擎本身的下载慢。但项目Sync依赖时依然会访问google()和mavenCentral()这两个海外仓库。把这两个仓库里的依赖全部拉齐少说也有几百MB慢起来同样让人抓狂。而且依赖下载的问题不止发生在你本地。Gradle的依赖缓存是按项目存的你新建一个项目旧项目里下载过的库不一定能复用切换到别的分支、升级依赖版本都可能触发新的下载。所以必须有一个全局层面的方案让当前这台机器上所有项目的依赖解析都优先走镜像地址而不是每个项目单独改一遍。3.2 编写init.gradle仓库镜像与插件镜像分开处理这个方案的核心是在Gradle全局配置目录中加入一个初始化脚本Windows下通常是C:\Users\你的用户名.gradlemacOS和Linux下是~/.gradle。在这个目录里新建一个名为init.gradle的文件Gradle每次运行都会自动加载它对机器上所有项目生效。init.gradle最核心的配置如下我拆成两部分说明。第一部分是依赖仓库的镜像替换allprojects { repositories { maven { url https://maven.aliyun.com/repository/public } maven { url https://maven.aliyun.com/repository/google } maven { url https://maven.aliyun.com/repository/gradle-plugin } maven { url https://mirrors.cloud.tencent.com/nexus/repository/maven-public/ } google() mavenCentral() } }这里把阿里云的三个常用镜像仓库放在最前面又保留了google()和mavenCentral()做兜底。Gradle解析依赖时会按照仓库列表顺序逐个查找排在前面、且命中率高的镜像仓库会承接绝大多数请求官方源只处理镜像里找不到的冷门依赖。这样既保证速度又不至于因为镜像缺失某个极冷门的库而直接构建失败。第二部分是插件仓库的镜像替换。项目里用的Android Gradle Plugin、Kotlin插件等构建插件走的是另一套仓库体系需要用settingsEvaluated钩子来设置settingsEvaluated { settings - settings.pluginManagement.repositories { maven { url https://maven.aliyun.com/repository/gradle-plugin } maven { url https://maven.aliyun.com/repository/google } maven { url https://maven.aliyun.com/repository/public } google() mavenCentral() gradlePluginPortal() } }这里的两层配置缺一不可。有些朋友只写了allprojects部分发现插件还是慢就是因为插件默认走gradlePluginPortal这个海外仓库没有被替换掉。加上settingsEvaluated里的pluginManagement.repositories之后插件下载同样会优先命中阿里云镜像。3.3 两个方案如何配合完整的首次sync流程方案一和方案二不冲突反而是互补关系建议一次性都配上。方案一解决Gradle发行版从海外下载的问题方案二解决依赖和插件从海外下载的问题两者在构建流程中分别作用于不同阶段。配置到位后新环境的完整首次Sync应该是这样Gradle Wrapper从腾讯云镜像拉取发行包自动解压随后构建插件从阿里云镜像解析下载最后项目依赖同样从阿里云镜像拉取。全程不触碰任何海外地址进度条基本是匀速推进不再有卡住不动的折磨体验。配合上有一点需要注意init.gradle是机器级配置不会随项目走。如果你换了新电脑、或者用的不是同一个用户目录需要重新配置。这也是团队协作中容易出问题的地方后面专门说。4. 实操中常见的报错与排查实录4.1 Could not install Gradle distribution 的几种实际原因这个报错是Gradle下载问题中出现频率最高的但具体原因通常有两类。第一类distributionUrl还是官方地址网络根本连不通或者是连接极不稳定导致反复中断。这种情况把地址换成腾讯云镜像基本就能解决。第二类distributionUrl已经改成了镜像地址但仍然报这个错。这时候先用浏览器手动打开一下distributionUrl里写的完整地址看能不能正常下载。如果浏览器能下载而构建失败很多情况是networkTimeout太短导致的。默认的10000毫秒即10秒网络波动大时Gradle还没建立有效连接就被判定超时了改成下面这样能大大缓解networkTimeout150000如果浏览器打开地址返回404说明镜像上不存在这个版本号或者你URL拼错了。回到腾讯云镜像的gradle目录列表页人工核对一下这个版本到底存不存在、文件名是不是bin版本再回来改。4.2 Gradle版本与AGP版本不匹配的报错有时候下载问题解决了又会遇到Minimum supported Gradle version is X.X.X或Gradle version X.X is not supported by the Android Gradle Plugin这类报错。这就是典型的Gradle版本和Android Gradle Plugin版本不匹配跟镜像无关了。很多人在改distributionUrl时有个习惯顺手把版本号换成了自己觉得更新的版本比如项目原本用gradle-7.4非改成gradle-8.7结果AGP不支持构建当场失败。这里务必记住改镜像只改域名路径不要改版本号。项目原本需要什么版本镜像地址就用什么版本。如果确实想升级Gradle先去查官方AGP与Gradle版本兼容对照表确认你当前的AGP能支持目标Gradle版本再动手升级并且要升级到对应的AGP版本配套。4.3 缓存文件损坏和配置不生效的坑Gradle的下载缓存设计成下载成功就常驻这本身是好事但也容易埋坑。比如第一次下载到一半失败留了个损坏的.part文件在dists目录里下次构建时Gradle可能误判为已有缓存结果一直卡着不出结果。遇到这种情况建议手动清掉.gradle/wrapper/dists/下对应版本号的整个目录尤其是那个带着一串hash值的子目录删掉后重新SyncGradle会干净地重新下载。init.gradle配了却不生效最常见的原因是文件名或位置不对。Gradle只认用户目录下.gradle文件夹里的init.gradle以及init.d目录下的.gradle文件放错了位置根本不会加载。另一个隐蔽问题改完init.gradle后后台的Gradle daemon可能还持有旧的配置。这种时候先重启Android Studio或者在项目根目录执行./gradlew --stop停掉所有daemon进程再重新Sync配置才会重新加载。5. 版本选择、团队协作与提速细节5.1 版本选择的小建议即使你打算趁机调整Gradle版本我的建议也是谨慎为主。不要盲目追新很多第三方库和插件还没跟上新版Gradle你换个太新的版本可能一连串依赖都跟着出兼容性问题。优先选择那些被广泛验证过的稳定版本。另外下载发行包时优先选bin版本不要选all版本。bin是标准二进制发行包体积小、下载快日常开发完全够用。all版本额外包含了源码和文档体积大了将近一倍除非你要调试Gradle本身或者离线查阅源码否则没必要用它拖慢下载速度。5.2 团队项目如何统一这套配置团队里最怕出现我这边快你那边慢的体验差异。项目级的gradle-wrapper.properties是允许提交到Git仓库的你改好了镜像地址并验证通过直接提交。这样团队成员拉代码时同一份配置会自动生效不用每个人单独改一遍。但init.gradle不要提交到项目仓库。它是机器级别的全局配置每台电脑的用户目录都不一样强行提交没有意义还会污染项目仓库。建议的做法是在团队Wiki或项目README里写清楚新机器开发环境准备的步骤让每个人把init.gradle放到自己用户目录里。这一步最多花两分钟但能把全团队的Sync体验拉到同一水平线。5.3 顺手能做的构建提速设置配置镜像之余还有几个项目级别的参数能让后续构建更快。在项目根目录的gradle.properties里可以开启Gradle构建缓存和配置缓存像是org.gradle.cachingtrue org.gradle.configuration-cachetrue org.gradle.daemontrue org.gradle.jvmargs-Xmx4096m -XX:MaxMetaspaceSize1024morg.gradle.caching开启后同一份依赖和构建产物在多次构建间可以复用configuration-cache是Gradle 8.x开始持续完善的能力能跳过重复的项目配置阶段对增量构建的提速非常明显。jvmargs是用来调整Gradle运行内存的如果你的电脑内存够大适当调高可以让构建更从容。注意这些参数要根据AGP版本谨慎开启配置缓存和某些老插件可能存在兼容问题遇到问题检查插件是否兼容再启用。我个人对这套方案的评价是一次配置长期受益。前前后后帮同事配过不下十台新电脑按这几步走完没有哪次再卡在下载阶段。尤其是团队里来新人、或者自己换了电脑照着配置一遍后续项目基本一路顺畅那种Sync等到地老天荒的体验真的可以彻底翻篇了。如果你现在正被Gradle下载慢折磨别犹豫花五分钟改配置用过就知道值。
返回列表