上篇文章筆者分享的組件化主要是項目內(nèi)組件化,畢竟在一個項目中,組件間也是有一定的耦合性。例如跳轉(zhuǎn)不用Arouter依然可以跳轉(zhuǎn),每個組件不單獨開放接口,也不影響使用。所以項目內(nèi)組件化和項目外組件還是有一定的差別。
組件化不是將大的工程拆分成幾個子工程就叫組件化,組件化的本質(zhì),就是組件在沒有依賴或者很少依賴的情況下和其他組件通信,可以獨立存在的。獨立存在的基礎(chǔ)上,在讓其他組件能正確且便捷的使用它。
這篇文章介紹下,將項目的各個組件單獨抽出,然后單獨扯一個git分支,獨立開發(fā)。然后根據(jù)各個成型的組件,去開發(fā)定制產(chǎn)品。
組件的劃分
要想單獨開發(fā)每一個分支,就必須合理的拆分組件。筆者是給項目拆分了3類組件。分別是業(yè)務(wù)組件、公共業(yè)務(wù)組件、功能組件。
業(yè)務(wù)組件
不同業(yè)務(wù)的功能模塊,具體和公司業(yè)務(wù)相關(guān)。例如我司的業(yè)務(wù)開門模塊,論壇模塊、新聞廣告模塊、電商模塊、金豆集卡模塊、物管模塊等,每一個業(yè)務(wù)模塊都可以劃分成一個業(yè)務(wù)組件。
公共業(yè)務(wù)組件
公共的業(yè)務(wù)邏輯、公共的工具類,以及公共的ui,和通用的自定義view,能被放到這里面的代碼,共性就是至少有2個組件都需要的。
功能組件
例如基礎(chǔ)框架,網(wǎng)絡(luò)組件,緩存組件,支付組件等,這些都是和公司業(yè)務(wù)沒有關(guān)系,每一個項目如果需要都可以直接引入并且使用。
如何引入組件
本地aar引入
在項目使用aar時候,不管是否使用implementation或者api關(guān)鍵字,其相關(guān)依賴都不會被編譯到aar文件中,導(dǎo)致aar自身需要的遠程依賴查找不到。解決方法就是將aar需要的自身依賴在引入aar工程項目中再手動聲明一遍,供aar使用,這樣太不方便了,而且有額外工作量。
經(jīng)過一番查找,發(fā)現(xiàn)碼友們?yōu)榱私鉀Q此問題,有人開發(fā)出來了一個 Gradle 插件 android-fat-aar(https://github.com/adwiv/android-fat-aar ), 這種方式是拋棄 Android Studio 自帶的打包 AAR 的方法,而是自己編寫一個生成 AAR 的腳本。的確沒有難道的程序員,但是唯一不好的就是,需要降低gradle版本,這一點也是我pass掉這種做法的原因,畢竟gradle的版本緊隨谷歌爸爸有利無害。
遠端倉庫引入
如果將library打成aar上傳到遠端倉庫呢?例如jitpack、jcenter、私服等。在嘗試之后可以發(fā)現(xiàn)將aar傳到遠端倉庫,之后遠程依賴引用,項目引入aar之后也可以獲取aar自身需要的遠程依賴。為什么呢?因為aar在上傳私服的時候,他會傳一個.pom文件,而這個pom文件會有記錄它的遠程依賴庫,所以在引入私服的aar時候就會將它的遠程依賴庫隨著下載,供aar使用。私用遠端倉庫無疑是一個不錯的選擇。
但是倉庫這么多,用哪個比較合適呢?jitpack的確方便,畢竟是github登錄,個人賬戶,不適合公司項目。jcenter上傳流程復(fù)雜,而且需要審核時間,這如果要上線豈不是還要等各組件審核通過,沒比較把時間浪費在這。公司內(nèi)部搭建nexus私服,上傳簡單,而且添加權(quán)限無需審核。具體如何通過Jcenter,或者私服可以參考筆者這兩篇文章。
如何將Android studio中Library發(fā)布到Jcenter
https://blog.csdn.net/f917386389/article/details/52121809
如何將Android studio中Library發(fā)布到私服Nexus倉庫
https://blog.csdn.net/f917386389/article/details/87741281
私服上傳問題
1>嵌套依賴問題
如果被打成aar的library,自身除了有三方遠程依賴庫外,還有本地library依賴的外,上傳私服就會報另外一種錯誤,就是查到不到依賴的本地library,奇怪不是pom文件都記錄了它所依賴庫嗎,打開遠端pom文件看到,相應(yīng)的library的version為unspecified。
<dependency>
<groupId>shopcomponent</groupId>
<artifactId>mylibrary</artifactId>
<version>unspecified</version>
<scope>compile</scope>
</dependency>
</dependencies>
因為maven是通過在進行對庫的管理,上傳時候并沒有版本,所以它也無法設(shè)置版本號。所以如果使用私服maven管理aar的時候,你需要將aar依賴的本地library先上傳到私服maven,然后這個library在gradle去依賴,在將這個library打成aar傳私服maven,然后通過方式去引入。
2>不同倉庫類型使用
每一次修改代碼都需要aar重新打包,上傳,如果你沒有變更版本號,就會報次錯,因為release版本不運行相同版本存在。nexus私服為了解決這個不便,新增了不同類型的倉庫。一個是release,一個是snapshot。其中snapshot適合我們平時開發(fā)時候,每次修改代碼無須修改版本號,直接打包提交,也能成功上傳,并且可以下載使用。
需要注意的是,要使用snapshot倉庫不僅僅是更換倉庫地址,而且需要將上傳的aar的版本信息后面添加-SNAPSHOT才可以,切記!
3>Android Studio引入的External Libraries存放在本地什么地方?
有時間我們需要更新新的library版本,由于本地有緩存,點擊同步不能下載下來,我們可以找到本地library手動刪除,在去同步下載。
Mac系統(tǒng)默認下載到:
/Users/(用戶名)/.gradle/caches/modules-2/files-2.1
Windows系統(tǒng)默認下載到:
C:\Users\(用戶名)\.gradle\caches\modules-2\files-2.1
組件的整合
在做定制產(chǎn)品時候,需要將不同的業(yè)務(wù)組件整合到一塊,不同的業(yè)務(wù)組件里面會包含相同的公共業(yè)務(wù)組件以及功能組件。之前想著用implementation取代api引入,因為在android studio3.0之后,implementation和api取代了compile,而且implementation不可以向上傳遞依賴。但是這個是有前提的,前提是都是本地引入,對于遠端倉庫引入library時,無論是implementation還是api依舊可以傳遞依賴。例如引入不同的業(yè)務(wù)組件,它們都包含公共業(yè)務(wù)組件以及功能組件,這時候gradle引入的私服倉庫時候,它會自動去重,優(yōu)先取第一個引入的。如果你強行要過濾某個組件,可以使用exclude關(guān)鍵字。
implementation ('com.zzti.fyg:logincomponent:0.0.1-SNAPSHOT',{
exclude group: 'com.zzti.fyg',module: 'basebusiness'
})
統(tǒng)一不同業(yè)務(wù)組件的buildTypes
每一個library 中的 build.gradle 文件設(shè)置都可以設(shè)置 buildTypes 代碼,但通過 要上傳到私服上的 aar 包只能是 release 版本,自然也無法獲取到那些動態(tài)配置的常量值。例如切換線上線下地址,畢竟我們最后更換Build Variants是要手動切換,所以我的做法是由殼添加變量,然后傳入basebusiness組件中,然后每一個業(yè)務(wù)組件接口請求都需要baseurl,這個baseurl都通過basebusiness組件中去獲取。這樣就可以通過更改殼的buildTypes,來更換所有業(yè)務(wù)組件的buildTypes變量。