一、理解gradle
gradle是基于Groovy語言的項(xiàng)目構(gòu)建框架實(shí)現(xiàn),Groovy是一種基于JVM的動(dòng)態(tài)語言。Android studio采用gradle來構(gòu)建項(xiàng)目。
Android項(xiàng)目結(jié)構(gòu)
MyApp
├── build.gradle //project
├── settings.gradle
└── app
├── build.gradle //module
├── build
├── libs
└── src
└── main
├── java
│ └── com.package.myapp
└── res
├── drawable
├── layout
└── etc.
build.gradle的配置文件
根目錄project的build.gradle
buildscript方法定義的是所有模塊的公共屬性
buildscript {
repositories { //項(xiàng)目依賴的倉(cāng)庫(kù),即依賴包的來源,常見的還有如maven倉(cāng)庫(kù),或者自己定義的倉(cāng)庫(kù)
jcenter()
}
dependencies { //定義默認(rèn)的依賴包,不能在此定義子模塊的特有依賴包
classpath 'com.android.tools.build:gradle:1.2.3'
}
}
allprojects { //可定義各模塊的默認(rèn)配置和各模塊都可見的tasks
repositories {
jcenter()
}
}
Module內(nèi)的build.gradle
apply plugin: 'com.android.application' // 聲明是插件
android { // Android類型的插件可以使用Android標(biāo)簽
compileSdkVersion 22 // 編譯app時(shí)API版本
buildToolsVersion "22.0.1" // 構(gòu)建工具得版本號(hào)
defaultConfig { // 定義了app的核心屬性,并會(huì)在AndroidManifest中重寫對(duì)應(yīng)屬性。
applicationId "com.gradleforandroid.gettingstarted" // 復(fù)寫了AndroidManifest中的packageName。applicationId可以用來作為設(shè)備和應(yīng)用商店的唯一標(biāo)志,基于此,一個(gè)手機(jī)可以安裝兩個(gè)“同樣”的app。
minSdkVersion 14
targetSdkVersion 22
versionCode 1 //版本號(hào)標(biāo)志
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 plugin: 'com.android.application'表示聲明的是googleAndroid開發(fā)團(tuán)隊(duì)編寫的插件,能夠提供所有關(guān)于Android應(yīng)用和依賴庫(kù)的構(gòu)建打包和測(cè)試。
setting.gradle
settings.gradle會(huì)在初始化初期執(zhí)行,其中定義了哪些模塊會(huì)被project構(gòu)建。
include ':app', ':playui'
會(huì)至少包含一個(gè)include ':app',這時(shí)候表示單模塊工程。
關(guān)于各模塊的插件聲明:
app:
apply plugin: 'com.android.application'
其他module:
apply plugin: 'com.android.library'
如果插件聲明的是Android類型,則可以使用Android標(biāo)簽
android {
compileSdkVersion 22 //編譯sdk版本
buildToolsVersion "22.0.1" //構(gòu)建版本工具,可以用高版本去構(gòu)建低版本
}
聲明在libs文件夾內(nèi)的jar包
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
}
全局設(shè)置
方法一、allprojects
這種必須是Android app module才有效,只有添加了Android插件才能訪問Android的tasks
allprojects {
apply plugin: 'com.android.application'
android {
compileSdkVersion 22
buildToolsVersion "22.0.1"
}
}
方法二、ext
在project的build.gradle中聲明ext并定義屬性,在所有子module中可以訪問。
ext {
compileSdkVersion = 22
buildToolsVersion = "22.0.1"
}
則子模塊中可以如下使用:
android {
compileSdkVersion rootProject.ext.compileSdkVersion
buildToolsVersion rootProject.ext.buildToolsVersion
}
Tasks
待補(bǔ)充: https://blog.csdn.net/singwhatiwanna/article/details/78898113
二、依賴管理
gradle中可以一行代碼實(shí)現(xiàn)依賴,由gradle自動(dòng)從遠(yuǎn)程倉(cāng)庫(kù)下載依賴jar,并保證被正確使用。gradle也可以在工程中添加多個(gè)相同依賴時(shí),自動(dòng)排除掉相同的依賴。
倉(cāng)庫(kù)
倉(cāng)庫(kù)即文件的集合。Gradle支持Maven、lvy以及文件夾三種不同的倉(cāng)庫(kù)下載,并且針對(duì)特定版本的依賴包只需要下載一次后會(huì)在本地保留一份緩存。
?
一個(gè)依賴需要定義三個(gè)元素:
- group:創(chuàng)建該library的組織名,通常是包名
- name:該library的唯一標(biāo)示
- version:該library的版本號(hào)
通常的依賴聲明如下:
dependencies {
compile 'com.google.code.gson:gson:2.3'
compile 'com.squareup.retrofit:retrofit:1.9.0'
}
上述是基于groovy語法的,所以其完整的表述應(yīng)該是
dependencies {
compile group: 'com.google.code.gson', name: 'gson', version:'2.3'
compile group: 'com.squareup.retrofit', name: 'retrofit', version: '1.9.0'
}
遠(yuǎn)程倉(cāng)庫(kù)
對(duì)于不在MavenCentral或者jcenter中而在一些組織自己的的Maven庫(kù)的依賴,,需要添加Maven庫(kù)的url地址,如果倉(cāng)庫(kù)需要權(quán)限,還要添加相應(yīng)的userName和password
repositories {
maven {
url "http://repo.acmecorp.com/maven2"
}
}
repositories {
maven {
url "http://repo.acmecorp.com/maven2"
credentials {
username 'user'
password 'secretpassword'
}
}
}
本地依賴
手動(dòng)下載jar包添加依賴或者創(chuàng)建自己的library,而不必將該library發(fā)布到公有或者私有庫(kù)。
文件依賴
添加一個(gè)具體的jar文件依賴:
dependencies {
compile files('libs/domoarigato.jar')
}
添加一個(gè)文件夾下所有的jar依賴
dependencies {
compile fileTree('libs')
}
默認(rèn)情況下,新建的Android項(xiàng)目會(huì)有一個(gè)lib文件夾,并且會(huì)在依賴中這么定義(即添加所有在libs文件夾中的jar):
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
}
這樣在任何一個(gè)Android項(xiàng)目中,你都可以把一個(gè)jar文件放在到libs文件夾下,其會(huì)自動(dòng)的將其添加到編譯路徑以及最后的APK文件。
Native包(so包)
用c或者c++寫的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
aar文件
可以使用Android API和包含Android資源文件,清單文件等的library(即依賴工程)。與應(yīng)用工程生成apk不同,依賴工程生成.aar,該文件可以被Android應(yīng)用工程當(dāng)做依賴來使用。
創(chuàng)建依賴工程模塊
與應(yīng)用工程module不同,該build.gradle第一行應(yīng)聲明成:
apply plugin: 'com.android.library'
使用依賴工程模塊
- 直接使用library作為依賴,在project的build.gradle里添加聲明
include ':app', ':library'
在使用的模塊里添加依賴
dependencies {
compile project(':library')
}
- 當(dāng)構(gòu)建library的時(shí)候,在 build/output/aar/下會(huì)生成對(duì)應(yīng)的aar包,當(dāng)項(xiàng)目需要復(fù)用library的時(shí)候可以以aar包形式引入。
創(chuàng)建一個(gè)aars文件夾,將aar拷貝,添加該文件夾作為依賴庫(kù),則該文件夾下所有aar文件都將作為依賴。
repositories {
flatDir {
dirs 'aars'
}
}
dependencies {
compile(name:'libraryname', ext:'aar')
}
依賴的概念
配置
compile是默認(rèn)的那個(gè),其含義是包含所有的依賴包,即在APK里,compile的依賴會(huì)存在。
apk的意思是apk中存在,但是不會(huì)加入編譯中,這個(gè)貌似用的比較少。
provided的意思是提供編譯支持,但是不會(huì)寫入apk。
testCompile和androidTestCompile會(huì)添加額外的library支持針對(duì)測(cè)試。
動(dòng)態(tài)版本
在需要使用最新版本的依賴包的情況下,采用此方式引入動(dòng)態(tài)版本,gradle會(huì)在每次構(gòu)建的時(shí)候去倉(cāng)庫(kù)尋找是否有最新版本。但是這面臨的一個(gè)問題是,最新版本可能不是穩(wěn)定版。動(dòng)態(tài)版本一個(gè)顯著的特點(diǎn)是版本號(hào)后面帶“+”。
dependencies {
compile 'com.android.support:support-v4:22.2.+'
compile 'com.android.support:appcompat-v7:22.2+'
compile 'com.android.support:recyclerview-v7:+'
}
三、版本構(gòu)建
在Gradle的Android插件中,一個(gè)構(gòu)建版本意味著定義一個(gè)app或者依賴庫(kù)如何被構(gòu)建。每個(gè)構(gòu)建版本都要特殊的一面,比如是否需要debug,application id是什么,是否不需要的資源被刪除等等。你可以定義一個(gè)構(gòu)建版本通過buildTypes方法。Android studio將debug作為默認(rèn)構(gòu)建版本。
android {
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile
('proguard-android.txt'), 'proguard-rules.pro'
}
debug {
signingConfig signingConfigs.debugConfig
buildConfigField "boolean", MAIL_LOGIN, getMailLoginValue()
}
}
}
創(chuàng)建自己的構(gòu)建版本
同樣是在buildTypes里寫入自己的版本,為自己的構(gòu)建版本定一些特殊的屬性。構(gòu)建版本可以繼承并重寫已有構(gòu)建版本的屬性。
android {
buildTypes {
staging {
applicationIdSuffix ".staging"
versionNameSuffix "-staging"
buildConfigField "String", "API_URL",
"\"http://staging.example.com/api\""
}
}
}
構(gòu)建版本通過initWith方法繼承并重寫以后構(gòu)建版本
android {
buildTypes {
staging.initWith(buildTypes.debug)
staging {
applicationIdSuffix ".staging"
versionNameSuffix "-staging"
debuggable = false
}
}
}
四、構(gòu)建變體
ing...