[TOC]
gradle 緩存策略
Gradle 的緩存策略中,對于 SNAPSHOT 版本默認(rèn)的緩存周期是 24 小時(shí)
妓湘,也就是從我上次更新之后,24小時(shí)內(nèi)都會使用上次的緩存
Gradle 對于動態(tài)版本和變化模塊的緩存時(shí)間默認(rèn)是 24 小時(shí)乌询。
動態(tài)版本 是什么
你見過的像 3.+
這種就是動態(tài)版本榜贴,它會取檢查到的最高的版本號。又比如 latest.integration
妹田,它也是動態(tài)版本
而變化模塊
就是像 0.2-SNAPSHOT
這種后面帶 SNAPSHOT 的快照版本唬党,不是動態(tài)版本,不會更新
這兩者的區(qū)別就是
-
xxx+
盡管你代碼中的版本號寫法不變但實(shí)際上它仍然是去取倉庫的最新版本 - 而
latest.integration
它在倉庫中的版本號還是一樣鬼佣,仍然是 xxx-SNAPSHOT驶拱,但實(shí)際上這個(gè)版本所對應(yīng)的內(nèi)容已經(jīng)變了 - 配置動態(tài)版本,會導(dǎo)致額外的構(gòu)建查詢時(shí)間晶衷,具體可以輸出構(gòu)建性能報(bào)告蓝纲,自行比較
Gradle 緩存周期修改
- 執(zhí)行型
./gradlew aD --refresh-dependencies
- 配置型
configurations.all {
// 動態(tài)版本
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平臺相關(guān)目錄 |
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
對應(yīng)的目錄為
.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的運(yùn)行日志 按gradle程序版本存放
目錄 | 描述 |
---|---|
2.14.1 | gradle-2.14.1運(yùn)行的日志 |
3.2.1 | gradle-3.2.1運(yùn)行的日志 |
native目錄
不必要依賴離線
用于存放平臺相關(guān)(Win/Linux/Mac)的庫
目錄 | 描述 |
---|---|
19 | gradle-2.14.1對應(yīng)的lib目錄,按平臺存放晌纫,如osx-amd64 |
21 | gradle-3.2.1對應(yīng)的lib目錄税迷,按平臺存放,如osx-amd64 |
jansi | 未知 |
wrapper 目錄
用于存放 gradle-wrapper
下載 `gradle的zip包和解壓后的文件夾
- wrapper的目錄規(guī)則
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的規(guī)則
- 從gradle/wrapper/gradle-wrapper.properties中得到distributionUrl
即 https://services.gradle.org/distributions/gradle-2.14.1-all.zip锹漱,注意文件中的\不算
- 對distributionUrl計(jì)算md5
例如printf "https://services.gradle.org/distributions/gradle-2.14.1-all.zip" | md5
得到 8c9a3200746e2de49722587c1108fe87
利用0x8c9a3200746e2de49722587c1108fe87構(gòu)造一個(gè)uint 128位整數(shù)
將整數(shù)利用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);
}
}
}
Error fix
IDEA 代碼提示不更新
rm -rf ./.idea/libraries/*.xml
# then run IDEA `Sync with File System`
注意這個(gè)方法可能失效箭养,你需要自行理解緩存加載,和IDE緩存加載的區(qū)別