第十章 Android Gradle多項目構(gòu)建

Android的多項目和其他基于Gradle構(gòu)建的多項目是差不多碍庵,比如Java多項目映企、Groovy多項目,他們本身都是Gradle的多項目構(gòu)建静浴,唯一的區(qū)別是項目本身屬性堰氓,比如這個項目是Java庫、那個是Android App項目等等苹享。

這一章我們簡單的介紹下Android不同類型的項目双絮,他們?nèi)绾卧O(shè)置,如何引用以及庫項目如何單獨發(fā)布富稻,像因多項目導致的65535等問題我們已經(jīng)在上一章節(jié)做了介紹掷邦,這里就不再重復了。

10.1 Android項目區(qū)別

Android的項目一般分為 庫項目椭赋、應用項目抚岗、測試項目,Android Gradle根據(jù)他們分別有3種插件
com.android.library哪怔、com.android.application宣蔚、com.android.test向抢。

庫項目一般和我們的Java庫非常相似,它比Java多的是一些Android特有的資源等配置胚委。一般一些具有公用特性的類挟鸠、資源等可以抽象成一個庫工程,這樣他們就可以被其他不用的項目引用亩冬;還有一種情況艘希,比如我們的工程非常負責,我們可以根據(jù)我們業(yè)務硅急,把我們的工程分成一個個的庫項目覆享,然后通過一個主的應用項目引用他們,組合起來营袜,就是我們最終的產(chǎn)品->一個復雜的App了撒顿。

應用項目,一般只有一個荚板,它可以打包成我們可發(fā)布的Apk包凤壁,如果工程太復雜,就像上面說的跪另,它會引用很多的庫項目拧抖,以便組成一個最終的App發(fā)布。應用項目有時也會有多個罚斗,比如我們發(fā)布了不同特色的App徙鱼,但是他們又是同類產(chǎn)品,比如QQ的標準版针姿、輕聊版袱吆,他們是同類產(chǎn)品,只不過輕聊版更簡潔距淫,去除了很多冗余的功能绞绒,這時候我們就可以創(chuàng)建兩個應用項目,讓他們引用不用的庫項目榕暇,然后再分別根據(jù)需求做出相應的調(diào)整蓬衡,就可以生成兩個不同的App域醇,滿足不同人群的要求窿冯。

測試項目是我們?yōu)榱藢ξ覀兊腁pp進行測試而創(chuàng)建的膘融,比如測試Activity捂贿、Service、Application等等蛇损,他是Android基于Junit提供的一種測試Android項目的框架方法琢融,讓我們可以方便的對我們的Android App進行測試疗琉,保證質(zhì)量业栅。

10.2 Android多項目設(shè)置

多個項目的設(shè)置和Gradle的多項目是一樣的秒咐,Android也是基于Gradle的谬晕,所以項目其實是Gradle的概念,項目自身的特性才是每個領(lǐng)域的細分和定義携取,比如Android項目攒钳、Java項目等等。

定義一個工程雷滋,包含很多項目不撑,在Gradle中,項目的結(jié)構(gòu)沒有那么多的限制晤斩,不像我們用Eclipse+Ant構(gòu)建的時候燎孟,路徑都限制的很多,比如只能在根目錄下等等尸昧,在Gradle中就沒有這么多限制了,你可以通過文件夾組織你不同的項目旷偿,最終只要在setting.gradle里配置好這些項目即可烹俗。比如如下的項目結(jié)構(gòu):

嚴格的說應該是四個項目,還有一個根項目MyProject萍程。根項目會有一個setting.gradle配置文件幢妄,每個項目里都有一個build.gradle文件,所以他們的結(jié)構(gòu)為:

這就是一個完成的工程了茫负,里面只要再加上一些Java文件蕉鸳、資源等等,就可以編譯運行了忍法,我們看下setting.gradle配置文件潮尝,也是非常簡單的。

就是指定這幾個項目饿序,有時候如果項目的路徑太深勉失,我們可以用如下方法指定配置:

通過如上方法我們直接指定項目的目錄即可。這樣我們整個多項目配置的架子算是搭好了原探,增減項目可以模擬這個框架乱凿。

10.3 庫項目引用和配置

多項目配置好之后,就要引用他們咽弦,尤其是庫項目徒蟆,不然我們多項目協(xié)作開發(fā)還有什么意義呢?一般引用的都是庫項目型型,所以這里我們著重講庫項目引用段审。

