maven-metadata.xml 在构建时不断收到请求

maven-metadata.xml keeps getting requested when building

AGP 4.2.2
gradle-6.7.1
arcticfox 2020.3.1    

每次我构建我的 android 项目时,我都会看到这个 maven-metadata.xml 并且它似乎会减慢构建速度并且它似乎只是挂在那里。每次构建可能需要 10 分钟。

有没有办法避免这种情况?

Gradle: Download maven-metadata.xml...

当我 运行 一个命令行时,我看到了这个:

这是我的gradle.properties

org.gradle.jvmargs=-Xmx8g -XX:MaxPermSize=512m -XX:ReservedCodeCacheSize=256m -XX:+UseCompressedOops -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8

org.gradle.daemon=true
org.gradle.parallel=true
org.gradle.caching=true
org.gradle.configureondemand=true

kotlin.coroutines=enable
kotlin.code.style=official
kapt.use.worker.api=true
kapt.incremental.apt=true

android.enableD8.desugaring=true
android.useAndroidX=true
android.enableJetifier=true

我正在使用 build.gradle(app) 中指定的一些 Maven 存储库:

maven { url "https://www.jitpack.io" }
maven { url 'http://......./repo/maven2' }
maven { url "https://....../repositories/snapshots" }
maven { url 'https://....../maven/release' }
maven { url "http://......./bintray.com/maven" }
maven { url "https://....../objectbox/objectbox" }

maven-metadata.xml 文件下载缓慢的原因是您的代理存储库之一的远程速度非常慢。
如果 "metadata max age""not found cache ttl" 设置太低,这个问题会更加复杂。因此它会检查圆圈太快并且每次都从头开始下载。将其调至 12 小时。默认值应该是 30 分钟(1800 秒),这太短了。

要设置 max age,您可以简单地遵循此 site

另一个好article管理Http Cache Headers

这个问题有点不好说,因为没有提供build.gradle。但我假设,原因是任何 -SNAPSHOT 依赖项没有被缓存。针对该依赖项的本地副本构建应该不会一遍又一遍地下载 maven-metadata.xml;或使用 mavenLocal()。针对稳定版本构建也应该会导致缓存。

Gradle通常需要下载一个maven-metadata.xml文件,如果

  1. 您使用 dynamic/changing version 作为您的依赖之一,并且
  2. 依赖缓存中的time to live (TTL)已经结束

对于 (1),您应该在声明的依赖项中查找 1.2.3-SNAPSHOT1.2.+ 之类的版本(或为简单起见,在 ./gradlew dependencies 中查找)。如果你有任何这样的版本,你真的需要它们吗?使用像 1.2.3 这样的固定版本应该会更快。

对于 (2),您是否更改了默认的 TTL 阈值,或者您是否始终使用 --refresh-dependencies 进行构建?如果不是,那么缓慢的发生频率至少不应超过一天一次。

如果以上方法没有帮助,那么可以尝试 运行 使用 --info--info --refresh-dependencies 构建并仔细观察日志输出。这应该显示哪个依赖项 and/or 哪个存储库是罪魁祸首(即,日志记录停留时间最长的那个)。如果你找到这样的罪魁祸首,那么你可以调查

  • 替换依赖项(或存储库),
  • 提高存储库服务器或网络的速度,或者
  • 从有问题的 maven-metadata.xml 文件中删除旧快照版本(如果您控制存储库)。

如果所有这些仍然没有出现可操作的项目,那么也许值得在 Gradle 依赖项缓存中寻找更大的 maven-metadata.xml 文件。也许重复下载如此大的文件是问题所在,之前列表中的方法之一可能会有所帮助。下面是如何找到十大 maven-metadata.xml 文件的方法(使用 Unix shell 命令):

find ~/.gradle/caches/modules-2/resources-* \
        -name maven-metadata.xml \
        -printf '%s\t%p\n' \
    | sort -k1 \
    | tail

Chriki 的回答为我指明了正确的方向,找到了一个简单的解决方案。下载所有依赖项后(在我的例子中,我使用的是 -SNAPSHOT 库,它希望在每个 运行 上更新),你可以在离线模式下设置 Gradle。这将阻止Gradle 下载新的元数据等

在 Android Studio 中,您有一个专用按钮来切换在线模式(见图 Android studio settings).

其他答案很好地说明了为什么会发生这种情况。尤其是在使用 -SNAPSHOT 依赖的时候,如果实在没办法,我给你一个小窍门,希望对你有很大帮助。

是使用离线模式

当通过 CLI 运行 时,执行

./gradlew someTask --ofline

当 运行 通过 IDE 时,启用离线模式。