如何清除gradle缓存?

Posted

技术标签:

【中文标题】如何清除gradle缓存?【英文标题】:How to clear gradle cache? 【发布时间】:2014-05-26 08:48:36 【问题描述】:

我正在尝试使用 android Studio,第一次启动它时,编译需要大约 45 分钟...如果我不退出应用程序,没关系 - 每次后续编译/运行应用大约需要 45 秒。

我尝试检查我的一些缓存:我的主目录中有一个 .gradle/caches 文件夹,它包含 123 MB。

我的项目文件夹中还有一个 .gradle 文件夹...其中一个 taskArtifacts 大约是 200 MB。我害怕只是随意地对他们俩进行核弹。文件夹的哪些部分可以安全删除?

对于为什么我的 Android Studio 在第一次加载应用程序时运行 gradle assemble 任务需要很长时间,是否有更好的解释?

我是否也必须清除 intellij 缓存?

【问题讨论】:

后来我发现编译需要 45 分钟是因为我将 Compiler -> Gradle 的设置更改为不是 Use in-process build。与缓存无关 所有答案都没有帮助。原来有些图像已损坏。在 Windows 资源管理器中打开图像会快速显示哪些图像已损坏(未加载预览的图像)。替换了那些图片,瞧! @david-t 你能指出这个选项的下落吗?我有版本 3.3.1 但在 Preferences - Build, Execution, Deployment 下找不到它 ./gradlew clean build --no-build-cache 将在不使用构建缓存的情况下强制构建项目。 【参考方案1】:

正如@Bradford20000 在 cmets 中指出的那样,$HOME/.gradle 下可能有一个 gradle.properties 文件以及全局 gradle 脚本。在这种情况下,删除该目录的内容时必须特别注意。

.gradle/caches 目录包含 Gradle 构建缓存。所以如果你对构建缓存有任何错误,你可以删除它。

--no-build-cache 选项将在没有构建缓存的情况下运行 gradle。

MS Windows 上的守护进程 如果您使用的是 Windows,则需要先杀死守护程序,然后它才能清除这些目录。请参阅Kill all Gradle Daemons Regardless Version? 了解更多信息。

【讨论】:

需要注意的一点是,如果您的主目录中的 .gradle 文件夹中有一个 gradle.properties 文件,您将不想删除整个文件夹。通常,只需删除 .gradle/caches 就足以让 Gradle 重新下载所有依赖项。 随着 Android Studio 的每次更新,gradle 构建似乎变得越来越慢。为什么当我部署到设备时,停止应用程序运行,然后再次部署(根本不接触任何代码!)Android Studio 再次需要 2 分钟来构建和部署它。真是个疯子。 在Android Studio上清理系统缓存:Android stdio主菜单,选择File |使缓存/重新启动无效。并构建菜单>清理项目 如果你在 Windows 上,你需要先杀死守护进程:***.com/questions/54189630/… --no-build-cache on windows 似乎什么都不做【参考方案2】:

Gradle缓存位于

在 Windows 上:%USERPROFILE%\.gradle\caches 在 Mac / UNIX 上:~/.gradle/caches/

您可以浏览到这些目录并手动将其删除或运行

rm -r $HOME/.gradle/caches/

在 UNIX 系统上。运行此命令也会强制下载依赖。


更新

Clear the Android build cache of current project

注意:Android Studio 的 File > Invalidate Caches / Restart 不会清除 Android 构建缓存,因此您必须单独清理它。

在 Windows 上:

gradlew cleanBuildCache

在 Mac 或 UNIX 上:

./gradlew cleanBuildCache

更新 2

这篇文章Put your Android Studio on a diet 提供了有关 Android Studio 缓存的更多详细信息

【讨论】:

这并没有清除 maven 依赖项的缓存。我从 maven 存储库中删除了该库并使 Android Studio 缓存无效,但该项目仍在构建。这意味着 maven 依赖项的 gradle 缓存没有被清除。 您描述的方式只会从主项目及其项目依赖项中清除缓存,但库依赖项是完整的。您描述了如何清理 AndroidStudio 的缓存,而不是 gradle 的缓存。 是的,但在我加载项目之前,这不会出现在 Mac 上。 您可能不想转储整个缓存目录,只转储构建缓存。请改用rm -rf ~/.gradle/caches/build-cache-1。如果您需要 gradle 重新下载依赖项,请使用 --refresh-dependencies 调用构建 如果你想要干净的缓存,运行两个任务:gradlew clean cleanBuildCache【参考方案3】:

更新

cleanBuildCache 不再有效。

Android Gradle 插件现在利用 Gradle 缓存功能https://guides.gradle.org/using-build-cache/

清除缓存

清理缓存目录以避免以前版本的任何命中

 rm -rf $GRADLE_HOME/caches/build-cache-*