Android庫項目引用和Gradle的其他引用是一樣的,都是通過dependencies:

這樣我們就引用了這個lib庫項目输莺,就是這么簡單戚哎,沿用了Gradle的依賴來進行關(guān)系裸诽,關(guān)于Gradle依賴可以請參考我們前面章節(jié)講的。

需要特別說明的是Android App項目不光可以引用Android Lib項目型凳,還可以引用Java Lib項目哦丈冬,這個看我們的需求,Android Lib是打包成一個aar包甘畅,Java Lib是打包成一個jar包埂蕊,如果我們里面有資源,就是用Android Lib疏唾,如果沒有并且是純Java的可以考慮Java Lib蓄氧。

引用Android庫項目是引用的一個庫項目發(fā)布出來的aar包,默認情況下槐脏,Android庫項目發(fā)布出來的包都是release的喉童,當然我們可以通過配置來改變它,比如改成默認發(fā)布的是debug的

這樣我們就改成發(fā)布的是debug版本的aar包了顿天,我們可以通過如上方式配置不同的發(fā)布版本堂氯,只要我們配置的這個名字是合法存在的即可--也就是Assemble任務能夠打包出來的aar包。比如你配置了多個flavor牌废,那么我們發(fā)布的就可以針對不同的flavor+buildtype配置咽白,比如:

這樣我們就發(fā)布了flavor1Debug這個aar包以供其他的的項目引用。

有朋友可能要問了鸟缕,如果想同時發(fā)布多個版本的aar包以供不同的項目引用怎么辦晶框?比如我們要做一個產(chǎn)品,他們有不同的版本懂从,但是都是一個產(chǎn)品授段,比如一個專業(yè)版,一個標版莫绣,他們有一些區(qū)別畴蒲,不光是在App項目里體現(xiàn),在我們的庫工程里也要體現(xiàn)(比如庫工程里針對這兩種版本的資源不一樣)对室,這時候我們需要針對不同的版本模燥,引用不同的發(fā)布的aar包。這是可以做到的掩宜,默認情況下是不能同時發(fā)布多個aar包的蔫骂,我們可以開啟。

這時候就是告訴Android Gradle插件我們這個庫工程要同時發(fā)布不同的aar牺汤,這時候Android Gradle就會生成多個aar以供被其他項目引用辽旋,下面看下我們怎么分別引用他們。

看到這里大家看明白了把,對于lib這個庫項目补胚,我們先配置成可以同時發(fā)布多個aar码耐,然后我們在其他引用工程里做如上示例的引用,比如flavor1這個渠道包就引用flavor1這個渠道對應的lib1庫的release aar包溶其;flavor2這個渠道就引用flavor2這個渠道對應的lib1庫的release aar包骚腥。

以上這些引用都是在項目立直接引用,下一節(jié)我們講如何發(fā)布我們的aar包到Maven中心庫瓶逃,以供其他項目引用束铭。

10.4 庫項目單獨發(fā)布

項目直接依賴一般適用于關(guān)聯(lián)比較緊密、不可復用的項目厢绝,對于這類項目我們可以直接基于源代碼項目的依賴契沫,有時候我們會有一些項目,可以被其他項目所復用昔汉,比如我們的公共組件庫懈万,工具庫等等,這類就可以單獨發(fā)布出去靶病,被其他項目使用钞速,就像我們引用jcenter上的類庫一樣方便,這一節(jié)我們就講如何把庫項目單獨的發(fā)布到我們自己的Maven中心庫.

要搭建自己的Maven私服嫡秕,推薦使用Nexus Repository Manager,版本選擇2.xx苹威,下載地址: http://www.sonatype.com/download-oss-sonatype 昆咽,我這里選擇的是2.12.1版本,我們選擇nexus-2.12.1-01-bundle.tar.gz包下載解壓牙甫,然后找到nexus-2.12.1-01\bin\jsw這個目錄掷酗,可以看到有很多以操作系統(tǒng)和cpu架構(gòu)命名的文件夾,你可以根據(jù)你的系統(tǒng)選擇進入相應的文件夾運行start-nexus腳本即可啟動Nexus窟哺,啟動之后泻轰,我們在瀏覽器里打開 http://localhost:8081/nexus/ 即可訪問,注意看右上角有個Log In鏈接且轨,點擊可以登陸管理Nexus浮声,默認的用戶名是admin,密碼是admin123旋奢。關(guān)于Nexus的搭建和使用泳挥,非常簡單,大家可以Google下相關(guān)文章至朗,很容易的就會入門使用屉符,這里不再多講。

