为什么同一版本的gradle有多个副本

ali*_*dro 5 android gradle gradlew android-gradle-plugin

我有一个android studio项目,文件gradle/wrapper/gradle-wrapper.properties配置如下.

#Wed Apr 10 15:27:10 PDT 2013
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-2.2.1-all.zip
Run Code Online (Sandbox Code Playgroud)

2.2.1-all在我的主目录中安装了该版本.

.gradle/wrapper/dists/gradle-2.2.1-all/c64ydeuardnfqctvr1gm30w53/gradle-2.2.1-all.zip
Run Code Online (Sandbox Code Playgroud)

当我调用./gradlew命令来构建项目时.我应该使用gradle-2.2.1-all.zip构建.

但它没有,它将下载另一个gradle,即使是相同的版本.因此,版本有两个等级2.2.1-all.因为我的互联网连接非常慢,所以需要很长时间.

.gradle/wrapper/dists/gradle-2.2.1-all/c64ydeuardnfqctvr1gm30w53/gradle-2.2.1-all.zip
.gradle/wrapper/dists/gradle-2.2.1-all/6dibv5rcnnqlfbq9klf8imrndn/gradle-2.2.1-all.zip
Run Code Online (Sandbox Code Playgroud)

这是非常烦人的,因为它必须在我调用命令来构建我的项目时下载同一版本的新版本.

为什么gradle构建系统无法选择已安装的系统?

ali*_*dro 7

发生的问题是因为下载URL的哈希策略在工作室gradle-wrapper.jar和最新版本之间是不同的gradle-wrapper.jar.

gradle-wrapper.jar我的Android应用程序目录下(我想这是从复制android-sdk-macosx/tools/templates/gradle/wrapper/gradle/wrapper/gradle-wrapper.jar)使用下面的方法来计算哈希值的下载网址.

// 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

但最新gradle-wrapper.jar使用以下方法来做.基数从32变为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);
    }
}
Run Code Online (Sandbox Code Playgroud)

我在目录名称中找到的魔术字符串是下载URL的md5哈希字符串.

对于版本2.10,有一个目录名称

.gradle/wrapper/dists/gradle-2.10-all/a4w5fzrkeut1ox71xslb49gst

a4w5fzrkeut1ox71xslb49gst从下载网址中删除.

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();
}
Run Code Online (Sandbox Code Playgroud)

通过gradle-wrapper.jar对相同的下载URL 使用相同的哈希方法(使用相同的),gradle/wrapper/gradle-wrapper.properties对于相同版本的gradle将不会有多次下载.

这个问题只存在于android studio项目和其他gradle项目之间.