Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android Studio 中build.gradle文件的詳細解析

Android Studio 中build.gradle文件的詳細解析

編輯:關於Android編程

在由Eclipse轉到Android Studio之後,第一個讓我感到困惑的是build.gradle這個文件了,實在話,當時我並不知道這麼寫是幾個意思。

 

apply plugin: 'com.android.application'

android {
    compileSdkVersion 21
    buildToolsVersion "21.1.2"


    defaultConfig {
        applicationId "com.example.test"
        minSdkVersion 17
        targetSdkVersion 21
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}


dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:21.0.3'
}

 

如上就是建立一個as工程生成的基本構建文件了,暫且不需要知道他底層怎麼實現,至少要知道這麼寫是幾個意思,為何要這麼寫,我們需要一步一步來揭穿它。

 

一:Gradle 是基於Groovy語言來構建的,第一點就得了解什麼是Groovy語言,以及它的語法。

Groovy是一種動態語言,是從Java語言進化而來,可以說是Java的加強,它能運行於JVM上,具體的一些介紹可以自行谷歌了解,這裡只是為了簡單的看懂Groovy和基本使用。

開發環境:

Eclipse Groovy開發插件 http://dist.springsource.org/release/GRECLIPSE/e4.4 後邊的e4.x要自己對照自己的eclipse版本,否則可能出現無法安裝的問題,我的是4.4。

\\

 

 

第一個Groovy程序:

\

右鍵,新建一個Groovy工程,添加一個groovy資源包(只是為了區分),然後在src下先新建一個JavaTest.java類,勾選main方法,關在方法裡寫下一行代碼打印一個字符串 Hello groovy!

 


public class JavaTest { public static void main(String[] args) { System.out.println("Hello groovy!"); } }

 


 

 

上面是一個很簡單的Java類,運行之後將會在控制台輸出Hello groovy!

然後同理,我們在groovy資源包下新建一個GroovyTest.groovy 選擇新建-other-Grooovy Class

 

class GroovyTest {
	static main(args) {
		println "Hello groovy!"
	}
}


 

右鍵使用Groovy運行後,也會在控制台上打印出 Hello groovy!

相比於JavaTest.java我們發現,GroovyTest.groovy。似乎和JavaTest.java長得很像,只不過是將JavaTest.java去掉了一些內容,如class的修飾符public ,打印的System.out ,參數args的類型String[]。下面我們對GroovyTest.groovy做一些改動:

 

class GroovyTest {
	static main(args) {
		System.out.println "Hello groovy!"
	}
}


 

 

運行之後發現一樣能輸入Hello groovy!, 有意思,有意思,那我們再給args加上String[]的類型能,

 

class GroovyTest {
	static main(String[] args) {
		System.out.println.println "Hello groovy!"
	}
}


 

發現一樣能運行,並且同樣輸入Hello groovy! ,有趣了,是不是說我把java裡面的代碼都拷過來也能運行呢,這時變成這樣:

 

public class GroovyTest {
	public static void main(String[] args) {
		System.out.println("Hello groovy!");
	}
}


 

和你想的結果一樣,他也准確無語的輸出了Hello groovy!,哦,原來和我們看到的一些說明是正確的,groovy和java代碼是一樣的,它只不過是對java代碼進行簡化了。

不是說簡化嗎,假如我把GroovyTest類的代碼簡化成這樣:

 

println "Hello groovy!"


 

運行後,發現居然可以輸出來Hello groovy!

下面是一些說明:

 

Groovy類和java類一樣,完全可以用標准java bean的語法定義一個Groovy類。但作為另一種語言,可以使用更Groovy的方式定義類,這樣的好處是,可以少寫一半以上的javabean代碼。 (1)不需public修飾符 如前面所言,Groovy的默認訪問修飾符就是public,如果Groovy類成員需要public修飾,則根本不用寫它。 (2)不需要類型說明 同樣前面也說過,Groovy也不關心變量和方法參數的具體類型。 (3)不需要getter/setter方法 在很多ide(如eclipse)早就可以為程序員自動產生getter/setter方法了,在Groovy中,不需要getter/setter方法--所有類成員(如果是默認的public)根本不用通過getter/setter方法引用它們(當然,如果一定要通過getter/setter方法訪問成員屬性,Groovy也提供了它們)。 (4)不需要構造函數 不再需要程序員聲明任何構造函數,因為實際上只需要兩個構造函數(1個不帶參數的默認構造函數,1個只帶一個map參數的構造函數--由於是map類型,通過這個參數可以構造對象時任意初始化它的成員變量)。 (5)不需要return Groovy中,方法不需要return來返回值。 (6)不需要() Groovy中方法調用可以省略()(構造函數除外)。

