這一系列暫不更新,相關技術討論,請移步微信羣,謝謝,但願你們多多支持!android
這會是一個系列,因此若是你尚未看我以前的幾篇文章,請先查看如下文章:c++
Gradle for Android 第二篇( Build.gradle入門 )segmentfault
依賴管理是Gradle最閃耀的地方,最好的情景是,你僅僅只需添加一行代碼在你的build文件,Gradle會自動從遠程倉庫爲你下載相關的jar包,而且保證你可以正確使用它們。Gradle甚至能夠爲你作的更多,包括當你在你的工程裏添加了多個相同的依賴,gradle會爲你排除掉相同的jar包。在這一章咱們將學習如下內容:網絡
倉庫app
本地依賴
詳解依賴這一律念
當咱們討論依賴的時候,咱們一般說的是遠程倉庫,就像那些依賴庫專門用來提供給其餘開發者使用的依賴庫。手動管理依賴將會爲你帶來很大麻煩。你必須定位到該依賴文件位置,而後下載jar文件,複製該文件到你的項目,而後引用它們。一般這些jar文件尚未具體的版本號,因此你還必須去記憶它們的版本號,這樣當須要更新的時候,你纔會知道須要替換成哪一個版本。你同時必須將該依賴包放在svn或者git上,這樣你的其餘同事才能夠不用手動去下載這些依賴jar。
使用遠程倉庫能夠解決這些問題,一個倉庫能夠被視爲一些文件的集合體。Gradle不會默認爲你的項目添加任何倉庫。因此你須要把它們添加到repositories方法體內。若是是使用的是Android studio,那麼工具已經爲你準備好了這一切:
repositories { jcenter() }
Gradle支持三種不一樣的倉庫,分別是:Maven和Ivy以及文件夾。依賴包會在你執行build構建的時候從這些遠程倉庫下載,固然Gradle會爲你在本地保留緩存,因此一個特定版本的依賴包只須要下載一次。
一個依賴須要定義三個元素:group,name和version。group意味着建立該library的組織名,一般這會是包名,name是該library的惟一標示。version是該library的版本號,咱們來看看如何申明依賴:
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' }
爲了方便,Gradle會默認預約義三個maven倉庫:Jcenter和mavenCentral以及本地maven倉庫。你能夠同時申明它們:
repositories { mavenCentral() jcenter() mavenLocal() }
Maven和Jcenter倉庫是很出名的兩大倉庫。咱們不必同時使用他們,在這裏我建議大家使用jcenter,jcenter是maven中心庫的一個分支,這樣你能夠任意去切換這兩個倉庫。固然jcenter也支持了https,而maven倉庫並無。
本地maven庫是你曾使用過的全部依賴包的集合,固然你也能夠添加本身的依賴包。默認狀況下,你能夠在你的home文件下找到.m2的文件夾。除了這些倉庫外,你還可使用其餘的公有的甚至是私有倉庫。
有些組織,建立了一些有意思的插件或者library,他們更願意把這些放在本身的maven庫,而不是maven中心庫或jcenter。那麼當你須要是要這些倉庫的時候,你只須要在maven方法中加入url地址就好:
repositories { maven { url "http://repo.acmecorp.com/maven2" } }
一樣的,Ivy倉庫也能夠這麼作。Apache Ivy在ant世界裏是一個很出名的依賴管理工具。若是你的公司有本身的倉庫,若是他們須要權限才能訪問,你能夠這麼編寫:
repositories { maven { url "http://repo.acmecorp.com/maven2" credentials { username 'user' password 'secretpassword' } } }
注意:這不是一個好主意,最好的方式是把這些驗證放在Gradle properties文件裏,這些咱們已經介紹過在第二章。
可能有些狀況,你須要手動下載jar包,或者你想建立本身的library,這樣你就能夠複用在不一樣的項目,而沒必要將該library publish到公有或者私有庫。在上述狀況下,可能你不須要網絡資源,接下來我將介紹如何是使用這些jar依賴,以及如何導入so包,如何爲你的項目添加依賴項目。
若是你想爲你的工程添加jar文件做爲依賴,你能夠這樣:
dependencies { compile files('libs/domoarigato.jar') }
若是你這麼作,那會很愚蠢,由於當你有不少這樣的jar包時,你能夠改寫爲:
dependencies { compile fileTree('libs') }
默認狀況下,新建的Android項目會有一個lib文件夾,而且會在依賴中這麼定義(即添加全部在libs文件夾中的jar):
dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) }
這也意味着,在任何一個Android項目中,你均可以把一個jar文件放在到libs文件夾下,其會自動的將其添加到編譯路徑以及最後的APK文件。
用c或者c++寫的library會被叫作so包,Android插件默認狀況下支持native包,你須要把.so文件放在對應的文件夾中:
app ├── AndroidManifest.xml └── jniLibs ├── armeabi │ └── nativelib.so ├── armeabi-v7a │ └── nativelib.so ├── mips │ └── nativelib.so └── x86 └── nativelib.so
若是你想分享一個library,該依賴包使用了Android api,或者包含了Android 資源文件,那麼aar文件適合你。依賴庫和應用工程是同樣的,你可使用相同的tasks來構建和測試你的依賴工程,固然他們也能夠有不一樣的構建版本。應用工程和依賴工程的區別在於輸出文件,應用工程會生成APK文件,而且其能夠安裝在Android設備上,而依賴工程會生成.aar文件。該文件能夠被Android應用工程當作依賴來使用。
不一樣的是,你須要加不一樣的插件:
apply plugin: 'com.android.library'
咱們有兩種方式去使用一個依賴工程。一個就是在你的工程裏面,直接將其做爲一個模塊,另一個就是建立一個aar文件,這樣其餘的應用也就能夠複用了。
若是你把其做爲模塊,那你須要在settings.gradle文件中添加其爲模塊:
include ':app', ':library'
在這裏,咱們就把它叫作library吧,若是你想使用該模塊,你須要在你的依賴裏面添加它,就像這樣:
dependencies { compile project(':library') }
若是你想複用你的library,那麼你就能夠建立一個aar文件,並將其做爲你的工程依賴。當你構建你的library項目,aar文件將會在 build/output/aar/下生成。把該文件做爲你的依賴包,你須要建立一個文件夾來放置它,咱們就叫它aars文件夾吧,而後把它拷貝到該文件夾裏面,而後添加該文件夾做爲依賴庫:
repositories { flatDir { dirs 'aars' } }
這樣你就能夠把該文件夾下的全部aar文件做爲依賴,同時你能夠這麼幹:
dependencies { compile(name:'libraryname', ext:'aar') }
這個會告訴Gradle,在aars文件夾下,添加一個叫作libraryname的文件,且其後綴是aar的做爲依賴。
有些時候,你可能須要和sdk協調工做。爲了能順利編譯你的代碼,你須要添加SDK到你的編譯環境。你不須要將sdk包含在你的APK中,由於它早已經存在於設備中,因此配置來啦,咱們會有5個不一樣的配置:
compile
apk
provided
testCompile
androidTestCompile
compile是默認的那個,其含義是包含全部的依賴包,即在APK裏,compile的依賴會存在。
apk的意思是apk中存在,可是不會加入編譯中,這個貌似用的比較少。
provided的意思是提供編譯支持,可是不會寫入apk。
testCompile和androidTestCompile會添加額外的library支持針對測試。
這些配置將會被用在測試相關的tasks中,這會對添加測試框架例如JUnit或者Espresso很是有用,由於你只是想讓這些框架們可以出如今測試apk中,而不是生產apk中。
除了這些特定的配置外,Android插件還爲每一個構建變體提供了配置,這讓debugCompile或者releaseProvided等配置成爲可能。若是你想針對你的debug版本添加一個logging框架,這將頗有用。這些內容的詳細介紹,我會在下一個博客裏詳細介紹。
在一些情形中,你可能想使用最新的依賴包在構建你的app或者library的時候。實現他的最好方式是使用動態版本。我如今給大家展現幾種不一樣的動態控制版本方式:
dependencies { compile 'com.android.support:support-v4:22.2.+' compile 'com.android.support:appcompat-v7:22.2+' compile 'com.android.support:recyclerview-v7:+' }
第一行,咱們告訴gradle,獲得最新的生產版本。第二行,咱們告訴gradle,咱們想獲得最新的minor版本,而且其最小的版本號是2. 第三行,咱們告訴gradle,獲得最新的library。
你應該當心去使用動態版本,若是當你容許gradle去挑選最新版本,可能致使挑選的依賴版本並非穩定版,這將會對構建產生不少問題,更糟糕的是你可能在你的服務器和私人pc上獲得不一樣的依賴版本,這直接致使你的應用不一樣步。
若是你在你的build.gradle中使用了動態版本,Android studio將會警告你關於動態版本的潛在問題,就像你下面看到的這樣:
在使用Android studio中,最簡單的添加新依賴包的方法是使用工程結構彈框。從文件按鈕中打開界面,導航到依賴包導航欄,而後你就能夠看到你當前的依賴包了:
當你想添加新的依賴包的時候,能夠點擊綠色的小按鈕,你能夠添加其餘模塊,文件,甚至是上網搜索。
使用Android studio的界面讓你可以很簡單的瀏覽你項目中的全部依賴,而且添加新的依賴包。你沒必要在build.gradle中手動的添加代碼了,而且你能夠直接搜索JCenter庫中的依賴資源。
在這一章裏,咱們瞭解了多種方式添加依賴,咱們學習了什麼是倉庫,以及如何使用他們,同時學習瞭如何在不使用倉庫的狀況下使用jar文件。
你如今知道了依賴包的屬性配置,動態版本控制等。
咱們也談到了關於在多個環境下構建app變種,在下一章,咱們將會學習到什麼是構建變種,以及爲何他們很重要,構建變種將會使得開發測試以及分發app變得更加容易。理解變種的工做原理能夠加快你的開發和分發效率。