前言
Gradle詳解內容將分篇介紹,這裏首先介紹Gradle的基礎知識和項目結構。
1 Gradle 安裝
gradle的網站是 http://gradle.org/。我們可以通過相關的網站獲取到相應的gradle的版本。也可以在這個網站上面獲取相應的資料。
1.1 下載相應的版本
在上面的網站下載最新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')
}