語法說明(有一些為個人見解,因為本人也沒有深入研究,只是為了去理解AS的build.gradle,如有錯誤,請大家指正):

 

因為groovy是動態語言,就跟js一樣,Groovy對於類型的定義都用def這個關鍵字來聲明,它在底層會自動判斷當前的變量是一個什麼類型:

我們在上面也看到GroovyTest.groovy文件中,只寫了一個println "Hello groovy!" 也是可以正常運行的,所以以下我們都用最簡化直接在文件中輸入這些代碼。

定義一個字符串

 

def aa="Hello"
println aa


 

假如把打印跟定義換個位置,將會報錯

 

println aa
def aa="Hello"


 

由此看來,groovy也是由上到下來運行的,看起來像是把這些都放到main之中去運行。

//先定義再賦值

def str
str="r"
println str


 

定義一個整形

 

def num=10
println num


 

定義一個整形數組集合

 

def colum=[2,3,4,5]
println colum[0]


 

因為groovy已經重載了<<所以我們可以用<<來向集合加入一個值

 

def strArry=["jin","mu","shui"]
strArry.add("huo")
strArry << "tu"
println strArry
//輸出:[jin, mu, shui, huo, tu]

 

 

定義一個Map類型

 

def map=[key:"name",value:"mjk"]
println map["key"]
println map["value"]


 

輸出:

name
mjk

只要看到是 key:value都是map類型,因為key會自動轉換成string,所以你可以寫成def map=["key":"name","value":"mjk"]也可以寫成def map=[key:"name",value:"mjk"]

 

如果想知道當前這個變量是一個什麼類型可以用 .class來打印

 

def str="I am string"
println str.class


 

輸出:class java.lang.String

循環的使用:

 

def arry=["a","b","c","d"]
for(a in arry){
	println a
}


 

定義一個方法,接收兩個參數,輸出它們的和

 

def num=10
def method(a,b){
	println a+b
}
method num,9


 

當然使用method(num,9)是一樣的,只是去掉了括號,參數之間用逗號隔開

 

在定義一個map類型的時候,一定要加[],如果不加會報錯,而在方法調用時,可以不加[],如果方法調用的map參數要加[],則必須在外部加()

如:

 

//打印 map值
def printMap(map){
	println map["key"]
}
printMap key:"name"


 

輸出:name


//定義一個方法,打印接收到的值

 

def printStr(str){
	println str
}
printStr "Hello groovy!"


 

定義閉包:

閉包是Groovy裡面一個很重要的特性,這裡要著重講,

先看一個groovy對集合本身的實現了的一個包含閉包的方法each

 

def acoll = ["媽媽", "爸爸", "我"]	
acoll.each{
 println it
}


 

輸出:

媽媽
爸爸

acoll是一個字符串的集合,這個集合裡面有一個方法叫each,接收一個參數,這個參數是一個閉包,因為閉包也是一種類型,所以它也能像變量一樣當參數傳遞給方法使用。我們這裡簡單的理解,閉包是一個用花括號{}括起來的代碼塊,這個代碼塊在被觸發的時候調用。

上面each中的it是一個關鍵字,它保存了返回到這個閉包中的一個值。下面我們來用自己的方法實現這個each

//定義一個方法,這個方法接收一個集合參數跟一個閉包,當方法被調用時,遍歷集合裡面的值,並把值傳回給閉包

def myEach(arry,block){
	for(i in arry){
		block(i)
	}
}
def arr=["爸爸","媽媽","我"]//字符串集合
//調用myEach方法
myEach(arr,{
	println it
});


 

輸出:

爸爸
媽媽

原來流程是這樣,當我們調用myEach方法時,要傳入一個集合arr,和閉包。當方法,myEach在遍歷集合的時候,每得到一個值 就會回調一下這個閉包並把值傳給它,從這裡看是不是覺得,這個閉包既像一個變量參數,又像一個方法呢。

