目录​​(?)​​​​[+]​​



gradle-wrapper.properties中各属性的含义

1. gradle-wrapper.properties

​gradle\wrapper​​目录。该目录下有2个文件:​​gradle-wrapper.jar​​和​​gradle-wrapper.properties​​。

其中gradle-wrapper.properties的内容如下:

distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-3.1-bin.zip

注:目前最新的是3.3版。

1.1 distributionUrl

​distributionUrl​​是要下载的gradle的地址,使用哪个版本的gradle,就在这里修改。

gradle的3种版本:

  1. gradle-xx-all.zip是完整版,包含了各种二进制文件,源代码文件,和离线的文档。例如,​​https://services.gradle.org/distributions/gradle-3.1-all.zip​
  2. gradle-xx-bin.zip是二进制版,只包含了二进制文件(可执行文件),没有文档和源代码。例如,​​https://services.gradle.org/distributions/gradle-3.1-bin.zip​
  3. gradle-xx-src.zip是源码版,只包含了Gradle源代码,不能用来编译你的工程。例如,​​https://services.gradle.org/distributions/gradle-3.1-src.zip​

如果只是为了编译,可以不用完整版,只需要二进制版即可,例如,gradle-3.1-bin.zip。

1.2 其他4个属性

​zipStoreBase​​和​​zipStorePath​​组合在一起,是下载的gradle-3.1-bin.zip所存放的位置。 

​zipStorePath​​是​​zipStoreBase​​指定的目录下的子目录。​​distributionBase​​和​​distributionPath​​组合在一起,是解压gradle-3.1-bin.zip之后的文件的存放位置。 

​distributionPath​​是​​distributionBase​​指定的目录下的子目录。

下载位置可以和解压位置不一样。

​zipStoreBase​​和​​distributionBase​​有两种取值:​​GRADLE_USER_HOME​​和​​PROJECT​​。​​GRADLE_USER_HOME​​表示用户目录。 

在windows下是​​%USERPROFILE%/.gradle​​,例如​​C:\Users\<user_name>\.gradle\​​。 

在linux下是​​$HOME/.gradle​​,例如​​~/.gradle​​。​​PROJECT​​表示工程的当前目录,即gradlew所在的目录。

1.3 例1:各项属性的整体含义

例1,gradle-wrapper.properties的内容如下:

distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-3.1-bin.zip

各项属性的整体含义,如下:

​C:\Users\<user_name>\.gradle\wrapper\dists​

  • 目录中。 
    (注:具体还有2级目录,即全路径为

​C:\Users\<user_name>\.gradle\wrapper\dists\gradle-3.1-bin\<url-hash>\​

  • ,gradle-3.1-bin目录是根据下载的gradle的文件名来定的,

​<url-hash>​

  • 目录名是根据distribution url路径字符串计算md5值得来的,具体参考

​PathAssembler.java​

  • 中的

​rootDirName()​

​getHash()​

  • ,PathAssembler.java的位置见本文最后的参考路径)

​C:\Users\<user_name>\.gradle\wrapper\dists​

  • 中。(注:具体还有2级目录,同上)

1.4 搭建gradle测试环境

从任意一个gradle编译的工程中拷贝出gradle相关的文件,如下图: 

注:​​.gradle​​目录是后生成的。

【Android】gradle-wrapper.properties中各属性的含义_Gradle

​./gradlew​​即可。

1.5 例2:zipStoreBase=PROJECT,distributionBase=GRADLE_USER_HOME

例2,gradle-wrapper.properties的内容如下:

distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=PROJECT
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-3.3-bin.zip

​./gradlew​​,log如下:

【Android】gradle-wrapper.properties中各属性的含义_Gradle_02

Downloading https://services.gradle.org/distributions/gradle-3.3-bin.zip
...
...
Unzipping D:\gradle_env\wrapper\dists\gradle-3.3-bin\37bujujhbsnkqrb1fi6n3qirfu\gradle-3.3-bin.zip to C:\Users\galian\.gradle\wrapper\dists\gradle-3.3-bin\37bujujhbsnkqrb1fi6n3qirfu

含义:

​D:\gradle_env\wrapper\dists\gradle-3.3-bin\37bujujhbsnkqrb1fi6n3qirfu\gradle-3.3-bin.zip​

  • 。 
    注意:这里的

​gradle-3.3-bin\37bujujhbsnkqrb1fi6n3qirfu​

  • 就是上面提到的2级目录。

​C:\Users\galian\.gradle \wrapper\dists\gradle-3.3-bin\37bujujhbsnkqrb1fi6n3qirfu​

  •  
    注意:这里的

