前言
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')
}