定義一個閉包並調用它:

//因為閉包是一種類型,所以在定義的時候要用=來給它賦值,這是跟方法有本質的區別

 

 

def block={
	println "調用block"
}
block()
輸出:調用block
定義一個閉包並傳入一個參數
def block={
	println "調用block"+it
}
block("--並傳入參數")


 

 

輸出:調用block--並傳入參數

 

要是我們不想用it這個關鍵字,也是可以定義自己的關鍵字的,只是我們要使用->來告訴它,是用我們自己定義的變量來接收值,而不用it

 

def block={param ->
	println "調用block"+param
}
block("--並傳入參數")
//兩個參數
def block={param1,param2->
	println "調用block"+param1+param2
}
block("--參數1","參數2")


 

下面我們定義一個block,這個block是用來打印接收到的值,目的是去遍歷給定的集合

 

def block={data->
	println "value="+data
}
//定義一個方法,這個方法接收一個集合參數跟一個閉包,當方法被調用時,遍歷集合裡面的值,並把值傳回給閉包
def myEach(arry,block){
	for(i in arry){
		block(i)
	}
}
def arr=["爸爸","媽媽","我"]//字符串集合
//調用myEach方法
myEach(arr,block)


 

輸出:

value=爸爸
value=媽媽
value=我

我們知道方法的括號是可以去掉的,如果上面調用方法時我們去掉括號就變成了:

//原來的是:myEach(arr,block)

myEach arr,block

而如果只是接收一個閉包的方法就可以寫成:

myEach block

如果block是匿名的,那就成為:

myEach {

}

所以我們可以知道,集合的each方法是怎麼實現遍歷的,當我們的這個集合已經知道了裡面的值,調用each時,只需要傳入一個閉包參數,就可以得到每一個值。

一般來說,如果有多個參數,而最後一個為閉包的時候,調用方法的時候習慣寫成:

myEach(param1,param2,param3){

}

實例:

 

//定義一個方法,這個方法接收一個集合參數跟一個閉包,當方法被調用時,遍歷集合裡面的值,並把值傳回給閉包
def myEach(arry,block){
	for(i in arry){
		block(i)
	}
}
def arr=["爸爸","媽媽","我"]//字符串集合
//調用myEach方法,並傳入一個集合跟一個匿名的閉包
myEach (arr){data->
	println "value="+data
}


 

到此差不多把groovy裡面的一些基本的語法說完了。下面講一下gradle

二:gradle

Gradle是一個構建工具,感興趣的可以去官網上了解,它的構建是基於一個一個的任務,task。我覺得把groovy弄懂了,對於gradle只是多去看一下開發指南就行,這裡不再說明。

 

三:回到build.gradle

講完了上面,這個時候可以把開篇的build.gradle貼到這裡說了,直接在代碼裡面加解釋:

 

//這一行,一看就知道調用了一個方法叫apply 傳入一個map類型的參數,key是plugin ,plugin的值是"com.android.application"說明是一個android應用工程
//在gradle中有介紹把你自己的一組代碼,構建做成一個plugin,如果把plugin的值改成"com.android.library"就說明這是一個庫工程
apply plugin: 'com.android.application' 

//android這個方法接收一個閉包,在閉包裡,調用的compileSdkVersion,  buildToolsVersion等方法並給他們傳值,並且還調用了defaultConfig這個方法來做一些配置,這個方法也是接收一個閉包,可以想象,通過閉包回調可以對值進行設置,當調用defaultConfig方法的時候,方法裡面會先調用傳入的這個閉包來初始化一些值,然後再進行別的其他操作。這也就是閉包的魅力所在。
android {
    compileSdkVersion 21
    buildToolsVersion "21.1.2"


    defaultConfig {
        applicationId "com.example.test"
        minSdkVersion 17
        targetSdkVersion 21
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}


dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:21.0.3'
}


 

通過以上這些講解,希望讀者們能對build.gadle文件有一些認識,這樣你也可以自己修改build.gadle文件來完成你自己想要的構建流程。

另外大家可以在這裡找到關於Gradle一些內置的方法還有他們的功能,以及AS為android工程提供的一些方法:

http://google.github.io/android-gradle-dsl/current/

\

 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved