天天看点

Gradle 和 Gradle Wrapper 到底是什么关系。

Gradle Wrapper

我们推荐使用

Gradle Wrapper

执行

gradle

构建,(后面简称

Wrapper

).

Wrapper

实质上是一个脚本,这个脚本使用申明版本的

gradle

执行构建任务。如果本地没有

Wrapper

中申明的

gradle

版本,

Wrapper

会先下载它。这样开发者不必必须下载和项目指定版本相同的

gradle

,就可以完成构建。从而为公司节约时间、节约成本。

  • Wrapper

    仅仅是一个执行

    gradle

    的脚本 。
  • Wrapper

    只是为了让我们更方便快捷的使用

    gradle

AndroidStudio 中的 Gradle Wrapper

我们在

AndroidStudio

打包的时候会使用到这样的命令

./gradlew assmeble

。为什么可以使用这个命令?其实

gradlew

就是一个脚本,可以打开它看一看( 部分)。

#!/usr/bin/env sh

##############################################################################
##
##  Gradle start up script for UN*X
##
##############################################################################

# Attempt to set APP_HOME
# Resolve links: $0 may be a link
PRG="$0"
# Need this for relative symlinks.
while [ -h "$PRG" ] ; do
    ls=`ls -ld "$PRG"`
    link=`expr "$ls" : '.*-> \(.*\)$'`
    if expr "$link" : '/.*' > /dev/null; then
        PRG="$link"
    else
        PRG=`dirname "$PRG"`"/$link"
    fi
done

           

这就是

Wrapper

中的执行的脚本,那么它在哪里确定

gradle

的版本的呢,它还有个配置文件

gradle-wrapper.properties

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

    的值为

    GRADLE_USER_HOME

    ,那

    GRADLE_USER_HOME

    代表的路径是什么呢?就是

    ~/.gradle/

    这个文件夹,也就是当前用户下的

    .gradle

    文件夹 。如

    Use/xxxxx/.gradle

  • distributionUrl

    指定

    Wrapper

    中使用的

    gradle

    版本。

    Wrapper

    如果本地没有这个

    gradle

    版本它就会去下载。然后放在

    distributionBase

    +

    distributionPath

    路径下。也就是

    ~/.gradle/wrapper/dists

    路径下。
  • 我本地就有这些下好的

    gradle

    版本。
    Gradle 和 Gradle Wrapper 到底是什么关系。
    gradle_1

Wrapper

到底为我们提供了什么便利?

我们本地开发的时候

gradle

肯定需要下载。但比如给同事的电脑上打个包什么的,我们希望只把代码

clone

下来就行了。如果还要下载配置

gradle

环境也太麻烦了。或

Jenkins

上,没有我们需要

gradle

版本。实质上我们现在从

git

仓库

clone

代码后并不需要配置

gradle

环境,使用

gradlew

相关命令就可以进行打包了。而这一切当然都是

Wrapper

的功劳。

我们会把哪些对于打包比较重要的文件上传到

git

仓库(这里主要说和

Wrapper

相关的)
  • gradlew

    这个文件的重要性自然不必说了,这是个脚本文件。
  • gradle-wrapper.properties

    这是

    Wrapper

    配置文件,肯定要 上传 。
  • gradle-wrapper.properties

    同在

    gradle/wrapper

    下的

    gradle-wrapper.jar

    ,这个

    jar

    包可以勉强认为就是

    gradle

  • 比如

    build.gradle

    settings.gradle

    gradle.properties

    等等我就不一一列举了。

    在这些文件的通力合作下,我们可以在没有

    gradle

    的情况下使用

    Wrapper

    完成打包等任务。

Wrapper

如此强大,为什么我们还会出现 gradle 版本的问题呢?

既然

Wrapper

如此强大,这个报错又是怎么回事呢?

Error : minimum supported gradle version is 4.6 in android studio 3.0.1
           

这是因为

Android Gradle

插件。

Android Studio

编译系统以

Gradle

为基础,并且

Android Gradle

插件添加了几项专用于编译

Android

应用的功能。虽然

Android

插件通常会与

Android Studio

的更新步调保持一致,但插件(以及 Gradle 系统的其余部分)可独立于

Android Studio

运行并单独更新。另外由于

gradle

各个版本之间支持的功能存在差异。所以会存在不同

Android Gradle

插件,对支持的

gradle

最低版本有要求 。在

project

build.gradle

文件中指定

Android Gradle

插件版本。如下

dependencies {
        classpath 'com.android.tools.build:gradle:3.1.0'
        

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
           

Gradle 环境配置

如果你没有配置

gradle

环境,执行

gradle

相关命令是无法找到命令的。如果需要深入研究

gradle

这也是无法逃避的一个环节。那么我们现在就来配置下

Mac

平台的

gradle

环境。(其他环境类似,请自行配置,就是不配置也不影响本文的阅读)

  • Terminal

    中执行如下命令
vim ~/.bash_profile
           
  • 在配置文件

    .bash_profile

    中增加如下
#gradle
export GRADLE_HOME=/Users/zhang/.gradle/wrapper/dists/gradle-5.1.1-all/97z1ksx6lirer3kbvdnh7jtjg/gradle-5.1.1/bin
export PATH=$GRADLE_HOME:$PATH
           
  • 注意这是我的

    Gradle

    路径,我们刚刚已经找到

    Wrapper

    帮我们下载好的各个版本

    Grale

    。我这里选了

    gradle-5.1.1

    版本的进行配置。指定路径的时候需要一直指定到

    bin

    路径下。
  • 执行

    source ~/.bash_profile

    使刚刚配置的

    gradle

    路径生效即可。
  • 执行

    gradle -v

    ,如果显示

    gradle

    的 版本信息,则说明配置成功。

总结

Android Gradle

插件、

Gradle

Gradle Wrapper

共同组成了

android

的构建体系。本文并没有就三者的关系进行死磕,仅仅点到即止。我们需要形成的是大局观。好吧,就这么多了。