什么是Gradle?
Gradle是一種依賴(lài)管理工具,基于Groovy語(yǔ)言,面向Java應(yīng)用為主,它拋棄了基于XML的各種繁瑣配置,取而代之的是一種基于Groovy的內(nèi)部領(lǐng)域特定(DSL)語(yǔ)言。在Android Studio 中是默認(rèn)安裝的Gradle的插件。
project和task
在gradle中的兩大重要的概念,分別是project和tasks。每一次構(gòu)建都是有至少一個(gè)project來(lái)完成,所以Android studio中的project和Gradle中的project不是一個(gè)概念。每個(gè)project有至少一個(gè)tasks。每一個(gè)build.gradle文件代表著一個(gè)project。tasks在build.gradle中定義。當(dāng)初始化構(gòu)建進(jìn)程,gradle會(huì)基于build文件,集合所有的project和tasks, 一個(gè)tasks包含了一系列動(dòng)作,然后它們將會(huì)按照順序執(zhí)行,一個(gè)動(dòng)作就是一段被執(zhí)行的代碼,很像Java中的方法。
Gradle構(gòu)建的聲明周期
一旦一個(gè)tasks被執(zhí)行,那么它不會(huì)再次執(zhí)行了,不包含依賴(lài)的Tasks總是優(yōu)先執(zhí)行,一次構(gòu)建將會(huì)經(jīng)歷下列三個(gè)階段:
- 初始化階段:project實(shí)例在這兒創(chuàng)建,如果有多個(gè)模塊,即有多個(gè)build.gradle文件,多個(gè)project將會(huì)被創(chuàng)建。
- 配置階段:在該階段,build.gradle腳本將會(huì)執(zhí)行,為每個(gè)project創(chuàng)建和配置所有的tasks。
- 執(zhí)行階段:這一階段,gradle會(huì)決定哪一個(gè)tasks會(huì)被執(zhí)行,哪一個(gè)tasks會(huì)被執(zhí)行完全依賴(lài)開(kāi)始構(gòu)建時(shí)傳入的參數(shù)和當(dāng)前所在的文件夾位置有關(guān)。
整個(gè)項(xiàng)目的build.gradle
這個(gè)是整個(gè)項(xiàng)目的gradle基礎(chǔ)配置文件
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:1.0.0'
//聲明了android gradle plugin的版本。
}
}
allprojects { //所有的項(xiàng)目都通用的配置
repositories {
jcenter()
}
}
這個(gè)就是實(shí)際構(gòu)建開(kāi)始的地方,在倉(cāng)庫(kù)地址中,使用了JCenter,JCenter類(lèi)似maven庫(kù),不需要任何額外的配置,gradle還支持其他幾個(gè)倉(cāng)庫(kù),不論是遠(yuǎn)程還是本地倉(cāng)庫(kù)。
有些組織,創(chuàng)建了一些有意思的插件或者library,他們更愿意把這些放在自己的maven庫(kù),而不是maven中心庫(kù)或jcenter。那么當(dāng)你需要是要這些倉(cāng)庫(kù)的時(shí)候,你只需要在maven方法中加入url地址就好:
repositories {
maven {
url "http://repo.acmecorp.com/maven2"
}
}
同樣的,Ivy倉(cāng)庫(kù)也可以這么做。Apache Ivy在ant世界里是一個(gè)很出名的依賴(lài)管理工具。如果你的公司有自己的倉(cāng)庫(kù),如果他們需要權(quán)限才能訪(fǎng)問(wèn),你可以這么編寫(xiě):
repositories {
maven {
url "http://repo.acmecorp.com/maven2"
credentials {
username 'user'
password 'secretpassword'
}
}
}
模塊Gradle
// 聲明是Android程序
apply plugin: 'com.android.application'
android {
// 編譯SDK的版本
compileSdkVersion 21
// build tools的版本
buildToolsVersion "21.1.1"
defaultConfig {
// 應(yīng)用的包名
applicationId "me.storm.ninegag"
minSdkVersion 14
targetSdkVersion 21
versionCode 1
versionName "1.0.0"
}
// java版本
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_7
targetCompatibility JavaVersion.VERSION_1_7
}
buildTypes { //打不同類(lèi)型的包
release {
// 是否進(jìn)行混淆
minifyEnabled false
// 混淆文件的位置
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
}
}
// 移除lint檢查的error
lintOptions {
abortOnError false
}
}
dependencies { //添加依賴(lài)
//添加compile后,會(huì)自動(dòng)從工程的build.gradle的 repositories {jcenter()}倉(cāng)庫(kù)當(dāng)中下載并依賴(lài)。或者引用本地的jar文件等。
// 編譯libs目錄下的所有jar包
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:support-v4:21.0.2'
compile 'com.etsy.android.grid:library:1.0.5'
compile 'com.alexvasilkov:foldable-layout:1.0.1'
// 編譯extras目錄下的ShimmerAndroid模塊
compile project(':extras:ShimmerAndroid')
}
本地依賴(lài)
可能有些情況,你需要手動(dòng)下載jar包,或者你想創(chuàng)建自己的library,這樣你就可以復(fù)用在不同的項(xiàng)目,而不必將該library publish到公有或者私有庫(kù)。在上述情況下,可能你不需要網(wǎng)絡(luò)資源。下面將介紹一下如何是使用jar依賴(lài),以及如何導(dǎo)入so包,如何為項(xiàng)目添加依賴(lài)項(xiàng)目。
文件依賴(lài)
如果想為工程添加jar文件作為依賴(lài),可以這樣:
dependencies {
compile files('libs/domoarigato.jar')
}
當(dāng)有很多這樣的jar包時(shí),可以改寫(xiě)為:
dependencies {
compile fileTree('libs')
}
默認(rèn)情況下,新建的Android項(xiàng)目會(huì)有一個(gè)lib文件夾,并且會(huì)在依賴(lài)中這么定義(即添加所有在libs文件夾中的jar):
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
}
這也意味著,在任何一個(gè)Android項(xiàng)目中,你都可以把一個(gè)jar文件放在到libs文件夾下,其會(huì)自動(dòng)的將其添加到編譯路徑以及最后的APK文件。
so包(native包)
用c或者c++寫(xiě)的library會(huì)被叫做so包,Android插件默認(rèn)情況下支持native包,你需要把.so文件放在對(duì)應(yīng)的文件夾中:
app
├── AndroidManifest.xml
└── jniLibs
├── armeabi
│ └── nativelib.so
├── armeabi-v7a
│ └── nativelib.so
├── mips
│ └── nativelib.so
└── x86
└── nativelib.so
或者,依舊放在libs文件夾中,并且在app gradle設(shè)置所有代碼的源
gradle-wrapper.properties
gradle文件夾下的wrapper文件夾中有個(gè) gradle-wrapper.properties 文件:
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-2.2.1-all.zip
可以看到里面聲明了gradle的目錄與下載路徑以及當(dāng)前項(xiàng)目使用的gradle版本,這些默認(rèn)的路徑我們一般不會(huì)更改的,這個(gè)文件里指明的gradle版本不對(duì)也是很多導(dǎo)包不成功的原因之一。