文章目錄
- 前言
- 解決方案
- gradle
- maven 倉庫
前言
我們在Android 開發的過程中,經常會遇到三方依賴下載不下來的問題。一般情況下我們會在項目的build.gradle
文件中配置多個 maven 倉庫來解決。
// 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
文件夾,然后在文件中寫入如下內容
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
中判斷一下版本
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 RepositoryHandlerrepos.enableMirror()println("Gradle ${gradle.gradleVersion} DependencyResolutionManagement Configured $settings")} else {println("Gradle ${gradle.gradleVersion} DependencyResolutionManagement Ignored $settings")}
}
一般來講,我們在build.gradle
文件中配置的倉庫,它們的地址對應的就是上面urlMappings
中的key,我們將這些倉庫地址全部替換為騰訊鏡像就可以了
repositories {mavenCentral()//https://repo.maven.apache.org/maven2google()//https://dl.google.com/dl/android/maven2gradlePluginPortal()//https://plugins.gradle.org/m2
}
這么做的好處是只需要配置這一個文件,在本機上所有的gradle
項目都會有效果。不需要每個項目都去配置,并且只影響本地環境,不會對其他機器造成影響。
方法來源于霍老師的視頻