https://guides.gradle.org/using-build-cache/#caching_android_projects

其他题外话:见here(包括编辑)。


=== 过时信息 ===

使用 Gradle 任务的最新解决方案:

cleanBuildCache

可通过适用于 Gradle 的 Android 插件获得,修订版 2.3.0(2017 年 2 月)

依赖关系:

    Gradle 3.3 或更高。 构建工具 25.0.0 或更高版本。

更多信息:https://developer.android.com/studio/build/build-cache.html#clear_the_build_cache

背景

构建缓存 存储 Android 插件在构建项目时生成的某些输出(例如未打包的 AAR 和预索引的远程依赖项)。使用缓存时,您的干净构建要快得多,因为构建系统可以在后续构建期间简单地重用这些缓存文件,而不是重新创建它们。使用 Android 插件 2.3.0 及更高版本的项目默认使用构建缓存。要了解更多信息,请阅读使用构建缓存提高构建速度。

注意:如果禁用构建缓存,则 cleanBuildCache 任务不可用。

用法

窗户:

gradlew cleanBuildCache

Linux / Mac:

gradle cleanBuildCache

Android Studio / IntelliJ:

gradle tab (default on right) select and run the task or add it via the configuration window 

注意:gradle / gradlew 是包含脚本的系统特定文件。如何执行脚本请查看相关系统信息:

Linux Windows Mac

【讨论】:

【参考方案4】:

gradle 守护进程还会为每个构建日志创建许多大文本文件。它们存储在这里:

~/.gradle/daemon/X.X/daemon-XXXX.out.log

“X.X”是使用的gradle版本,如“4.4”,“XXXX”只是随机数,如“1234”。

总大小可以在短短几个月内增长到数百 MB。没有办法禁用日志记录,文件不会自动删除,也不需要保留。

但是您可以创建一个small gradle task to automatically delete them,并释放大量磁盘空间:

将此添加到您的 app/build.gradle

android 

    buildTypes 
        ...
    

    // Delete large build log files from ~/.gradle/daemon/X.X/daemon-XXX.out.log
    // Source: https://discuss.gradle.org/t/gradle-daemon-produces-a-lot-of-logs/9905
    def gradle = project.getGradle()
    new File("$gradle.getGradleUserHomeDir().getAbsolutePath()/daemon/$gradle.getGradleVersion()").listFiles().each 
        if (it.getName().endsWith('.out.log')) 
            // println("Deleting gradle log file: $it") // Optional debug output
            it.delete()
        
    

要查看哪些文件正在被删除,您可以在 Android Studio -> View -> Tool Windows -> Build 中查看调试输出。然后按该窗口上的“切换视图”按钮以显示文本输出。

请注意,Gradle Sync 或任何 Gradle Build 都会触发文件删除。

更好的方法是自动将文件移动到垃圾箱/回收站,或者至少先将它们复制到垃圾箱文件夹。但我不知道该怎么做。

【讨论】:

将OSX项目发送到finder/trash而不是直接删除,这个帖子似乎有很多好主意apple.stackexchange.com/questions/50844/…【参考方案5】:

命令:rm -rf ~/.gradle/caches/

【讨论】:

【参考方案6】:

小心 gradle 守护进程,你必须在清除并重新运行 gradle 之前停止它。

停止第一个守护进程:

./gradlew --stop

清理缓存使用:

rm -rf ~/.gradle/caches/

再次运行你的编译

【讨论】:

您能解释一下原因或链接到有关此的一些文档吗? 如果你的 gradle 守护进程正在运行,你的 gradle 缓存将被使用。因此,您的操作系统可能会阻止删除。 经过数小时的奋斗……谢谢队友。我真的相信./gradlew --stop 这条线做了一切。 这消除了我在 IDE 项目的终端实例中运行这两个命令后的错误【参考方案7】:

这里似乎发布了不正确的信息。有些人报告了如何清除 Android 构建器缓存(使用任务 cleanBuildCache),但似乎没有意识到所述缓存独立于 Gradle 的构建缓存 AFAIK。

我的理解是,Android 的缓存早于(并受到启发)Gradle,但我可能是错的。 Android builder 是否会/被更新为使用 Gradle 的缓存并退出它自己的缓存,我不知道。

编辑:Android builder 缓存已过时并已被淘汰。 Android Gradle 插件现在改用 Gradle 的构建缓存。要控制此缓存,您现在必须与 Gradle 的通用缓存基础架构进行交互。

提示:在线搜索 Gradle 的缓存帮助,不要提及关键字“android”,以获取当前相关缓存的帮助。

编辑 2: 由于 tir38 在下面的评论中提出问题,我正在使用 Android Gradle 插件 v3.4.2 项目进行测试。 gradle 缓存由org.gradle.caching=truegradle.properties 中启用。我做了几个clean build,第二次大多数任务显示FROM-CACHE作为它们的状态,表明缓存正在工作。