​gradle-3.3-bin\37bujujhbsnkqrb1fi6n3qirfu​

  • 就是上面提到的2级目录。

1.6 例3:zipStoreBase=PROJECT,distributionBase=PROJECT

把gradle-wrapper.properties中的distributionBase改为PROJECT:

distributionBase=PROJECT
distributionPath=wrapper/dists
zipStoreBase=PROJECT
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-3.3-bin.zip

​./gradlew​​,log如下:

$ ./gradlew

Unzipping D:\gradle_env\wrapper\dists\gradle-3.3-bin\37bujujhbsnkqrb1fi6n3qirfu\gradle-3.3-bin.zip to D:\gradle_env\wrapper\dists\gradle-3.3-bin\37bujujhbsnkqrb1fi6n3qirfu

:help
Welcome to Gradle 3.3.
To run a build, run gradlew <task> ...
To see a list of available tasks, run gradlew tasks
To see a list of command-line options, run gradlew --help
To see more detail about a task, run gradlew help --task <task>
BUILD SUCCESSFUL
Total time: 7.199 secs

含义:

  • (1) 先将下载到zipStoreBase和zipStorePath指定的位置,即gradlew所在目录的wrapper/dists目录下。
  • (2) 解压的位置也是gradlew所在目录中的wrapper/dists目录下。下载位置和解压位置是同一个位置。

注意:执行​​./gradlew​​前,需要将gradle-3.3-bin.zip.lck文件删除,否则会报如下错误:

Exception in thread "main" java.lang.RuntimeException: Gradle distribution 'D:\gradle_env\wrapper\dists\gradle-3.3-bin\37bujujhbsnkqrb1fi6n3qirfu' does not contain any directories. Expected to find exactly 1 directory.
at org.gradle.wrapper.Install.getDistributionRoot(Install.java:84)
at org.gradle.wrapper.Install.access$000(Install.java:29)
at org.gradle.wrapper.Install$1.call(Install.java:51)
at org.gradle.wrapper.Install$1.call(Install.java:47)
at org.gradle.wrapper.ExclusiveFileAccessManager.access(ExclusiveFileAccessManager.java:65)
at org.gradle.wrapper.Install.createDist(Install.java:47)
at org.gradle.wrapper.WrapperExecutor.execute(WrapperExecutor.java:129)
at org.gradle.wrapper.GradleWrapperMain.main(GradleWrapperMain.java:48)

2. 相关代码

gradle-3.3-src\gradle-3.3\subprojects\wrapper\src\main\java\org\gradle\wrapper\PathAssembler.java

/**
* Determines the local locations for the distribution to use given the supplied configuration.
*/
public LocalDistribution getDistribution(WrapperConfiguration configuration) {
String baseName = getDistName(configuration.getDistribution());
// distName是gradle-3.3-bin等,不带后缀
String distName = removeExtension(baseName);
// rootDirName是2级目录
String rootDirName = rootDirName(distName, configuration);
// distDir 是存放zip解压后的文件的目录
File distDir = new File(getBaseDir(configuration.getDistributionBase()), configuration.getDistributionPath() + "/" + rootDirName);
// distZip是存放下载的zip的目录
File distZip = new File(getBaseDir(configuration.getZipBase()), configuration.getZipPath() + "/" + rootDirName + "/" + baseName);
return new LocalDistribution(distDir, distZip);
}

// 获取2级目录:一级是gradle版本,另一级是url的hash值
private String rootDirName(String distName, WrapperConfiguration configuration) {
String urlHash = getHash(configuration.getDistribution().toString());
return distName + "/" + urlHash;
}

/**
* This method computes a hash of the provided {@code string}.
* <p>
* The algorithm in use by this method is as follows:
* <ol>
* <li>Compute the MD5 value of {@code string}.</li>
* <li>Truncate leading zeros (i.e., treat the MD5 value as a number).</li>
* <li>Convert to base 36 (the characters {@code 0-9a-z}).</li>
* </ol>
*/
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);
}
}

3. gradle各版本文件对比

以gradle3.3版本为例。

3.1 gradle-3.3-all.zip 和 gradle-3.3-bin.zip

​src​​、​​docs​​和​​samples​​。

【Android】gradle-wrapper.properties中各属性的含义_java_03

3.2 gradle-3.3-all.zip 和 gradle-3.3-src.zip

​subprojects​​目录与完整版的​​src​​目录基本是一致的。 

src版是编译环境,所以源码目录结构都是gradle工程的结构。 

完整版的​​src​​目录,只是源文件,不能直接拿来编译。

【Android】gradle-wrapper.properties中各属性的含义_Gradle_04

