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)威指南