如何清除Gradle缓存?

647

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

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

在我的项目文件夹中还有一个.gradle文件夹......其中一个taskArtifacts大小为200MB。我不敢随意删除它们。这些文件夹的哪些部分是安全的可以删除的?

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

我还需要清除intellij缓存吗?


6
后来我发现编译需要45分钟是因为我更改了“编译器->Gradle”的设置,不使用“内部构建”。这与缓存无关。 - David T.
没有任何答案有帮助。结果发现一些图像已经损坏了。在Windows资源管理器中打开这些图像可以快速显示哪些图像已经损坏(即无法加载预览的图像)。替换这些图像,问题迎刃而解! - Bimde
@david-t,你能指出这个选项在哪里吗?我的版本是 3.3.1 ,但在 首选项 - 构建、执行、部署 下找不到它。 - Leo
6
./gradlew clean build --no-build-cache的意思是强制进行项目构建,而不使用构建缓存。 - ams
16个回答

693

Gradle缓存位于

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

您可以浏览到这些目录并手动删除它,或者运行

rm -r $HOME/.gradle/caches/

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


更新

清除当前项目的Android构建缓存

注意:Android Studio中的文件 > 无效缓存/重启不会清除Android构建缓存,因此您需要单独清除它。

在Windows操作系统上:

gradlew cleanBuildCache

在Mac或UNIX上:

./gradlew cleanBuildCache

更新2

这篇文章“让你的Android Studio变得更轻盈”提供了有关Android Studio缓存的更多详细信息。


36
这并没有清除Maven依赖项的缓存。我从Maven仓库中删除了该库,并使Android Studio的缓存无效,但项目仍然可以构建。这意味着Gradle缓存中的Maven依赖项没有被清除。 - mattm
4
您所描述的方法只会清除主项目及其项目依赖的缓存,但不会影响库依赖项。您描述了如何清除Android Studio的缓存,但未涉及Gradle的缓存清理。 - Leandroid
它在最新版本的Android Studio上仍然能够良好运行。 - Jeff Bootsholz
5
你可能不想清空整个缓存目录,只需清空构建缓存。使用 rm -rf ~/.gradle/caches/build-cache-1 即可。如果需要让 Gradle 重新下载依赖项,请在构建时加上 --refresh-dependencies 参数。 - TrevJonez
4
如果你想要清除并清理缓存,运行以下两个任务:gradlew clean cleanBuildCache - equiman
显示剩余8条评论

419

正如评论中@Bradford20000所指出的,除了全局的Gradle脚本位于$HOME/.gradle下之外,还可能存在gradle.properties文件。在这种情况下,在删除此目录的内容时必须特别注意。

.gradle/caches目录存储了Gradle构建缓存。因此,如果您遇到任何有关构建缓存的错误,可以将其删除。

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

MS Windows上的守护进程 如果您使用的是Windows操作系统,则需要在清空这些目录之前停止守护进程。有关更多信息,请参见Kill all Gradle Daemons Regardless Version?


61
需要注意的一点是,如果您在主目录的.gradle文件夹中有gradle.properties文件,则不应删除整个文件夹。通常,只需删除.gradle/caches即可让Gradle重新下载所有依赖项。 - Bradford2000
3
随着Android Studio的每次更新,Gradle构建似乎变得越来越慢。为什么每当我将应用程序部署到设备上、停止应用程序运行,然后再次部署(完全没有更改任何代码!)时,Android Studio再次需要2分钟来构建并部署它?这真的很疯狂。 - Someone Somewhere
2
在Android Studio中清除系统缓存:选择Android Studio主菜单中的文件|使缓存无效/重新启动,然后选择构建菜单>清理项目。 - Shomu
2
如果你使用的是Windows系统,你需要先关闭Gradle守护进程:https://dev59.com/KVQJ5IYBdhLWcg3wSTx1 - winrid
1
在Windows上使用“--no-build-cache”似乎没有任何作用。 - Mark

124

更新

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

其他说明: 参见此处(包括编辑)。


=== 过时的信息 ===

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

cleanBuildCache

可通过Gradle的Android插件2.3.0版本(2017年2月)及以上版本获得。

依赖项:

  1. Gradle 3.3或更高版本.
  2. 构建工具25.0.0或更高版本.

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

背景

Build cache
存储生成项目时Android插件生成的某些输出(例如未打包的AAR和预处理远程依赖项)。使用缓存时,干净的构建速度要快得多,因为构建系统可以在后续构建过程中直接重用这些缓存文件,而无需重新创建它们。使用Android插件2.3.0及更高版本的项目默认使用构建缓存。要了解更多信息,请阅读使用构建缓存提高构建速度。

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


用法

Windows:

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是特定于系统的文件,包含脚本。请查看相关的系统信息以了解如何执行这些脚本:


119

在使用gradle时要注意守护进程,必须在清除并重新运行gradle之前停止它。

首先停止守护进程:

./gradlew --stop

使用以下方法清除缓存:

rm -rf ~/.gradle/caches/

再次运行您的编译