4. 参考


gradle-wrapper.properties中各属性的含义

1. gradle-wrapper.properties

​gradle\wrapper​​目录。该目录下有2个文件:​​gradle-wrapper.jar​​和​​gradle-wrapper.properties​​。

其中gradle-wrapper.properties的内容如下:

distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-3.1-bin.zip

注:目前最新的是3.3版。

1.1 distributionUrl

​distributionUrl​​是要下载的gradle的地址,使用哪个版本的gradle,就在这里修改。

gradle的3种版本:

  1. gradle-xx-all.zip是完整版,包含了各种二进制文件,源代码文件,和离线的文档。例如,​​https://services.gradle.org/distributions/gradle-3.1-all.zip​
  2. gradle-xx-bin.zip是二进制版,只包含了二进制文件(可执行文件),没有文档和源代码。例如,​​https://services.gradle.org/distributions/gradle-3.1-bin.zip​
  3. gradle-xx-src.zip是源码版,只包含了Gradle源代码,不能用来编译你的工程。例如,​​https://services.gradle.org/distributions/gradle-3.1-src.zip​

如果只是为了编译,可以不用完整版,只需要二进制版即可,例如,gradle-3.1-bin.zip。

1.2 其他4个属性

​zipStoreBase​​和​​zipStorePath​​组合在一起,是下载的gradle-3.1-bin.zip所存放的位置。 

​zipStorePath​​是​​zipStoreBase​​指定的目录下的子目录。​​distributionBase​​和​​distributionPath​​组合在一起,是解压gradle-3.1-bin.zip之后的文件的存放位置。 

​distributionPath​​是​​distributionBase​​指定的目录下的子目录。

下载位置可以和解压位置不一样。

​zipStoreBase​​和​​distributionBase​​有两种取值:​​GRADLE_USER_HOME​​和​​PROJECT​​。​​GRADLE_USER_HOME​​表示用户目录。 

在windows下是​​%USERPROFILE%/.gradle​​,例如​​C:\Users\<user_name>\.gradle\​​。 

在linux下是​​$HOME/.gradle​​,例如​​~/.gradle​​。​​PROJECT​​表示工程的当前目录,即gradlew所在的目录。

1.3 例1:各项属性的整体含义

例1,gradle-wrapper.properties的内容如下:

distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-3.1-bin.zip

各项属性的整体含义,如下:

​C:\Users\<user_name>\.gradle\wrapper\dists​

  • 目录中。 
    (注:具体还有2级目录,即全路径为

​C:\Users\<user_name>\.gradle\wrapper\dists\gradle-3.1-bin\<url-hash>\​

  • ,gradle-3.1-bin目录是根据下载的gradle的文件名来定的,

​<url-hash>​

  • 目录名是根据distribution url路径字符串计算md5值得来的,具体参考

​PathAssembler.java​

  • 中的

​rootDirName()​

​getHash()​

  • ,PathAssembler.java的位置见本文最后的参考路径)

​C:\Users\<user_name>\.gradle\wrapper\dists​

  • 中。(注:具体还有2级目录,同上)

1.4 搭建gradle测试环境

从任意一个gradle编译的工程中拷贝出gradle相关的文件,如下图: 

注:​​.gradle​​目录是后生成的。

【Android】gradle-wrapper.properties中各属性的含义_Gradle

​./gradlew​​即可。

1.5 例2:zipStoreBase=PROJECT,distributionBase=GRADLE_USER_HOME

例2,gradle-wrapper.properties的内容如下:

distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=PROJECT
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-3.3-bin.zip

​./gradlew​​,log如下:

【Android】gradle-wrapper.properties中各属性的含义_Gradle_02

Downloading https://services.gradle.org/distributions/gradle-3.3-bin.zip
...
...
Unzipping D:\gradle_env\wrapper\dists\gradle-3.3-bin\37bujujhbsnkqrb1fi6n3qirfu\gradle-3.3-bin.zip to C:\Users\galian\.gradle\wrapper\dists\gradle-3.3-bin\37bujujhbsnkqrb1fi6n3qirfu

含义:

​D:\gradle_env\wrapper\dists\gradle-3.3-bin\37bujujhbsnkqrb1fi6n3qirfu\gradle-3.3-bin.zip​

  • 。 
    注意:这里的

​gradle-3.3-bin\37bujujhbsnkqrb1fi6n3qirfu​

  • 就是上面提到的2级目录。

​C:\Users\galian\.gradle \wrapper\dists\gradle-3.3-bin\37bujujhbsnkqrb1fi6n3qirfu​

  •  
    注意:这里的

