Gradle 入門到精通(一)

前言

Gradle詳解內容將分篇介紹,這裏首先介紹Gradle的基礎知識和項目結構。

1 Gradle 安裝

gradle的網站是 http://gradle.org/。我們可以通過相關的網站獲取到相應的gradle的版本。也可以在這個網站上面獲取相應的資料。

1.1 下載相應的版本

https://gradle.org/releases

在上面的網站下載最新gradle的版本

1.2 配置

將下載的文檔解壓,解壓完成後,將路徑添加到系統變量Path內部。

1.3 校驗安裝

在命令行下輸入

gradle -v

如果有相對應的輸出代表安裝成功

2 Groovy語法入門

2.1 why Groovy?

爲什麼我們學習gradle需要學習groovy? groovy是google推出的一款基於java的腳本語言。只要簡單幾句代碼就可以完成java程序。雖然groovy看起來是腳本編程語言,但是究其更本也是運行在jvm上面的java語言,知識groovy對java進行了二層的封裝。因爲這個語言的靈活性,gradle選擇了groovy。

2.2 helloWorld

讓我們使用最簡單的helloWorld代碼來入門。首先要確保gradle安裝正確,安裝正確後,我們新建一個文件夾,在這個文件夾內部新建一個build.gradle文件。

 println("Hello World!");

接着我們在命令行執行 gradle 後就可以看到相應的結果了。

2.3 基礎語法

def a = 1
def b = "abc"
def int a

上面是gradle如何定義一個變量的寫法。注意gradle沒有要求每行必須以;結尾,一行就是一句代碼

def oneMeathod(arg1){

}

int twoMeathod(arg1,arg2){
     arg1+arg2
}

上面是定義方法的寫法,如果是無返回的方法。需使用def定義。如果指定了相應的返回類型的話,可不使用def關鍵字。

注意如果有返回值的話,需在最後一行將需要返回的值返回。

2.4 字符串

def a ='huangkai'
def b = "i am $a"
def lines = ''' abc


       abc

       end '''

字符串有三種格式

  • ” 代表完全按照符號內部的內容
  • “” 如果內部有$變量值的話,先取變量值
  • ”’ ”’代表文本支持換行

2.5 容器類型

在Java裏提供了多種的容器類型,常見的有List Map Set。他們分別適合不同場景。爲不同需求提供解決能力。在grrovy內部也提供了對應的容器類型。

以下內容不用死記硬背,學會查詢即可

http://docs.groovy-lang.org/latest/html/groovy-jdk/

2.5.1 List

與Java數組類型相似,與java不一樣的,Java需要類型相同的對象。可以理解爲定義了一個ArrayList

def a = ["a",5,6]

上面是定義的方法。

可以在上面的網站查詢到list提供的方法

def a = [5,'string',true]

println(a.getAt(2));

2.5.2 Map

與java中的map類似,map提供的鍵值對的能力。

 def map = ["a":100,"b":200]

定義map的方法,key:vaule key必須爲字符串 value可以爲任何值。 多個值之間使用,分開

簡單的使用map

 def map = ["a":100,"b":200]

 println(map.getAt("b"));

2.6 閉包(Closure)

2.6.1 閉包的定義

我們在Java開發中經常使用下面的代碼

    image = (ImageView) findViewById(R.id.imageView);
    image.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

        }
    });

這個代碼是android裏面最常見的代碼。爲一個ImageView設置了一個點擊的回調,回調的意思就是設置一個對象給另外一個對象,當被設置的對象發生某種變化後會觸發設置對象的方法。

閉包是groovy裏面的特殊語法,我們在很多文件都可以看到閉包的身影。閉包是類似回調的一個代碼塊。因爲groovy是腳本語言,所以有很多約定的寫法,下面我們來看看閉包是如何定義與書寫的。

 def aClosure ={
           println("helloWorld");
      }

這個就是最簡單的一個閉包,看樣子是不是比較像一個方法。

帶參數的閉包,

def xxx = {a , b ->

   println(a);
   println(b);

 }