1
你能解释一下为什么吗或者提供一些相关的文档链接吗? - tir38
6
如果您的Gradle守护进程正在运行,则会使用Gradle缓存。因此,您的操作系统可能会阻止删除。 - i0x539
经过数小时的奋斗...谢谢伙计。 我真的相信 ./gradlew --stop 这行代码做了一切。 - Itoun
在IDE的项目实例终端中运行这两个命令后,这为我消除了错误。 - Stigma
这是一个救命的信息。如果你错过了这个,很有可能会浪费几个小时来弄清楚到底发生了什么。 - undefined
显示剩余2条评论

15

Gradle守护进程还会创建许多大型文本文件记录每个构建的日志。这些文件存储在这里:

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

“X.X”是当前使用的gradle版本,例如“7.5”,而“XXXX”只是随机数字,如“1234”。“~”代表您的用户$HOME文件夹。

这些日志文件在短短几个月内就会增长到数百MB大小。无法禁用记录,这些文件不会自动删除,实际上也没有必要保留它们。

但是您可以创建一个小的gradle任务来自动删除它们,并释放大量磁盘空间:

将以下内容添加到您的app/build.gradle中:

android {

    buildTypes {
        ...
    }

    // Delete large build log files from ~/.gradle/daemon/X.X/daemon-XXX.out.log
    // Source 1: https://discuss.gradle.org/t/gradle-daemon-produces-a-lot-of-logs/9905
    // Source 2: https://dev59.com/JGAg5IYBdhLWcg3w7enx
    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()
        }
    }
}

为了查看被删除的文件,您可以启用println()行,然后在Android Studio中查看调试输出 -> 查看 -> 工具窗口 -> 构建。然后按下该窗口上的“切换视图”按钮以显示文本输出。
请注意,Gradle同步或任何Gradle构建都将触发文件删除。
更好的方法是自动将文件移动到垃圾箱/回收站,或者至少先将它们复制到垃圾文件夹中。但我不知道如何做到这一点。

将OSX项目发送到Finder/垃圾桶而不是直接删除,这篇文章似乎有很多好的想法 https://apple.stackexchange.com/questions/50844/how-to-move-files-to-trash-from-command-line - AnneTheAgile

15

我的~/.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

12

这里发布的信息似乎有误。有些人报告如何清除Android构建器缓存(使用任务cleanBuildCache),但他们似乎没有意识到该缓存是独立于Gradle的构建缓存的,据我所知。

我的理解是,Android的缓存早于(并启发)Gradle的缓存,但我可能是错的。无论Android构建器是否将更新为使用Gradle的缓存并退役自己的缓存,我不知道。

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

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

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

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

我执行了cleanBuildCache命令,3.4.2/目录消失了。接下来我进行了另一个clean build操作:

  • 没有任何变化:大多数任务的状态显示为FROM-CACHE,并且构建在启用了缓存的速度下完成。
  • 3.4.2/目录被重新创建。
  • 3.4.2/目录是空的(除了两个隐藏的、零长度的标记文件)。

结论:

  1. Gradle处理所有普通Android构建任务的缓存。
  2. 执行cleanBuildCache不会以任何方式清除或影响构建缓存。
  3. 仍然存在一个Android构建器缓存。这可能是Android构建团队忘记删除的陈旧代码,或者它实际上缓存了某些奇怪的东西,由于某种原因不能或无法转移到使用Gradle缓存。(在我看来,“无法”选项高度不可信。)

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

  • 构建速度变慢了。
  • 所有任务的状态都显示为执行而不是缓存或更新。
  • 3.4.2/目录仍然为空。

更多结论:

  1. 当Gradle缓存无法命中时,没有Android构建器缓存备用方案。
  • 正如我之前所说,针对常见任务,Android构建器缓存确实已被取消。
  • 相关的Android文档包含过时信息。特别地,缓存不会自动启用,需要手动启用Gradle缓存。
  • 编辑3:用户tir38确认了Android构建器缓存已经过时,并已经被取消,在这里找到了证明。tir38也创建了此问题。谢谢!


    你能提供一下你读到的Android构建器缓存已经过时,现在使用Gradle的构建缓存的链接吗? - tir38
    @tir38,不是的。但我在上面更新了自己的测试答案。谢谢。 - Lanchon
    非常感谢您的勤奋研究。您证实了我在测试中看到的大部分内容:1.空的3.4.2/目录。2.存在cleanBuildCache任务。3.禁用Gradle构建缓存并重新构建没有显示任何证据表明Android任务命中了缓存。 - tir38
    2
    再深入探究后,我得到了实际证实:Android 的构建缓存已经整合到 Gradle 中。我在这里提出一个文档请求,希望能删除该页面:https://issuetracker.google.com/issues/148169019 - tir38
    1
    非常全面而深入的回答,非常感谢! - undefined

    3

    适用于Mac或Linux用户:

    清理特定项目/ 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
    

    3

    1
    使用gradle命令在我的项目中无效,我一直收到失败的消息,提示上述命令在我的根项目中不受支持。删除缓存目录中的目录对我有用。 sudo rm -r .gradle/caches/* 我曾试图删除出现在错误报告中的工件,但这为我提供了一个干净的工作空间,并且能够更轻松地缩小我的依赖问题。

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接