前言
在閱讀本文章以前,指望你已經瞭解了這些內容:html
gradle是什麼,它有哪些基本特性java
gradle task的基本概念和寫法android
本人使用的環境:
LUbuntu 14.04,AndroidStudio 1.3.2,其自帶Gradle 2.4api
使用AndroidStudio新建一個Android項目,一直默認直到建立完成,而後點開AndroidStudio左邊的Project面板,能夠看到以下工程組織:
服務器
先簡單粗暴的來看看這些文件是什麼鬼。閉包
build.gradle (Project: MyApplication)
這是Android項目根目錄下的build.gradle,此文件名是一個約定名字,gradle將依賴它來構建項目。一個項目能夠包括多個工程,gradle能夠構建多個工程,每一個工程子目錄均可以有build.gradle文件,如同make構建工具與Makefile文件的關係。咱們作的大部分工做,也就是編寫和組織build.gradle文件。app
build.gradle (Module: app)
這是Android項目根目錄/app/build.gradle,app是一個gradle工程,這裏的build.gradle文件就是用來描述如何構建app工程,gradle能夠支持構建多個工程,並設置工程之間的依賴關係。ide
gradle-wrapper.properties
Gradle Wrapper 是Android對gradle的使用進行一些必要的封裝而成的腳本——gradlew(位於項目根目錄下,用於命令行使用,在集成環境中很是有用),它會自動檢測當前項目指定的gradle版本是否存在,若是不存在則本身下載(保存在~/.gradle/wrapper/)。因此每個Android項目下都有本身的gradle軟件包,官方建議把這些包也提交進源碼管理系統中,這樣編譯此項目的系統(如持續集成服務器)不須要事先(手動)安裝gradle。 gradle-wrapper.properties裏的配置影響Gradle Wrapper的運做,其中distributionUrl屬性指定從哪裏下載gradle,固然,若是咱們不想讓它本身下載,能夠用distributionPath指定手工下載的本地的gradle包。(進階:具它wrapper相關的設置參見:Wrapper API)
另外,Android默認建立了一個叫wrapper的gralde task,經過使用這個task,就能夠在工程的build.gradle裏面訪問和修改wrapper屬性。工具
proguard-rules.pro
proguard是一個用來混淆java代碼的開源項目,Android項目把它集成了進來,先無論。gradle
gradle.properties
由於gradle是java程序,它將在JVM環境中運行,此文件用來指定gradle如何運行(或叫構建環境),包括:
開啓gradle的daemon並行構建模式,設置JVM內存參數,加速構建。
能夠自定義屬性(key和value),這些屬性能夠傳遞給gradle的java程序,也能夠被build.grade訪問。
gradle提供了多種方法爲構建環境添加屬性:
命令行執行gradle帶\-D參數,\-D參數也會傳遞給java(這裏指運行gradle的java程序)
寫在gradle.properties文件裏面,並且每一個子工程目錄下均可以有本身的gradle.properties文件
寫在
GRADLE_USER_HOME
環境變量所指目錄下的gradle.properties中。寫在以
ORG_GRADLE_PROJECT_
開頭的環境變量裏。
以上方式能夠同時使用,gradle按以上列出的順序(優先級從低到高)進行分析,若屬性有衝突,保留優先級高的配置。
設置代理。
如今此文件默認什麼都沒配置,先無論。
settings.gradle
這個文件也是gradle約定命名的,默認只有一行代碼include ':app'
,表示當前項目只有一個模塊(咱們習慣叫工程,gradle習慣叫模塊),app是目錄名,同時也做爲工程名。當有多個工程的時候,能夠在此添加。
local.properties
默認內容是Android SDK和NDK的配置路徑,這是我以前在AndroidStudio配置過的,此文件不須要咱們修改,在IDE的設置會自動覆蓋此文件的設置,此文件不該該commit到源碼管理系統中,由於它是我的環境的配置。
好,下面咱們具體來看build.gradle文件。
// Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { repositories { jcenter() } dependencies { classpath 'com.android.tools.build:gradle:1.3.0' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files } } allprojects { repositories { jcenter() } }
這是一個最頂層的gradle工程。gradle工程在gradle系統中用一個project對象)表示,它有以下一些元素:
allprojects { }
artifacts { }
buildscript { }
configurations { }
dependencies { }
repositories { }
sourceSets { }
subprojects { }
publishing { }
下面咱們只對相關的進行探索。
Gradle Plugins
Gradle內核集成了不少插件(好比編譯java代碼的插件),使用插件,咱們只須要作不多的工做就能夠完成常規的構建任務。以.jar文件打包成的插件叫二進制插件,在使用這種插件以前,得把它添加到當前構建腳本的classpath中。
buildscript
buildscript是gradle工程中定義的一個方法,能夠傳入一個語句塊(有人叫閉包),這個語句塊返回一個ScriptHandler對象。查看ScriptHandler對象的API得知,ScriptHandler包含兩個方法:repositories和dependencies,調用dependencies設置構建時依賴什麼東西,調用repositories設置這些依賴來自哪裏的倉庫。如今明白了,上面的代碼其實就是爲Android的gradle插件指定位置和版本。
allprojects
這也是gradle的特性,gradle支持在根build.gradle裏使用allprojects,事先對整個構建可能包含的全部工程進行統一的配置,上面的代碼就是給全部工程都配置了jcenter倉庫,這樣工程所依賴的第三方庫在構建過程當中都會被自動下載。若是多個工程(子工程)有相同的行爲或屬性要配置,使用這個是很方便的。
apply plugin: 'com.android.application' android { compileSdkVersion 21 buildToolsVersion "22.0.1" defaultConfig { applicationId "example.jk.myapplication" minSdkVersion 19 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:22.2.0' }
apply pluginapply plugin: 'com.android.application'
應用Android的gradle插件到當前構建腳本,此插件其實繼承自gradle的application插件,使用application插件,能夠經過添加task來運行或把Java項目構建爲基於命令行的程序。
Android gradle插件具備application插件的功能,同時會應用java插件和distribution插件,後兩個插件用來自動化編譯和發佈java程序的。
android
這個Android gradle插件提供的元素,用於配置android相關的構建選項,包括:
compileSdkVersion 指定構建時使用的Android SDK版本
buildToolsVersion 指定構建工具的版本,構建工具可使用Android SDK Manager來安裝,能夠安裝多個版本,如圖:
官方建議這裏指定的構建工具的版本最好大於等於目標SDK版本(targetSdkVersion)。
defaultConfig元素裏的配置對應AndroidManifest.xml文件,優先級比AndroidManifest.xml文件裏的配置高。gradle支持對一個項目構建多種版本,好比試用版 、商業版,每一個版本能夠有本身的defaultConfig。
buildTypes元素默認定義了debug和release兩種構建,debug構建出來的APK將包含調試符號,而且以debug key進行簽名,而release類型的默認是沒有簽名的。minifyEnabled爲true表示啓用自動清除無用代碼,用於軟件包瘦身。proguardFiles指定了代碼混淆使用的相關文件。
工程依賴
dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) compile 'com.android.support:appcompat-v7:22.2.0' }
這裏的dependencies是gradle工程定義的元素,指定此工程依賴什麼。compile這個方法指定要添加什麼來編譯主程序,這些東西將最終被打包進APK中。fileTree(dir: 'libs', include: ['*.jar'])
將返回一個文件樹對象,這些文件位於app/libs目錄,並以.jar結尾。
整句代碼的意思就是把當前工程目錄的libs目錄下全部jar文件加入編譯時classpath中,並打包進APK。這是本地二進制庫依賴的寫法。
而compile 'com.android.support:appcompat-v7:22.2.0'
表示依賴位於倉庫中的appcompat庫及其版本,位於Android Support Library中,若是本地沒有安裝Android Support Library,使用Android SDK Manager進行下載。(進階:固然,還能夠指定依賴其它工程,以及除compile外的其它依賴類型,具體見《依賴管理介紹》)
至此,咱們已經大概瞭解了AndroidStudio默認工程有關gradle的腳本。其實AndroidStudio IDE提供了不少設置,這些設置修改後,AndroidStudio會自動更新相關的build.gradle和*.properties文件。若是咱們手工編輯build.gradle文件,AndroidStudio將提示咱們進行sync(同步)操做,以便這些配置反映到IDE界面上。
參考連接:
《Gradle Plugin User Guide》http://tools.android.com/tech-docs/new-build-system/user-guide
《Gradle User Guide》https://docs.gradle.org/current/userguide/userguide_single.html
《Build configuration Basics》https://developer.android.com/tools/building/configuring-gradle.html