有了部署好的Nexus Maven中心庫之后,我們就可以把我們的項目發(fā)布到我們的中心庫了矗钟,要想通過Maven發(fā)布唆香,首先我們得在build.gradle中應用maven插件:

apply plugin: 'com.android.library'
apply puugin: 'maven'

應用過之后,我們需要配置Maven構(gòu)建的三要素吨艇,他們分別是group:artifact:version躬它。

apply plugin: 'com.android.library'
apply puugin: 'maven'

version  '1.0.0'
group 'ory.flysnow.widget'

group和version比較方便,直接指定即可秸应。對于version還有一個概念-快照版本SNAPSHOT虑凛,比如配置成1.0.0-SNAPSHOT,這時候我們在發(fā)布的時候就會發(fā)布到我們的snapshot中心庫里软啼,每次發(fā)布版本號不會變化桑谍,只會在版本號后之后按順序號+1,比如1.0.0-1祸挪,1.0.0-2锣披,1.0.0-3等等,類似于這樣的贿条,我們引用的時候版本號寫1.0.0-SNAPSHOT即可雹仿,Maven會幫我們下載最新(序號最大的)的快照版本,這種方式適用于聯(lián)調(diào)測試的時候整以,每次修復好測試的問題就發(fā)布一個快照版本胧辽,直到?jīng)]有問題為止,然后再放出release版本公黑,正式發(fā)布邑商。

配置好group和version之后,我們來配置發(fā)布配置凡蚜,比如發(fā)布到到哪個Maven庫人断,使用的用戶名和密碼多少,發(fā)布什么格式的存檔朝蜘,它的artifact是什么等等:

如上所示恶迈,我們配置了uploadArchives,指定對應的mavenDeployer配置谱醇,這里配置了兩個發(fā)布的Maven庫暇仲,一個是release版本的,一個是snapshot版本的副渴,并同時配置了他們的密碼以及URL熔吗,URL是nexus maven提供的,可以打開Nexus網(wǎng)頁版佳晶,點擊右側(cè)的repositorys菜單查看桅狠,里面配置了很多庫,我們也可以新增一些自己的repository。

發(fā)布到Nexus Maven庫之后中跌,我們就可以像引用jcenter中的類庫一樣引用他們咨堤,要使用他們,我們首先得配置我們的倉庫漩符,因為我們新增了一個我們自己的私有Maven庫一喘,這個使用要告訴Gradle,不然它不知道這個私有Maven倉庫的存在嗜暴。

這樣配置后凸克,我們就可以在我們的依賴配置里引用剛剛發(fā)布的aar包啦

剛剛我們講了我們可以發(fā)布快照版本,那么我們?nèi)绾我媚孛屏ぃ恳驗榭煺瞻姹镜膫}庫和Release的不一樣萎战,所以我們還得要新增一個快照版本的倉庫。

引用的時候時候把dependencies依賴換成如下這樣即可:

這樣所以解決了問題舆逃,但是會配置兩個Maven庫蚂维,而且他們非常相似,那么能不能用一個Maven庫代替呢路狮?答案是可以的虫啥,Nexus Maven為我們提供了一種group類型的repository,這種類型的repository可以同時集成好幾個repository奄妨,把他們統(tǒng)一當成一個group來對外發(fā)布涂籽,比如Nexus內(nèi)置的public group,就包含里release和snapshot砸抛,現(xiàn)在我們可以把Maven庫的配置改為

這樣就方便簡潔多了又活,你可以在Nexus里配置public這個分組所管理的repository,可以增減锰悼,看你的需求,也可以新建其他group類型的repository來用团赏,比如根據(jù)你們公司的事業(yè)部來創(chuàng)建不同的group給他們使用箕般,很好的分離開了不同權(quán)限、不同業(yè)務需求的repository舔清。

10.5 小結(jié)

有了前面幾章的知識丝里,這一章的理解簡單的多,因為多項目其實就是不同項目的組合体谒,前面我們已經(jīng)針對單個項目的不同的配置杯聚,所以多項目要做的其實就是針對這些項目,采用Gradle的方式管理組合起來即可抒痒。

