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

时间:2015-06-03 10:09:34

标签: android gradle android-gradle gradlew

我有一个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

我的主目录中安装了2.2.1-all版本。

.gradle/wrapper/dists/gradle-2.2.1-all/c64ydeuardnfqctvr1gm30w53/gradle-2.2.1-all.zip

当我调用./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

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

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

3 个答案:

答案 0 :(得分:7)

发生问题是因为工作室gradle-wrapper.jar和最新gradle-wrapper.jar下载网址的哈希政策不同。

我的Android应用目录下的gradle-wrapper.jar(我想它是从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);
    }
}

但最新的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);
    }
}

我在目录名中找到的魔术字符串是下载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();
}

对于来自gradle-wrapper.jar的相同下载网址使用相同的哈希方法(使用相同的gradle/wrapper/gradle-wrapper.properties),同一版本的gradle将不会有多次下载。

此问题仅存在于android studio项目和其他gradle项目之间。

答案 1 :(得分:1)

答案 2 :(得分:0)

看到相同的问题并尝试。看起来Android Studio并非在项目中使用grale/wrapper/gradle-wrapper.jar构建,而是在其内部(在macOS中为Android Studio.app/Contents/plugins/android/lib/templates/gradle/wrapper/gradle/wrapper/gradle-wrapper.jar)构建。

如@alijandro所述,如果您两个项目中的gradle-wrapper.jar使用的哈希策略不同或与Android Studio应用程序不同,则会导致您看到的问题。

要摆脱这种情况,只需将gradle-wrapper.jar从Android Studio应用目录复制到您的项目中,就可以了。