​gradle-3.3-bin\37bujujhbsnkqrb1fi6n3qirfu​

  • 就是上面提到的2级目录。

1.6 例3:zipStoreBase=PROJECT,distributionBase=PROJECT

把gradle-wrapper.properties中的distributionBase改为PROJECT:

distributionBase=PROJECT
distributionPath=wrapper/dists
zipStoreBase=PROJECT
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-3.3-bin.zip

​./gradlew​​,log如下:

$ ./gradlew

Unzipping D:\gradle_env\wrapper\dists\gradle-3.3-bin\37bujujhbsnkqrb1fi6n3qirfu\gradle-3.3-bin.zip to D:\gradle_env\wrapper\dists\gradle-3.3-bin\37bujujhbsnkqrb1fi6n3qirfu

:help
Welcome to Gradle 3.3.
To run a build, run gradlew <task> ...
To see a list of available tasks, run gradlew tasks
To see a list of command-line options, run gradlew --help
To see more detail about a task, run gradlew help --task <task>
BUILD SUCCESSFUL
Total time: 7.199 secs

含义:

  • (1) 先将下载到zipStoreBase和zipStorePath指定的位置,即gradlew所在目录的wrapper/dists目录下。
  • (2) 解压的位置也是gradlew所在目录中的wrapper/dists目录下。下载位置和解压位置是同一个位置。

注意:执行​​./gradlew​​前,需要将gradle-3.3-bin.zip.lck文件删除,否则会报如下错误:

Exception in thread "main" java.lang.RuntimeException: Gradle distribution 'D:\gradle_env\wrapper\dists\gradle-3.3-bin\37bujujhbsnkqrb1fi6n3qirfu' does not contain any directories. Expected to find exactly 1 directory.
at org.gradle.wrapper.Install.getDistributionRoot(Install.java:84)
at org.gradle.wrapper.Install.access$000(Install.java:29)
at org.gradle.wrapper.Install$1.call(Install.java:51)
at org.gradle.wrapper.Install$1.call(Install.java:47)
at org.gradle.wrapper.ExclusiveFileAccessManager.access(ExclusiveFileAccessManager.java:65)
at org.gradle.wrapper.Install.createDist(Install.java:47)
at org.gradle.wrapper.WrapperExecutor.execute(WrapperExecutor.java:129)
at org.gradle.wrapper.GradleWrapperMain.main(GradleWrapperMain.java:48)

2. 相关代码

gradle-3.3-src\gradle-3.3\subprojects\wrapper\src\main\java\org\gradle\wrapper\PathAssembler.java

/**
* Determines the local locations for the distribution to use given the supplied configuration.
*/
public LocalDistribution getDistribution(WrapperConfiguration configuration) {
String baseName = getDistName(configuration.getDistribution());
// distName是gradle-3.3-bin等,不带后缀
String distName = removeExtension(baseName);
// rootDirName是2级目录
String rootDirName = rootDirName(distName, configuration);
// distDir 是存放zip解压后的文件的目录
File distDir = new File(getBaseDir(configuration.getDistributionBase()), configuration.getDistributionPath() + "/" + rootDirName);
// distZip是存放下载的zip的目录
File distZip = new File(getBaseDir(configuration.getZipBase()), configuration.getZipPath() + "/" + rootDirName + "/" + baseName);
return new LocalDistribution(distDir, distZip);
}

// 获取2级目录:一级是gradle版本,另一级是url的hash值
private String rootDirName(String distName, WrapperConfiguration configuration) {
String urlHash = getHash(configuration.getDistribution().toString());
return distName + "/" + urlHash;
}

/**
* This method computes a hash of the provided {@code string}.
* <p>
* The algorithm in use by this method is as follows:
* <ol>
* <li>Compute the MD5 value of {@code string}.</li>
* <li>Truncate leading zeros (i.e., treat the MD5 value as a number).</li>
* <li>Convert to base 36 (the characters {@code 0-9a-z}).</li>
* </ol>
*/
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);
}
}

3. gradle各版本文件对比

以gradle3.3版本为例。

3.1 gradle-3.3-all.zip 和 gradle-3.3-bin.zip

​src​​、​​docs​​和​​samples​​。

【Android】gradle-wrapper.properties中各属性的含义_java_03

3.2 gradle-3.3-all.zip 和 gradle-3.3-src.zip

​subprojects​​目录与完整版的​​src​​目录基本是一致的。 

src版是编译环境,所以源码目录结构都是gradle工程的结构。 

完整版的​​src​​目录,只是源文件,不能直接拿来编译。

【Android】gradle-wrapper.properties中各属性的含义_Gradle_04

4. 参考