文章目录
前言
我们在Android 开发的过程中,经常会遇到三方依赖下载不下来的问题。一般情况下我们会在项目的build.gradle
文件中配置多个 maven 仓库来解决。
kotlin
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
repositories {
maven { url 'https://maven.aliyun.com/repository/google' }
maven { url 'https://maven.aliyun.com/repository/jcenter' }
maven { url 'https://maven.aliyun.com/nexus/content/groups/public' }
google()
mavenCentral()
maven { url 'https://jitpack.io' }
}
}
allprojects {
repositories {
maven { url 'https://maven.aliyun.com/repository/google' }
maven { url 'https://maven.aliyun.com/repository/jcenter' }
maven { url 'https://maven.aliyun.com/nexus/content/groups/public' }
google()
mavenCentral()
maven { url 'https://jitpack.io' }
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
但有时候发现虽然我们配置了其他 maven 仓库,下载的时候还是会提示下载超时。看日志也会发现并没有从我们配置的仓库中下载。
解决方案
如果是在公司,我们可以在公司服务器上搭建自己的 maven 仓库,把项目中maven 仓库地址配置为自己公司的私有仓库,下载依赖包时从公司仓库下载,如果公司仓库没有缓存这个包,就由公司仓库从远程仓库中下载。这样只要下载成功一次,我们就可以一直使用。并且还避免了上游仓库下架该依赖时我们无法使用的问题。
但如果我们是在其他情况下没有办法使用公司仓库应该怎么整?
gradle
当我们想要升级 gradle 版本的时候,会修改项目工程中的 gradle/wrapper/gradle-wrapper.properties
文件中的distributionUrl
字段的值。这个值就是我们下载gradle
的地址,默认地址比如https\://services.gradle.org/distributions/gradle-7.5-all.zip
下载的很慢很慢很慢,我们可以修改为国内镜像地址,我使用的是腾讯镜像:distributionUrl=https\://mirrors.cloud.tencent.com/gradle/gradle-7.5-all.zip
。修改完之后,从新sync 以下,享受飞一般的下载速度
maven 仓库
我们可以创建一个init.gradle.kts
文件放在gradle的缓存文件夹中,这个文件夹一般是user/xxx/.gradle
文件夹,然后在文件中写入如下内容
kotlin
fun RepositoryHandler.enableMirror() {
all {
if (this is MavenArtifactRepository) {
val originalUrl = this.url.toString().removeSuffix("/")
urlMappings[originalUrl]?.let {
logger.lifecycle("Repository[$url] is mirrored to $it")
this.setUrl(it)
}
}
}
}
val urlMappings = mapOf(
"https://repo.maven.apache.org/maven2" to "https://mirrors.tencent.com/nexus/repository/maven-public/",
"https://dl.google.com/dl/android/maven2" to "https://mirrors.tencent.com/nexus/repository/maven-public/",
"https://plugins.gradle.org/m2" to "https://mirrors.tencent.com/nexus/repository/gradle-plugins/"
)
gradle.allprojects {
buildscript {
repositories.enableMirror()
}
repositories.enableMirror()
}
gradle.beforeSettings {
pluginManagement.repositories.enableMirror()
dependencyResolutionManagement.repositories.enableMirror()
}
这里有一点需要注意,Gradle 低于6.8 没有 dependencyResolutionManagement 相关的 API,旧项目有兼容问题。
我们可以把gradle.beforeSettings
闭包中相关代码注释掉,应该没啥影响。
当然也可以在 gradle.beforeSettings
中判断一下版本
kotlin
gradle.beforeSettings {
pluginManagement.repositories.enableMirror()
// 6.8 及更高版本执行 DependencyResolutionManagement 配置
if (gradle.gradleVersion >= "6.8") {
val getDrm = settings.javaClass.getDeclaredMethod("getDependencyResolutionManagement")
val drm = getDrm.invoke(settings)
val getRepos = drm.javaClass.getDeclaredMethod("getRepositories")
val repos = getRepos.invoke(drm) as RepositoryHandler
repos.enableMirror()
println("Gradle ${gradle.gradleVersion} DependencyResolutionManagement Configured $settings")
} else {
println("Gradle ${gradle.gradleVersion} DependencyResolutionManagement Ignored $settings")
}
}
一般来讲,我们在build.gradle
文件中配置的仓库,它们的地址对应的就是上面urlMappings
中的key,我们将这些仓库地址全部替换为腾讯镜像就可以了
kotlin
repositories {
mavenCentral()//https://repo.maven.apache.org/maven2
google()//https://dl.google.com/dl/android/maven2
gradlePluginPortal()//https://plugins.gradle.org/m2
}
这么做的好处是只需要配置这一个文件,在本机上所有的gradle
项目都会有效果。不需要每个项目都去配置,并且只影响本地环境,不会对其他机器造成影响。
方法来源于霍老师的视频