Gradle從入門到實戰

由於gradle很多函數都是閉包,需要查api文檔才能確定參數,這時候需要官方文檔了:
http://docs.groovy-lang.org/latest/html/groovy-jdk/index-all.html
http://www.groovy-lang.org/api.html

個人總結

1、gradle版本
在Android studio的terminal中輸入:
在這裏插入圖片描述
在這裏插入圖片描述

發現gradle和gradlew的版本不一致,而gradle與gradle-wrapper中配置的版本一致:

distributionUrl=https\://services.gradle.org/distributions/gradle-4.6-all.zip

所以在Android studio中,使用gradlew。
在項目根目錄下的build.gradle文件中配置有:

    dependencies {
        classpath 'com.android.tools.build:gradle:3.2.0'
    }

這裏也有一個對gradle版本的配置,他其實是Android官方對gradle 的一個插件開發,便於開發者在Android環境下更容易的使用gradle構建項目。
用一段通俗易懂但是不是非常專業的話描述一下三者的概念、區別和聯繫。

  • Gradle是個構建系統,能夠簡化你的編譯、打包、測試過程。熟悉Java的同學,可以把Gradle類比成Maven。
  • Gradle Wrapper的作用是簡化Gradle本身的安裝、部署。不同版本的項目可能需要不同版本的Gradle,手工部署的話比較麻煩,而且可能產生衝突,所以需要Gradle Wrapper幫你搞定這些事情。Gradle Wrapper是Gradle項目的一部分。
  • Android Plugin for Gradle是一堆適合Android開發的Gradle插件的集合,主要由Google的Android團隊開發,Gradle不是Android的專屬構建系統,但是有了Android Plugin for Gradle的話,你會發現使用Gradle構建Android項目尤其的簡單。

2、各文件作用

  • build.gradle
    每一個 build.gradle 腳本文件被 Gradle 加載解析後,都會對應生成一個 Project 對象,在腳本中的配置方法其實都對應着 Project 中的API,Project 類的主要結構(節選部分常用):
  • gradle.properties
    在與 build.gradle 文件同級目錄下,定義一個名爲 gradle.properties 文件,裏面定義的鍵值對,可以在 Project 中直接訪問。
//gradle.properties裏定義屬性值
company="hangzhouheima"
username="hjy"

在 build.gradle 文件裏可以這樣直接訪問:

println "company = ${company}"
println "username = ${username}"
  • settings.gradle
    多項目構建
    前面我們介紹的例子,都是單獨執行某一個 build.gradle 文件。但是我們在 Android 應用開發中,一個 Project 可以包含若干個 module ,這種就叫做多項目構建。在 Android Studio 項目中,根目錄都有一個名叫 settings.gradle 的文件,然後每個 module 的根目錄中又有一個 build.gradle 文件,Gradle 就是通過 settings.gradle 來進行多項目構建的。

3、屬性

  • Gradle屬性
    在與 build.gradle 文件同級目錄下,定義一個名爲 gradle.properties 文件,裏面定義的鍵值對,可以在 Project 中直接訪問。
//gradle.properties裏定義屬性值
company="hangzhouheima"
username="hjy"

在 build.gradle 文件裏可以這樣直接訪問:

println "company = ${company}"
println "username = ${username}"
  • 擴展屬性
    還可以通過 ext 命名空間來定義屬性,我們稱之爲擴展屬性。
ext {
  username = "hjy"
  age = 30
}

println username
println ext.age
println project.username
println project.ext.age

必須注意,默認的擴展屬性,只能定義在 ext 命名空間下面。對擴展屬性的訪問方式,以上幾種都支持。

4、Extension

//先定義一個普通的java類,包含2個屬性
class Foo {
    int age
    String username

    String toString() {
        return "name = ${username}, age = ${age}"
    }
}
//創建一個名爲 foo 的Extension
getExtensions().create("foo", Foo)

//配置Extension
foo {
    age = 30
    username = "hjy"
}

task testExt << {
    //能直接通過 project 獲取到自定義的 Extension
    println project.foo
}

上面這個例子中,foo 就是我們自定義的 Extension 了,它裏面能配置的屬性與類 Foo 中的字段是一致的,在 build.gradle 中可以直接通過 project.foo 來訪問。每個 Extension 實際上與某個類是相關聯的,在 build.gradle 中通過 DSL 來定義,Gradle 會識別解析並生成一個對象實例,通過該類可以獲取我們所配置的信息。
之前有講過 Project 有個擴展屬性是通過 ext 命名空間配置的,可以看到 ext 與這裏是類似的,不同的是 ext 可以配置任何鍵值對的屬性值,而這裏只能識別我們定義的 Java 類裏的屬性值。

參考:
Gradle從入門到實戰 - Groovy基礎
Android Gradle學習(一):Gradle基礎入門
Android組件化開發實踐(一):爲什麼要進行組件化開發?
Gradle W3Cschool

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章