Gradle 缓存目录结构 缓存策略

[TOC]

gradle 缓存策略

Gradle 的缓存策略中,对于 SNAPSHOT 版本默认的缓存周期是 24 小时,也就是从我上次更新之后,24小时内都会使用上次的缓存

Gradle 对于动态版本和变化模块的缓存时间默认是 24 小时。

动态版本 是什么
你见过的像 3.+ 这种就是动态版本,它会取检查到的最高的版本号。又比如 latest.integration,它也是动态版本
而变化模块
就是像 0.2-SNAPSHOT 这种后面带 SNAPSHOT 的快照版本,不是动态版本,不会更新
这两者的区别就是

  • xxx+ 尽管你代码中的版本号写法不变但实际上它仍然是去取仓库的最新版本
  • latest.integration它在仓库中的版本号还是一样,仍然是 xxx-SNAPSHOT,但实际上这个版本所对应的内容已经变了
  • 配置动态版本,会导致额外的构建查询时间,具体可以输出构建性能报告,自行比较

Gradle 缓存周期修改

  • 执行型
./gradlew aD --refresh-dependencies
  • 配置型
configurations.all {
    // 动态版本
    resolutionStrategy.cacheDynamicVersionsFor 10, 'minutes'
    // 变化模块
    resolutionStrategy.cacheChangingModulesFor 10, 'minutes'
}

https://discuss.gradle.org/t/refresh-dependencies-should-use-cachechangingmodulesfor-0s/556

gradle 缓存目录

.gradle目录

目录 描述
caches gradle缓存目录
daemon daemon日志目录
native gradle平台相关目录
wrapper gradle-wrapper下载目录

caches目录

目录 描述
2.14.1 gradle程序的脚本(gradle程序版本)
3.2.1 gradle程序的脚本(gradle程序版本)
jars-1 未知
jars-2 未知
modules-2 下载缓存目录

caches/modules-2 目录

目录 描述
files-2.1 gradle下载的jar目录
metadata-2.16 gradle-2.14.1的描述文件 (不确定)
metadata-2.23 gradle-3.2.1的描述文件 (不确定)

files-2.1的目录组织

${org}/${package}/${version}/${shanum1}/${package-version}.pom
${org}/${package}/${version}/${shanum2}/${package-version}.jar
  • 例如
https://jcenter.bintray.com/com/android/tools/lint/lint-api/25.1.3/lint-api-25.1.3.jar
对应的目录为
.gradle/caches/modules-2/files-2.1/com.android.tools.lint/lint-api/25.1.3/${shasum1}/lint-api-25.1.3.jar

daemon目录

不必要依赖离线

用于存放gradle daemon的运行日志 按gradle程序版本存放

目录 描述
2.14.1 gradle-2.14.1运行的日志
3.2.1 gradle-3.2.1运行的日志

native目录

不必要依赖离线

用于存放平台相关(Win/Linux/Mac)的库

目录 描述
19 gradle-2.14.1对应的lib目录,按平台存放,如osx-amd64
21 gradle-3.2.1对应的lib目录,按平台存放,如osx-amd64
jansi 未知

wrapper 目录

用于存放 gradle-wrapper 下载 `gradle的zip包和解压后的文件夹

  • wrapper的目录规则
wrapper/dists/gradle-2.14.1-all/base36/gradle-2.14.1-all.zip
wrapper/dists/gradle-2.14.1-all/base36/gradle-2.14.1-all.zip.lck
wrapper/dists/gradle-2.14.1-all/base36/gradle-2.14.1-all.zip.ok

其中base36的规则

  • 从gradle/wrapper/gradle-wrapper.properties中得到distributionUrl

https://services.gradle.org/distributions/gradle-2.14.1-all.zip,注意文件中的\不算

  • 对distributionUrl计算md5

例如printf "https://services.gradle.org/distributions/gradle-2.14.1-all.zip" | md5
得到 8c9a3200746e2de49722587c1108fe87

  • 利用0x8c9a3200746e2de49722587c1108fe87构造一个uint 128位整数

  • 将整数利用base36得到base36的值(取小写)

import java.math.BigInteger;
import java.security.MessageDigest;

public class Hash {

    public static void main(String[] args) {
        try {
            MessageDigest messageDigest = MessageDigest.getInstance("MD5");
            byte[] bytes = args[0].getBytes();
            messageDigest.update(bytes);
            String str = new BigInteger(1, messageDigest.digest()).toString(36);
            System.out.println(str);
        } catch (Exception e) {
            throw new RuntimeException("Could not hash input string.", e);
        }
    }
}

代码见 https://github.com/xiaoyur347/gradlew/blob/f3c8a48e2fc9ce560a1302fd33a8768bae269a1c/helper/Hash.java#L4

Error fix

IDEA 代码提示不更新

rm -rf ./.idea/libraries/*.xml
# then run IDEA `Sync with File System`

注意这个方法可能失效,你需要自行理解缓存加载,和IDE缓存加载的区别

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Gradle是一款非常优秀的构建系统工具,它的DSL基于Groovy实现,可以让你很方便的通过代码控制这些DSL来...
    飞雪无情flysnow_org阅读 3,550评论 0 35
  • https://www.jianshu.com/p/7c288a17cda8 总的来说,Android的系统体系结...
    燕京博士阅读 1,234评论 0 6
  • 是什么? 在语法上是基于Groovy语言的(Groovy 是一种基于JVM的敏捷开发语言,可以简单的理解为强类型语...
    千山万水迷了鹿阅读 99,680评论 4 122
  • 说明 本文主要介绍和Gradle关系密切、相对不容易理解的配置,偏重概念介绍。部分内容是Android特有的(例如...
    jzj1993阅读 15,717评论 1 62
  • 这个计算与投资课程其实是为有计算机编程背景的同学提供的,课程中提到要学员自己设计一个市场模拟器,测试股票数据走势,...
    摩西少年时阅读 319评论 0 1