The problem occurred is because the hash policy for the download url is different between studio's gradle-wrapper.jar
and latest gradle-wrapper.jar
.
The gradle-wrapper.jar
under my Android app directory (I guess it's copied from android-sdk-macosx/tools/templates/gradle/wrapper/gradle/wrapper/gradle-wrapper.jar
) use the following method to calculate hash for the download url.
// PathAssembler.java
private String getMd5Hash(String string) {
try {
MessageDigest e = MessageDigest.getInstance("MD5");
byte[] bytes = string.getBytes();
e.update(bytes);
return (new BigInteger(1, e.digest())).toString(32);
} catch (Exception var4) {
throw new RuntimeException("Could not hash input string.", var4);
}
}
But the latest gradle-wrapper.jar
use the following method to do. The radix change from 32
to 36
.
private String getHash(String string) {
try {
MessageDigest messageDigest = MessageDigest.getInstance("MD5");
byte[] bytes = string.getBytes();
messageDigest.update(bytes);
return new BigInteger(1, messageDigest.digest()).toString(36);
} catch (Exception e) {
throw new RuntimeException("Could not hash input string.", e);
}
}
The magic string I found in the directory name is the md5 hash string of the download url.
For version 2.10, there is a directory name
.gradle/wrapper/dists/gradle-2.10-all/a4w5fzrkeut1ox71xslb49gst
And the a4w5fzrkeut1ox71xslb49gst
is hashed from the download url.
try {
MessageDigest messageDigest = MessageDigest.getInstance("MD5");
messageDigest.update("https://services.gradle.org/distributions/gradle-2.10-all.zip".getBytes());
System.out.println(new BigInteger(1, messageDigest.digest()).toString(36));
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
By using the same hash method (use the same gradle-wrapper.jar
) for the same download url from gradle/wrapper/gradle-wrapper.properties
, there won't be multiple downloads for the same version of gradle.
This issue only exist between android studio project and other gradle project.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…