天天看點

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

的建構體系。本文并沒有就三者的關系進行死磕,僅僅點到即止。我們需要形成的是大局觀。好吧,就這麼多了。