Gradle
初識(shí)Gradle
在用AndroidStudio創(chuàng)建一個(gè)工程的時(shí)候,會(huì)發(fā)現(xiàn)工程目錄中除了必須的工程代碼以及各種資源文件外奕删,還有一些后綴為.gradle的文件俺泣,這些就是gradle的配置文件,是基于gradle的構(gòu)建腳本。
什么是Gradle
Gradle是一種項(xiàng)目自動(dòng)化建構(gòu)工具完残,基于Groovy語(yǔ)言伏钠,面向Java應(yīng)用為主,它拋棄了基于XML的各種繁瑣配置谨设,取而代之的是一種基于Groovy的內(nèi)部領(lǐng)域特定(DSL)語(yǔ)言熟掂, 而Groovy語(yǔ)言是一種基于jvm的動(dòng)態(tài)語(yǔ)言。
Project和tasks
在grade中的兩大重要的概念扎拣,分別是project和tasks赴肚。
Android studio中的project和Gradle中的project不是一個(gè)概念素跺。
每一次構(gòu)建都是有至少一個(gè)project來完成,每個(gè)project有至少一個(gè)tasks誉券。每一個(gè)build.grade文件代表著一個(gè)project指厌。tasks在build.gradle中定義,很像Java中的方法踊跟。在構(gòu)建過程中踩验,不同的Task各司其職。每個(gè)Task相當(dāng)于一個(gè)Project對(duì)象的函數(shù)商玫,專門用來干一件事箕憾。
不同的Task之間可以增加依賴,比如Task A依賴于B拳昌,那么要執(zhí)行A首先會(huì)執(zhí)行B袭异。而一個(gè)任務(wù)可以依賴的任務(wù)不止一個(gè)。在每一個(gè)Project中都必須有一個(gè)build.gradle文件地回,這是一個(gè)構(gòu)建腳本扁远,類似于makefile俊鱼,這個(gè)文件是整個(gè)Project構(gòu)建的入口刻像,可以在其中做一些配置,比如版本并闲、插件细睡、依賴等。
工作流程/生命周期
簡(jiǎn)單來說帝火,Gradle的工作過程分為三個(gè)階段:Initialization階段溜徙、Configuration階段以及Execution階段。
初始化階段:project實(shí)例在這兒創(chuàng)建犀填,如果有多個(gè)模塊蠢壹,即有多個(gè)build.gradle文件,多個(gè)project將會(huì)被創(chuàng)建九巡。
配置階段:在該階段图贸,build.gradle腳本將會(huì)執(zhí)行,為每個(gè)project創(chuàng)建和配置所有的tasks,會(huì)為所有的Task根據(jù)其依賴關(guān)系而建立一個(gè)有向圖冕广。
執(zhí)行階段:這一階段疏日,gradle會(huì)決定哪一個(gè)tasks會(huì)被執(zhí)行,哪一個(gè)tasks會(huì)被執(zhí)行完全依賴開始構(gòu)建時(shí)傳入的參數(shù)和當(dāng)前所在的文件夾位置有關(guān)撒汉。
一旦一個(gè)tasks被執(zhí)行沟优,那么它不會(huì)再次執(zhí)行了,不包含依賴的Tasks總是優(yōu)先執(zhí)行
為什么要選擇Gradle
假如你是一個(gè)開發(fā)者睬辐,項(xiàng)目自動(dòng)構(gòu)建是你每天工作的一部分挠阁,難道你就不想讓你的構(gòu)建代碼和你寫的源代碼一樣可以擴(kuò)展宾肺、測(cè)試和維護(hù)?Gradle的構(gòu)建腳本是聲明式的鹃唯、可讀的爱榕,可以清晰的表達(dá)意圖。使用Groovy代替XML來寫代碼大大減少了構(gòu)建代碼的大小坡慌。更重要的是黔酥,Gradle集成了其他構(gòu)建工具,比如Ant和Maven洪橘,使得原來的項(xiàng)目很容易遷徙到Gradle跪者。
Gradle for Android
看看實(shí)際的Android工程中g(shù)radle是如何使用
配置
基于grade構(gòu)建的項(xiàng)目通常至少有一個(gè)build.gradle,看看Android Studio默認(rèn)的配置:
Android工程中常用到的配置文件有:
- gradle-wrapper.properties文件
工程配置gradle熄求,distributionUrl是指定你的gradle版本渣玲,你可以改變?cè)搖rl來改變你的gradle版本。
#Mon Dec 28 10:00:20 PST 2015
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-2.14.1-all.zip
- setting.gradle文件
setting.gradle文件將會(huì)在初始化時(shí)期執(zhí)行弟晚,并且定義了哪一個(gè)模塊將會(huì)被構(gòu)建忘衍。
Android中一個(gè)項(xiàng)目中可以構(gòu)建多個(gè)Module,會(huì)在setting.gradle文件中會(huì)有如下代碼:(每構(gòu)建一個(gè)module就要在這里配置一下卿城,Android Studio會(huì)自動(dòng)幫我們配好了)
include ':app', ':mylibrary'
- 圖中框起來的兩個(gè)build.gradle文件
根目錄下的build.gradle文件是定義在這個(gè)工程下的所有模塊的公共屬性:
//這個(gè)就是實(shí)際構(gòu)建開始的地方
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.2.3'
}
}
allprojects {
repositories {
jcenter()
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
該文件主要包含了兩個(gè)方面:在倉(cāng)庫(kù)地址中枚钓,我們使用了jcenter,jcenter可以理解成是一個(gè)中央遠(yuǎn)程倉(cāng)庫(kù),一個(gè)倉(cāng)庫(kù)代表著你的依賴包的來源瑟押,兼容maven中心倉(cāng)庫(kù)搀捷。構(gòu)建腳本也定義了一個(gè)Android構(gòu)建工具,聲明了android gradle plugin的版本。
app目錄下的build.gradle:
//構(gòu)建腳本也定義了一個(gè)Android構(gòu)建工具多望,Android plugin提供了所有需要去構(gòu)建和測(cè)試的應(yīng)用嫩舟。每個(gè)Android應(yīng)用都需要這么一個(gè)插件:
apply plugin: 'com.android.application'
//當(dāng)使用Android 插件的時(shí)候,Android標(biāo)簽將可以被使用
android {
//編譯該app時(shí)候怀偷,你想使用到的api版本
compileSdkVersion 24
//構(gòu)建工具的版本號(hào)
buildToolsVersion "25.0.2"
//defaultConfig方法包含了該app的核心屬性家厌,該屬性會(huì)重寫在AndroidManifest.xml中的對(duì)應(yīng)屬性。
defaultConfig {
//app包名
applicationId "com.lipy.gradledemo"
//sdk相關(guān)配置
minSdkVersion 22
targetSdkVersion 24
//版本相關(guān)配置
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
//構(gòu)建相關(guān)設(shè)置,用于構(gòu)建不同版本的app
buildTypes {
release {
//是否開啟混淆
minifyEnabled false
//混淆文件位置
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
//依賴
dependencies {
//將libs文件夾中所有的jar文件視為依賴包
compile fileTree(dir: 'libs', include: ['*.jar'])
//聲明依賴庫(kù)
compile 'com.android.support:appcompat-v7:24.2.1'
}
以上配置是在android studio創(chuàng)建android項(xiàng)目的時(shí)候默認(rèn)配置好的椎工。
我們還可以自定義配置:
- 全局設(shè)置
多模塊在一個(gè)工程下饭于,可以這樣定義:
allprojects {
apply plugin: 'com.android.application'
android {
compileSdkVersion 24
buildToolsVersion "25.0.2"
}
}
如果model不是application的話,可以這樣:
在跟gradle.build中添加
ext {
allprojectCompileSdkVersion=24
allprojectBuildToolsVersion="25.0.2"
}
然后在具體的model中引用:
android {
compileSdkVersion allprojectCompileSdkVersion
buildToolsVersion allprojectBuildToolsVersion
}
- 配置應(yīng)用簽名信息
android {
buildTypes {
debug {
signingConfig signingConfigs.debug
}
}
signingConfigs {
debug {
storeFile file('debug.keystore')//簽名證書文件
keyAlias 'debug.keystore'//別名
storePassword "123456789"http://證書的密碼
keyPassword "123456789"http://key的密碼
}
}
- 依賴
依賴配置的關(guān)鍵字:
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:24.2.1'
compile project(':mylibrary')
provided 'com.google.code.gson:gson:2.2.4'
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
testCompile 'junit:junit:4.12'
}
- compile //包含所有的依賴包,都會(huì)寫入apk
- provided//提供編譯支持晋渺,但是不會(huì)寫入apk
- apk//apk中存在镰绎,但是不會(huì)加入編譯中
- testCompile//添加額外的library支持針對(duì)測(cè)試
- androidTestCompile//添加額外的library支持針對(duì)測(cè)試
在Gradle中添加依賴,僅僅只需添加一行代碼在你的build文件木西,Gradle會(huì)自動(dòng)從遠(yuǎn)程倉(cāng)庫(kù)為你下載相關(guān)的jar包畴栖。依賴包會(huì)在你執(zhí)行build構(gòu)建的時(shí)候從這些遠(yuǎn)程倉(cāng)庫(kù)下載,然后會(huì)在本地保留緩存八千。
Gradle會(huì)默認(rèn)定義三個(gè)maven倉(cāng)庫(kù):Jcenter和mavenCentral以及本地maven倉(cāng)庫(kù)
repositories {
mavenCentral()
jcenter()
mavenLocal()
}
我們也可以使用Jcenter和mavenCentral之外的遠(yuǎn)程倉(cāng)庫(kù):
repositories {
maven {
url "http://repo.acmecorp.com/maven2"
}
}
如果有密碼:
repositories {
maven {
url "http://repo.acmecorp.com/maven2"
credentials {
username 'user'
password 'secretpassword'
}
}
}
使用aar文件:
在構(gòu)建library項(xiàng)目時(shí)吗讶,會(huì)在 build/output/aar/下生成aar文件燎猛。創(chuàng)建一個(gè)文件夾aars文件夾,把它拷貝到該文件夾里照皆,然后依賴:
repositories {
flatDir {
dirs 'aars'
}
}
也可以單獨(dú)依賴某個(gè)
dependencies {
compile(name:'libraryname', ext:'aar')
}
使用基本的構(gòu)建命令
使用命令行重绷,導(dǎo)航到你的項(xiàng)目,然后輸入:
gradle tasks
這一命令將會(huì)列出所以可運(yùn)行的tasks
在開發(fā)的時(shí)候膜毁,構(gòu)建項(xiàng)目昭卓,你需要運(yùn)行
gradle assembleRelease
通過debug配置,該任務(wù)將會(huì)創(chuàng)建一個(gè)debug版本的app,同時(shí)會(huì)將其保存在./app/build/outputs/apk目錄下。
其他常用命令:
gradle clean //清除....../app目錄下的build文件夾
gradle build //檢查依賴并編譯打包瘟滨,會(huì)把debug候醒、release環(huán)境的包都打出來
gradle assembleRelease //編譯并打Release的包
gradle installRelease //Release模式打包并安裝
gradle installDebug//Debug模式打包并安裝
gradle uninstallRelease //卸載Release模式包
我們也可以不使用命令行,Android studio有其對(duì)應(yīng)的工具: