1、什麼是Gradleandroid
簡單的說,Gradle是一個構建工具,它是用來幫助咱們構建app的,構建包括編譯、打包等過程。咱們能夠爲Gradle指定構建規則,而後它就會根據咱們的「命令」自動爲咱們構建app。Android Studio中默認就使用Gradle來完成應用的構建。有些同窗可能會有疑問:」我用AS不記得給Gradle指定過什麼構建規則呀,最後不仍是能搞出來個apk。「 實際上,app的構建過程是大同小異的,有一些過程是」通用「的,也就是每一個app的構建都要經歷一些公共步驟。所以,在咱們在建立工程時,Android Studio自動幫咱們生成了一些通用構建規則,不少時候咱們甚至徹底不用修改這些規則就能完成咱們app的構建。shell
有些時候,咱們會有一些個性化的構建需求,好比咱們引入了第三方庫,或者咱們想要在通用構建過程當中作一些其餘的事情,這時咱們就要本身在系統默認構建規則上作一些修改。這時候咱們就要本身向Gradle」下命令「了,這時候咱們就須要用Gradle能聽懂的話了,也就是Groovy。Groovy是一種基於JVM的動態語言,關於它的具體介紹,感興趣的同窗能夠文末參考」延伸閱讀「部分給出的連接。編程
咱們在開頭處提到「Gradle是一種構建工具」。實際上,當咱們想要更靈活的構建過程時,Gradle就成爲了一個編程框架——咱們能夠經過編程讓構建過程按咱們的意願進行。也就是說,當咱們把Gradle做爲構建工具使用時,咱們只須要掌握它的配置腳本的基本寫法就OK了;而當咱們須要對構建流程進行高度定製時,就務必要掌握Groovy等相關知識了。限於篇幅,本文只從構建工具使用者的角度來介紹Gradle的一些最佳實踐,在文末「延伸閱讀」部分給出了幾篇高質量的深刻介紹Gradle的文章,其中包含了Groovy等知識的介紹。app
2、Gradle的基本組分框架
1. Project與Task工具
在Gradle中,每個待構建的工程是一個Project,構建一個Project須要執行一系列Task,好比編譯、打包這些構建過程的子過程都對應着一個Task。具體來講,一個apk文件的構建包含如下Task:Java源碼編譯、資源文件編譯、Lint檢查、打包以生成最終的apk文件等等。gradle
2. 插件ui
插件的核心工做有兩個:一是定義Task;二是執行Task。也就是說,咱們想讓Gradle能正常工做,完成整個構建流程中的一系列Task的執行,必須導入合適的插件,這些插件中定義了構建Project中的一系列Task,而且負責執行相應的Task。spa
在新建工程的app模塊的build.gradle文件的第一行,每每都是以下這句:.net
apply plugin: 'com.android.application'
這句話的意思就是應用「com.android.application「這個插件來構建app模塊,app模塊就是Gradle中的一個Project。也就是說,這個插件負責定義並執行Java源碼編譯、資源文件編譯、打包等一系列Task。實際上"com.android.application"整個插件中定義了以下4個頂級任務:
assemble: 構建項目的輸出(apk)
check: 進行校驗工做
build: 執行assemble任務與check任務
clean: 清除項目的輸出
當咱們執行一個任務時,會自動執行它所依賴的任務。好比,執行assemble任務會執行assembleDebug任務和assembleRelease任務,這是由於一個Android項目至少要有debug和release這兩個版本的輸出。
3. Gradle配置文件
咱們在Android Studio中新建一個工程,能夠獲得以下的工程結構圖:
上面咱們說過,Android Studio中的一個Module即爲Gradle中的一個Project。上圖的app目錄下,存在一個build.gradle文件,表明了app Module的構建腳本,它定義了應用於本模塊的構建規則。咱們能夠看到,工程根目錄下也存在一個build.gradle文件,它表明了整個工程的構建,其中定義了適用於這個工程中全部模塊的構建規則。
接下來咱們介紹一下上圖中其餘幾個Gradle配置文件:
gradle.properties: 從它的名字能夠看出,這個文件中定義了一系列「屬性」。實際上,這個文件中定義了一系列供build.gradle使用的常量,好比keystore的存儲路徑、keyalias等等。
gradlew與gradlew.bat: gradlew爲Linux下的shell腳本,gradlew.bat是Windows下的批處理文件。gradlew是gradle wrapper的縮寫,也就是說它對gradle的命令進行了包裝,好比咱們進入到指定Module目錄並執行「gradlew.bat assemble」便可完成對當前Module的構建(Windows系統下)。
local.properties: 從名字就能夠看出來,這個文件中定義了一些本地屬性,好比SDK的路徑。
settings.gradle: 假如咱們的項目包含了不僅一個Module時,咱們想要一次性構建全部Module以完成整個項目的構建,這時咱們須要用到這個文件。好比咱們的項目包含了ModuleA和ModuleB這兩個模塊,則這個文件中會包含這樣的語句:include ':ModuleA', ':ModuleB'。
4. 構建腳本
首先咱們來看一下工程目錄下的build.gradle,它指定了整個項目的構建規則,它的內容以下:
buildscript { repositories { jcenter() //構建腳本中所依賴的庫都在jcenter倉庫下載 } dependencies { //指定了gradle插件的版本 classpath 'com.android.tools.build:gradle:1.5.0' } } allprojects { repositories { //當前項目全部模塊所依賴的庫都在jcenter倉庫下載 jcenter() } }
咱們再來簡單介紹下app模塊的build.gradle的內容:
//加載用於構建Android項目的插件 apply plugin: 'com.android.application' android { //構建Android項目使用的配置 compileSdkVersion 23 //指定編譯項目時使用的SDK版本 buildToolsVersion "23.0.1" //指定構建工具的版本 defaultConfig { applicationId "com.absfree.debugframwork" //包名 minSdkVersion 15 //指定支持的最小SDK版本 targetSdkVersion 23 //針對的目標SDK版本 versionCode 1 versionName "1.0" } buildTypes { //針對不一樣的構建版本進行一些設置 release { //對release版本進行的設置 minifyEnabled false //是否開啓混淆 proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' //指定混淆文件的位置 } } } dependencies { //指定當前模塊的依賴 compile fileTree(dir: 'libs', include: ['*.jar']) testCompile 'junit:junit:4.12' compile 'com.android.support:appcompat-v7:23.1.1' compile 'com.android.support:design:23.1.1' }
3、常見配置
整個工程的build.gradle一般不需咱們改動,這裏咱們介紹下一些對模塊目錄下build.gradle文件的常見配置。
1. 依賴第三方庫
當咱們的項目中用到了了一些第三方庫時,咱們就須要進行一些配置,以保證能正確導入相關依賴。設置方法很簡單,好比咱們在app模塊中中用到了Fresco,只須要在build.gradle文件中的dependencies塊添加以下語句:
dependencies { ... compile 'com.facebook.fresco:fresco:0.11.0' }
這樣一來,Gradle會自動從jcenter倉庫下載咱們所需的第三方庫並導入到項目中。
2. 導入本地jar包
在使用第三方庫時,除了像上面那樣從jcenter倉庫下載,咱們還能夠導入本地的jar包。配置方法也很簡單,只須要先把jar文件添加到app\libs目錄下,而後在相應jar文件上單擊右鍵,選擇「Ad As Library」。而後在build.gradle的dependencies塊下添加以下語句:
compile files('libs/xxx.jar')
實際上咱們能夠看到,系統爲咱們建立的build.gradle中就已經包含了以下語句:
compile fileTree(dir: 'libs', include: ['*.jar'])
這句話的意思是,將libs目錄下的全部jar包都導入。因此實際上咱們只須要把jar包添加到libs目錄下並「Ad As Library"便可。
3. 依賴其它模塊
假設咱們的項目包含了多個模塊,而且app模塊依賴other模塊,那麼咱們只需app\build.gradle的denpendencies塊下添加以下語句:
compile project(':other')
4. 構建輸出爲aar文件
一般咱們構建的輸出目標都是apk文件,但若是咱們的當前項目時Android Library,咱們的目標輸出就是aar文件。要想達到這個目的也很容易,只須要把build.gradle的第一句改成以下:
apply plugin:'com.android.library'
這話表示咱們使用的插件再也不是構建Android應用的插件,而是構建Android Library的插件,這個插件定義並執行用於構建Android Library的一系列Task。
5. 自動移除再也不使用的資源
只需進行以下配置:
android { ... } buildTypes { release { ... shrinkResources true ... } } }
6. 忽略Lint錯誤
在咱們構建Android項目的過程當中,有時候會因爲Lint錯誤而終止。當這些錯誤來自第三方庫中時,咱們每每想要忽略這些錯誤從而繼續構建進程。這時候,咱們能夠只需進行以下配置:
android { ... lintOptions { abortOnError false } }
7. 集成簽名配置
在構建release版本的Android項目時,每次都手動導入簽名文件,鍵入密碼、keyalias等信息十分麻煩。經過將簽名配置集成到構建腳本中,咱們就沒必要每次構建發行版本時都手動設置了。具體配置以下:
signingConfigs { myConfig { //將"xx"替換爲本身的簽名文件信息 storeFile file("xx.jks") storePassword "xx" keyAlias "xx" keyPassword "xx" } } android { buildTypes { release { signingConfig signingConfigs.myConfig //在release塊中加入這行 ... } } ... }
真實開發中,咱們不該該把密碼等信息直接寫到build.gradle中,更好的作法是放在gradle.properties中設置:
RELEASE_STOREFILE=xxx.jks RELEASE_STORE_PASSWORD = xxx RELEASE_KEY_ALIAS=xxx RELEASE_KEY_PASSWORD=xxx
而後在build.gradle中直接引用便可:
signingConfigs { myConfig { storeFilefile(RELEASE_STOREFILE) storePassword RELEASE_STORE_PASSWORD keyAlias RELEASE_KEY_ALIAS keyPassword RELEASE_KEY_PASSWORD } }
關於Gradle的其餘配置方法你們能夠參考「延伸閱讀」部分的「Gradle最佳實踐」。
4、延伸閱讀
1. 深刻理解Android之Gradle:http://blog.csdn.net/Innost/article/details/48228651
鄧凡平老師的一篇博文,從原理到使用很是深刻細緻地介紹了Gradle。並且重點介紹了怎樣把Gradle當作一個編程框架來使用,介紹了Groovy語法基礎、Gradle經常使用API,想要高度定製項目構建過程的小夥伴們必定不要錯過這篇文章哦:)
2. Gradle構建最佳實踐: http://www.figotan.org/2016/04/01/gradle-on-android-best-practise/