-> 符號前代表輸入的參數,可以不使用類型

帶默認參數的閉包

def xxx ={
    println(it);
}

每個閉包在定義的時候都帶了一個默認的參數,這個參數的名稱叫it。我們可以直接獲取他不需要定義。以上閉包的幾種定義的方式。

2.6.2 閉包的使用

在上面的章節我們學習了怎麼定義閉包,下面我們來學習一下怎麼使用閉包。

閉包的使用通常有兩種:

  • 1 直接用,我們把閉包當做一個函數使用。
  • 2 作爲一個參數使用,我們把閉包作爲一個回調使用。

1 作爲一個函數使用

 def abc = {time,name ->

   println(time);

   println(name);

 }

abc.call(100,"huangkai");


 def xxx ={
    println(it);
 }

xxx.call(10086)

上面定義了兩個閉包,每個閉包的調用方法都是使用call()方法,注意call方法的參數

2 作爲參數

List    each(Closure closure)

list定義了一個方法,這個方法是遍歷list的方法,方法接收一個參數,參數的類型就是一個閉包。

def a = [5,'string',true]

def b ={
 println(it);
 }

a.each(b);

上面的例子就是怎麼把一個閉包作爲參數傳遞給一個方法

4 創建一個簡單的Gradle項目

爲了讓大家能夠理解gradle的項目的結構,我們來創建一個最簡單的gradle項目來理解Gradle的項目結構。

1 創建一個文件夾作爲工程目錄

2 在這個目錄內新建一個build.gradle文件

3 編寫build.gradle文件,在文件內加入這個一句話。

 task wrapper(type: Wrapper) {
   gradleVersion = '2.0'
}

這句話的意思就是,爲當前項目創建一個wrapper包,使用的gradle版本是2.0

4 在命令行下進入當前的工程目錄,執行以下命令

  gradle wrapper

5 執行成功後,工程目錄下生成

wrapper文件是讓項目在沒有安裝gradle的情況下能夠使用gradle

gradlew 與 gradlew.bat 是在不同平臺下面使用的文檔。

6 gradle-wrapper.properties

7 在gradle-wrapper.properties文件中修改成

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

8 使用android studio加載這個項目

9 在build.gradle 文件中添加一句腳本,接着打開終端標籤頁面

10 在終端中輸入./gradlew命令,最後gradle的文件就會編譯完成

5 默認的項目結構

上面的例子我們學習了gradle的基本結構,我們知道了wrapper等文件的作用,下面我們來看看android studio創建的項目結構。

這個目錄結構是比較常見的android項目結構,這個多項目結構(Multi project),什麼叫多項目結構,意味着項目是由多個子項目組成的,每個子項目都有自己的構建文件(build.gradle)最後由Gradle將多個子項目整合。進而完成項目的構建。

我們看看上圖,上圖就是最經典的項目結構。

  • app 、app2 : 業務代碼
  • library : 代碼庫
  • build.gradle :項目的總的build文件
  • setting.gradle: 項目會構建的模塊
  • gradle : gradle的jar包與配置文件
  • gradlew : gradle的跨平臺執行文件

上圖是我們項目的默認的目錄結構。

有的時候我們需要自定義一些項目結構,如下圖

上圖的項目結構就是典型的eclipse項目的結構,我要做就是以下幾步:

  • 1 創建一個目錄
  • 2 修改項目根目錄下settings.gradle,在後面將目錄的名稱添加到文件中 如下圖
  • 3 在目錄下創建一個build.gradle文件
  • 4 修改build.gradle文件,添加sourceSets支持 如下圖

 sourceSets {
    main {
        manifest.srcFile 'AndroidManifest.xml'
        java.srcDirs = ['src']
        jniLibs.srcDirs = ['libs']
        aidl.srcDirs = ['src']
        renderscript.srcDirs = ['src']
        res.srcDirs = ['res']
        assets.srcDirs = ['assets']
    }
    androidTest.setRoot('tests')
   }

未完待續…..

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