依賴管理是Gradle優(yōu)秀的一部分瑰排,在很多情況下,只需要在build文件下添加一行依賴雪情,Gradle會(huì)自動(dòng)去遠(yuǎn)程下載你所需要的依賴鼠渺。依賴具有傳遞性鸭巴,依賴本身可以依賴于其他依賴。
章節(jié)主題:
- Repositories
- Local dependencies
- Dependency 概念
一拦盹,Repositories
1.倉庫介紹
我們討論依賴時(shí)主要是指外部依賴鹃祖,比如其他開發(fā)者提供的library。手動(dòng)管理依賴會(huì)有很多麻煩普舆,你必須下載你所需要的依賴恬口,然后復(fù)制進(jìn)project并引用它。而且通常JAR文件里沒有包含它的版本號(hào)沼侣,你必須自己記住版本號(hào)祖能。也需要把library放進(jìn)源碼控制系統(tǒng)中。
使用repositories可以解決這些問題蛾洛,一個(gè)repository是一個(gè)依賴文件的集合养铸,在repositories block定義需要使用的倉庫。
repositories {
jcenter()
}
Gradle支持三種Repositories:Maven,Ivy和靜態(tài)文件和目錄,在構(gòu)建的Execution階段gradle會(huì)從倉庫拉取依賴钞螟,Gradle會(huì)緩存依賴到本地兔甘,所以一個(gè)特定版本的依賴只會(huì)下載一次。
一個(gè)外部依賴可以由以下屬性定義:
- group:組織名
- name:library名
- version:版本名
在dependencies block就可以聲明一個(gè)依賴鳞滨,例如:
dependencies {
compile 'com.google.code.gson:gson:2.3'
compile 'com.squareup.retrofit:retrofit:1.9.0'
}
在Groovy中全寫如下:
dependencies {
compile group: 'com.google.code.gson', name: 'gson', version:
'2.3'
compile group: 'com.squareup.retrofit', name: 'retrofit'
version: '1.9.0'
}
注:name是必選字段裂明,group和version是可選,但是建議全部寫明
2.預(yù)配置倉庫
為了方便Gradle會(huì)在build script里配置JCenter太援,Maven Central和local Maven repository。
repositories {
mavenCentral()
jcenter()
mavenLocal()
}
JCenter和Maven Central是兩個(gè)知名的在線倉庫扳碍,但是沒有必要同時(shí)使用兩個(gè)提岔,建議使用JCenter,JCenter是AS中的默認(rèn)配置項(xiàng)笋敞,它也是Maven Central的一個(gè)超集碱蒙。還支持HTTPS。
local Maven repository是本地倉庫夯巷,文件目錄/.m2赛惩。
除了這些,還可以使用其他公共或者私有倉庫趁餐。
2.1遠(yuǎn)程倉庫
一些組織開發(fā)一些library沒有上傳到JCenter和Maven Central喷兼,而是傳到自己私有的 Maven 或者Ivy server。
添加倉庫時(shí)需要在Maven block添加url后雷,Ivy類似
repositories {
maven {
url "http://repo.acmecorp.com/maven2"
}
}
repositories {
ivy {
url "http://repo.acmecorp.com/repo"
}
}
//私人倉庫需要安全驗(yàn)證,添加credentials block
repositories {
maven {
url "http://repo.acmecorp.com/maven2"
credentials {
username 'user'
password 'secretpassword'
}
}
}
注:這個(gè)地方不要寫死季惯,在第二章說了可以配置在 Gradle properties file的文件里。不上傳到源碼控制系統(tǒng)去臀突。
2.2本地倉庫
可以使用本地的maven或者Ivy倉庫勉抓,url需要跟上倉庫路徑。
repositories {
maven {
url "../repo"
}
}
當(dāng)使用SDK manager安裝Google repositories時(shí)候学,會(huì)在本地創(chuàng)建兩個(gè)默認(rèn)的Maven repositories藕筋, 路徑是ANDROID_SDK/extras/google/m2repository 和ANDROID_SDK/extras/android/m2repository,提供了Android Support Library 和Google Play Services等功能梳码。
也可以使用flatDirs隐圾,創(chuàng)建一個(gè)目錄來作為倉庫。
repositories {
flatDir {
dirs 'libs' //指定libs為倉庫目錄边翁,在dependencies block就可以使用這些library
}
}
二翎承,Local dependencies
當(dāng)手動(dòng)下載一些JAR 文件或者native library時(shí),添加依賴有以下幾種情況:
- File dependencies
添加一個(gè)JAR文件符匾,或者libs目錄下所有JAR
dependencies {
compile files('libs/domoarigato.jar')
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
}
- Native libraries
添加C或者C++的.so文件庫
1.創(chuàng)建jniLibs目錄
app
├── AndroidManifest.xml
└── jniLibs
├── armeabi
│ └── nativelib.so
├── armeabi-v7a
│ └── nativelib.so
├── mips
│ └── nativelib.so
└── x86
└── nativelib.so
2.可以放進(jìn)libs目錄然后指定
android {
sourceSets.main {
jniLibs.srcDir 'src/main/libs'
}
}
- Library projects
創(chuàng)建一個(gè)library module叨咖,在build.gradle使用Android library plugin而不是使用Android application plugin
apply plugin: 'com.android.library'
有兩種方式引用這個(gè)library,
1.作為一個(gè)module添加進(jìn)項(xiàng)目,在settings.gradle中添加library的名稱
include ':app', ':library'
然后在 build.gradle的dependencies 添加依賴
dependencies {
compile project(':library')
}
2.library構(gòu)建時(shí)會(huì)在 build/output/aar/目錄下產(chǎn)生一個(gè).aar文件,我們把文件放進(jìn)libs目錄下甸各,讓后添加依賴
dependencies {
compile(name:'libraryname', ext:'aar')
}
三垛贤,Dependency概念
1.編譯關(guān)鍵字介紹
有時(shí),你可能需要使用僅在某些設(shè)備上存在的SDK趣倾,例如來自特定供應(yīng)商的藍(lán)牙SDK聘惦。為了能夠編譯代碼,您需要將SDK添加到編譯classpath中儒恋。您不需要將SDK包含在APK中善绎,因?yàn)樗呀?jīng)在設(shè)備上。
Android app 或者 library配置項(xiàng):
配置依賴項(xiàng)
您可以使用特定的配置關(guān)鍵字告訴 Gradle 如何以及何時(shí)使用某個(gè)依賴項(xiàng)诫尽,例如前述示例中的 compile 關(guān)鍵字禀酱。下面介紹了您可以用來配置依賴項(xiàng)的一些關(guān)鍵字:
1.compile
指定編譯時(shí)依賴項(xiàng)。Gradle 將此配置的依賴項(xiàng)添加到類路徑和應(yīng)用的 APK牧嫉。這是默認(rèn)配置剂跟。
2.apk
指定 Gradle 需要將其與應(yīng)用的 APK 一起打包的僅運(yùn)行時(shí)依賴項(xiàng)。您可以將此配置與 JAR 二進(jìn)制依賴項(xiàng)一起使用酣藻,而不能與其他庫模塊依賴項(xiàng)或 AAR 二進(jìn)制依賴項(xiàng)一起使用曹洽。
3.provided
指定 Gradle 不與應(yīng)用的 APK 一起打包的編譯時(shí)依賴項(xiàng)。如果運(yùn)行時(shí)無需此依賴項(xiàng)辽剧,這將有助于縮減 APK 的大小送淆。您可以將此配置與 JAR 二進(jìn)制依賴項(xiàng)一起使用,而不能與其他庫模塊依賴項(xiàng)或 AAR 二進(jìn)制依賴項(xiàng)一起使用抖仅。
4.testRuntime: 代碼是在運(yùn)行測(cè)試代碼的時(shí)候是必須的
5.archives: 包含項(xiàng)目生成的文件(如Jar文件)
6.default: 包含運(yùn)行時(shí)必須的依賴
7.runtime: 聲明項(xiàng)目在運(yùn)行時(shí)所需要的依賴
8.testCompile:用于編譯測(cè)試的依賴
2.依賴版本庫version介紹
上面說過一個(gè)依賴由group坊夫,name和version組成。version應(yīng)該嚴(yán)格按照 major.minor.patch組成撤卢。
- 當(dāng)庫發(fā)生不兼容性API更新時(shí)环凿,major應(yīng)該變化
- 當(dāng)庫發(fā)生有兼容性API更新時(shí),minor應(yīng)該變化
- 當(dāng)庫修復(fù)bug時(shí)放吩,patch應(yīng)該變化
3.動(dòng)態(tài)version
你有可能在每次build都想使用庫的最新版本智听,在這種情況可以使用動(dòng)態(tài)version。
dependencies {
//指定最新的patch版本
compile 'com.android.support:support-v4:22.2.+'
//指定最新的minor版本
compile 'com.android.support:appcompat-v7:22.2+'
//指定最新版本
compile 'com.android.support:recyclerview-v7:+'
}
注:應(yīng)該謹(jǐn)慎使用動(dòng)態(tài)version渡紫,可能會(huì)引起不兼容性的情況出現(xiàn)到推。