令人惊讶的是,我有一个 cleanBuildCache gradle 任务和一个 <user-home>/.android/build-cache/3.4.2/ 目录,两者都暗示了 Android builder 缓存的存在。

我执行cleanBuildCache 并且3.4.2/ 目录消失了。接下来我再做一个clean build:

没有任何变化:大多数任务将FROM-CACHE 显示为它们的状态,并且构建以启用缓存的速度完成。 3.4.2/ 目录已重新创建。 3.4.2/ 目录为空(保存 2 个隐藏的零长度标记文件)。

结论:

    所有普通 Android 构建器任务的缓存均由 Gradle 处理。 执行cleanBuildCache 不会以任何方式清除或影响构建缓存。 那里仍然有一个 Android 构建器缓存。这可能是 Android 构建团队忘记删除的残留代码,或者它实际上可能缓存了一些奇怪的东西,无论出于何种原因,这些东西都没有或无法移植到使用 Gradle 缓存。 (恕我直言,“不能”选项是高度可改进的。)

接下来,我通过从gradle.properties 中删除org.gradle.caching=true 来禁用Gradle 缓存,然后我尝试了几个clean build

构建速度很慢。 所有任务的状态都显示为正在执行且未缓存或处于最新状态。 3.4.2/ 目录仍然是空的。

更多结论:

    当 Gradle 缓存未能命中时,没有 Android 构建器缓存回退。 Android builder 缓存,至少对于常见任务而言,确实如我之前所述已被淘汰。 相关的android doc 包含过时的信息。特别是缓存默认情况下不启用,如那里所述,Gradle 缓存必须手动启用。

编辑 3:用户 tir38 确认 Android 构建器缓存已过时,并已通过 this find 消除。 tir38 还创建了this issue。谢谢!

【讨论】:

您能否链接到您读到 Android 构建器缓存现已过时并且它现在使用 Gradle 构建缓存的地方? @tir38,不。但我用自己的测试更新了上面的答案。谢谢。 非常感谢您的辛勤研究。您也确认了我在测试中看到的大部分内容:1. 空 3.4.2/ 目录。 2. cleanBuildCache 任务的存在 3. 禁用 gradle 构建缓存和重建没有显示任何 android 任务命中缓存的证据。 再戳一下,我得到了实际确认,android 的构建缓存已经/被滚动到 gradle 的 issuetracker.google.com/issues/37324009#comment3 我打开了一个文档请求以删除该文档页面:issuetracker.google.com/issues/148169019【参考方案8】:

在android studio中打开查看>工具窗口>终端并执行以下命令

在 Windows 上:

gradlew cleanBuildCache

在 Mac 或 Linux 上:

./gradlew cleanBuildCache

如果您想从项目中禁用缓存,请将其添加到 gradle 构建属性中

警告:如果没有缓存,这可能会降低您的 PC 性能,而不是在每次运行应用程序期间消耗相同的时间

android.enableBuildCache=false

【讨论】:

此命令已过时,请查看另一条评论【参考方案9】:

在 android studio 中清除 gradle 缓存:

    打开终端并 运行gradlew clean

【讨论】:

这是不正确的。这不会清除 Gradle 缓存。【参考方案10】:

我的~/.gradle/caches/ 文件夹使用的是 14G。

使用下面的方案后,从14G变成了1.7G。

$ rm -rf ~/.gradle/caches/transforms-*
$ rm -rf ~/.gradle/caches/build-cache-*

奖金

此命令详细显示已使用的缓存空间

$ sudo du -ah --max-depth = 1 ~/.gradle/caches/ | sort -hr

【讨论】:

【参考方案11】:

这篇文章Put your Android Studio on a diet帮了很多建议here

对于那些寻求快速修复的人,请按: File > Invalidate Caches Restart

【讨论】:

【参考方案12】:

清理特定项目/jar 的缓存:

查找与该项目相关的所有缓存文件

find ~/.gradle/caches -name yourproject

上面的命令会返回所有与你的项目相关的缓存文件

rm -rf <each file returned>

需要将缓存文件的路径传递给上述命令。

gradle clean install

终于拉到最新的工件了

更新:

删除缓存的一条线:

for file in `find ~/.gradle/caches -name yourprojectartifactid`; do `rm -rf $file`; done

【讨论】:

以上是关于如何清除gradle缓存?的主要内容,如果未能解决你的问题,请参考以下文章

强制清除 gradle 依赖缓存

强制清除 gradle 依赖缓存

怎样清除Gradle,Maven多余的依赖包等缓存文件

AS强制清除Gradle的缓存

怎样清除Gradle,Maven多余的依赖包等缓存文件

怎样清除Gradle,Maven多余的依赖包等缓存文件