【问题标题】:Why there are multiple copies for the same version of gradle为什么同一个版本的gradle会有多个副本
【发布时间】:2015-08-17 11:37:45
【问题描述】:

我有一个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。因为我的网络连接很慢,所以需要很长时间。

.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 构建系统无法选择已安装的系统?

【问题讨论】:

标签: android gradle android-gradle-plugin gradlew


【解决方案1】:

出现问题是因为s​​tudio的gradle-wrapper.jar和最新的gradle-wrapper.jar的下载url哈希策略不同。

我的Android应用目录下的gradle-wrapper.jar(我猜是从android-sdk-macosx/tools/templates/gradle/wrapper/gradle/wrapper/gradle-wrapper.jar复制的)使用以下方法计算下载url的hash。

// 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 是从下载 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();
}

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

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

【讨论】:

    【解决方案2】:

    【讨论】:

    • 这不是问题的答案。请考虑写一个自己的问题,或对问题发表评论。
    【解决方案3】:

    看到同样的问题并尝试了。看起来 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 应用目录复制到您的项目即可。

    【讨论】:

      猜你喜欢
      • 2021-06-14
      • 2017-06-30
      • 1970-01-01
      • 1970-01-01
      • 2016-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多