這一章節(jié)比較重要的新知識點就是庫項目的單獨發(fā)布幌绍,發(fā)布到Maven中心庫,學會里這個,發(fā)布到其他如jcenter庫就非常簡單了傀广,他們是類似的颁独,你只要在jcenter注冊好賬號,得到發(fā)布的地址即可配置發(fā)布伪冰。


本文屬自學歷程, 僅供參考
詳情請支持原書 Android Gradle權(quán)威指南

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末誓酒,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子贮聂,更是在濱河造成了極大的恐慌靠柑,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,406評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件吓懈,死亡現(xiàn)場離奇詭異歼冰,居然都是意外死亡,警方通過查閱死者的電腦和手機骄瓣,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評論 3 393
  • 文/潘曉璐 我一進店門停巷,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人榕栏,你說我怎么就攤上這事畔勤。” “怎么了扒磁?”我有些...
    開封第一講書人閱讀 163,711評論 0 353
  • 文/不壞的土叔 我叫張陵庆揪,是天一觀的道長。 經(jīng)常有香客問我妨托,道長缸榛,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,380評論 1 293
  • 正文 為了忘掉前任兰伤,我火速辦了婚禮内颗,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘敦腔。我一直安慰自己均澳,他們只是感情好,可當我...
    茶點故事閱讀 67,432評論 6 392
  • 文/花漫 我一把揭開白布符衔。 她就那樣靜靜地躺著找前,像睡著了一般。 火紅的嫁衣襯著肌膚如雪判族。 梳的紋絲不亂的頭發(fā)上躺盛,一...
    開封第一講書人閱讀 51,301評論 1 301
  • 那天,我揣著相機與錄音形帮,去河邊找鬼槽惫。 笑死周叮,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的躯枢。 我是一名探鬼主播则吟,決...
    沈念sama閱讀 40,145評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼锄蹂!你這毒婦竟也來了氓仲?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,008評論 0 276
  • 序言:老撾萬榮一對情侶失蹤得糜,失蹤者是張志新(化名)和其女友劉穎敬扛,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體朝抖,經(jīng)...
    沈念sama閱讀 45,443評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡啥箭,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,649評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了治宣。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片急侥。...
    茶點故事閱讀 39,795評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖侮邀,靈堂內(nèi)的尸體忽然破棺而出坏怪,到底是詐尸還是另有隱情,我是刑警寧澤绊茧,帶...
    沈念sama閱讀 35,501評論 5 345
  • 正文 年R本政府宣布铝宵,位于F島的核電站,受9級特大地震影響华畏,放射性物質(zhì)發(fā)生泄漏鹏秋。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,119評論 3 328
  • 文/蒙蒙 一亡笑、第九天 我趴在偏房一處隱蔽的房頂上張望侣夷。 院中可真熱鬧,春花似錦仑乌、人聲如沸百拓。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至祠够,卻和暖如春压汪,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背古瓤。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評論 1 269
  • 我被黑心中介騙來泰國打工止剖, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留腺阳,地道東北人。 一個月前我還...
    沈念sama閱讀 47,899評論 2 370
  • 正文 我出身青樓穿香,卻偏偏與公主長得像亭引,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子皮获,可洞房花燭夜當晚...
    茶點故事閱讀 44,724評論 2 354

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,107評論 25 707
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理焙蚓,服務發(fā)現(xiàn),斷路器洒宝,智...
    卡卡羅2017閱讀 134,654評論 18 139
  • #在生活中如何改變自己 ##我們中間的各種事情讓你繁雜不堪 我們總會看到好多的事情不會如人意购公。所以我們該如何制造自...
    f46b0f4e2bc8閱讀 326評論 0 1
  • 參考目標: 1份肉2份豆制品3份“新鮮”水果4份谷物/薯5份蔬菜,深綠色葉菜最好6杯水 今日總結(jié): 食物種類:23...
    靜趣_兒童心理師閱讀 179評論 0 0
  • 常被人說雁歌,“白日做夢”宏浩,“想法是挺好”,“你得現(xiàn)實一些” 這就是我們這一類人靠瞎,二十多歲比庄,正是鼓起帆,準備出海的年紀...
    商山君的小火爐閱讀 911評論 0 2