Skip to main content

Gradle Repositories 换用阿里云镜像

Gradle 项目(尤其是 Android 项目)经常要从 Google、Maven Central 下载依赖,但是在大陆下载的速度非常之慢(大约 170kB/s),遇到包大一点的依赖只能干等。

以 Android 为例,定义这些下载源的位置在这里:

// build.gradle
allprojects {
  // ...
  repositories {
    // ...
    mavenCentral()
    google()
  }
}

替换成阿里云的依赖就是将这些源替换掉。

直接用代理

如果自己已经有代理,就可以找到或新建 gradle.properties,填入代理设置。

gradle.properties 可以放在这里:

  • 项目根目录 (e.g. android/gradle.properties)
  • Unix 用户目录 (e.g. ~/.gradle/gradle.properties)
  • Windows 用户目录 (e.g. C:\Users\用户名\.gradle\gradle.properties)
# 假定代理服务器是 127.0.0.1,端口 3128
systemProp.http.proxyHost=127.0.0.1
systemProp.http.proxyPort=3128
systemProp.https.proxyHost=127.0.0.1
systemProp.https.proxyPort=3128

检查阿里云的镜像是否仍然存在

先看看阿里云的镜像是否还在。

阿里云Maven镜像站

仅当前项目换成镜像站

// build.gradle
allprojects {
  repositories {
    // mirror
    maven { url 'https://maven.aliyun.com/repository/google' }
    maven { url 'https://maven.aliyun.com/repository/public/' }
    // mavenCentral()
    // google()
  }
}

这个方法有个局限性。

这份配置文件 build.gradle 是属于当前项目的,只保证当前项目的依赖从镜像站拉取。

如果依赖包里面的配置文件仍然是从源站拉取的,那么包里面的依赖还是会从源站下载。

全局项目都改成镜像站(推荐)

位置: ~/.gradle/init.gradle,如果没有就创建一个。

Windows 位置: C:\Users\<用户名>\.gradle\init.gradle

// 摘自 https://blog.csdn.net/u013066244/article/details/113444036
allprojects{
  repositories {
    def ALIYUN_REPOSITORY_URL = 'https://maven.aliyun.com/repository/public'
    def ALIYUN_JCENTER_URL = 'https://maven.aliyun.com/repository/public'
    def ALIYUN_GOOGLE_URL = 'https://maven.aliyun.com/repository/google'
    def ALIYUN_GRADLE_PLUGIN_URL = 'https://maven.aliyun.com/repository/gradle-plugin'
    all { ArtifactRepository repo ->
      if(repo instanceof MavenArtifactRepository){
        def url = repo.url.toString()
        if (url.startsWith('https://repo1.maven.org/maven2/')) {
          project.logger.lifecycle "Repository ${repo.url} replaced by $ALIYUN_REPOSITORY_URL."
          remove repo
        }
        if (url.startsWith('https://jcenter.bintray.com/')) {
          project.logger.lifecycle "Repository ${repo.url} replaced by $ALIYUN_JCENTER_URL."
          remove repo
        }
        if (url.startsWith('https://dl.google.com/dl/android/maven2/')) {
          project.logger.lifecycle "Repository ${repo.url} replaced by $ALIYUN_GOOGLE_URL."
          remove repo
        }
        if (url.startsWith('https://plugins.gradle.org/m2/')) {
          project.logger.lifecycle "Repository ${repo.url} replaced by $ALIYUN_GRADLE_PLUGIN_URL."
          remove repo
        }
      }
    }
    maven { url ALIYUN_REPOSITORY_URL }
    maven { url ALIYUN_JCENTER_URL }
    maven { url ALIYUN_GOOGLE_URL }
    maven { url ALIYUN_GRADLE_PLUGIN_URL }
  }
}

这个脚本定义了一个钩子,当需要拉取依赖的时候,通过 URL 关键字删掉源站仓库,然后新建镜像站的仓库。

Gradle 每次拉取依赖都会触发这个钩子,最后只能拿到镜像站的仓库。

附录 & 技巧

  • ~/.gradle 为缓存的依赖和配置目录,当存储紧张时,可以删掉 ~/.gradle 里面除了配置(init.gradle等)以外的所有文件以释放空间。

  • gradle.properties 也能配置额外的功能,如限制内存,禁用后台驻留。

    # 限制最大内存 1600MB
    org.gradle.jvmargs=-Xmx1600m
    # 禁用后台驻留,禁用后 Gradle 每次执行完都会释放内存
    org.gradle.daemon=false
    

引用

Where is Gradle folder in Windows

Gradle全局配置国内镜像