您的位置:首頁(yè) >  新聞中心 > 云通訊公告
  云通訊公告
 

Android架構(gòu)師必會(huì):組件化開(kāi)發(fā)及框架

來(lái)源:原創(chuàng)    時(shí)間:2017-10-23    瀏覽:0 次

打造自己的組件化開(kāi)發(fā)框架
 
為什么會(huì)有這篇文章:長(zhǎng)時(shí)間的build,不斷重復(fù)出現(xiàn)的bug,多次重復(fù)開(kāi)發(fā)的煩躁
 
 
1組件化介紹
 
0、什么是組件化
 
組件化就是將工程按照不同的屬性拆分成各個(gè)獨(dú)立的子工程的過(guò)程。
組件是組件化的輸出產(chǎn)物,不同的組件最終進(jìn)行組裝就是完整的工程。
1、為什么要做組件化
 
用產(chǎn)品思維的一個(gè)理念就是,為了更容易讓用戶(開(kāi)發(fā)人員以及測(cè)試人員)做正確的事情。因?yàn)殡S著業(yè)務(wù)越來(lái)越復(fù)雜,代碼量越來(lái)越盤大的時(shí)候,開(kāi)發(fā)人員在開(kāi)發(fā)新功能或修改bug的時(shí)候有時(shí)候會(huì)不小心將其他正常的功能修改出新bug。而組件化之后,每一個(gè)組件都是獨(dú)立的互不影響。開(kāi)發(fā)完成后,也能對(duì)單個(gè)組件進(jìn)行單獨(dú)發(fā)布,測(cè)試人員就能對(duì)該組件進(jìn)行單獨(dú)的測(cè)試,而不用受其他不相關(guān)的組件的影響。
 
2、組件化與模塊化和插件化的區(qū)別
 
組件化與模塊化的差別  
 
組件的粒度大于模塊,組件由數(shù)個(gè)不同的模塊按需組合而來(lái)。
 
組件化與插件化的差別
 
 
組件化與插件化的區(qū)別.png
 
差別在于,組件化是編譯時(shí)合并到主工程,插件化是運(yùn)行時(shí)加載到主工程
 
3、組件化的優(yōu)點(diǎn)和缺點(diǎn)
 
優(yōu)點(diǎn):
   單獨(dú)編譯,便于開(kāi)發(fā),提升編譯速度。
   組件分離,便于維護(hù),提高重用效率。
   單獨(dú)發(fā)布,便于測(cè)試,提升測(cè)試準(zhǔn)度。
缺點(diǎn):
   對(duì)開(kāi)發(fā)管理的要求更高
 
 
 
2組件化的架構(gòu)設(shè)計(jì)
0、設(shè)計(jì)要求
 
  1. 穩(wěn)定高可用
  2. 靈活發(fā)布
  3. 可復(fù)用
1、整體架構(gòu)設(shè)計(jì)圖
 
  首先我們先看一下常規(guī)的架構(gòu)設(shè)計(jì)
 
 
 
  再看業(yè)務(wù)模塊化后的架構(gòu)設(shè)計(jì)
 
 
 
  最后是組件化的架構(gòu)設(shè)計(jì)
 
 
2、組件交互
 
 
 
 
  因?yàn)榻M件與組件之間不能相互引用,所以組件與組件的交互需要一個(gè)中間件Router,組件進(jìn)行交互之前需要通過(guò)Router進(jìn)行尋址中轉(zhuǎn)傳遞彼此的接口。
3、工程發(fā)布流圖
 
 
 
  與正常發(fā)布流程相同,先打包組件,然后最終在App中將組件合并后打包為apk文件發(fā)布。
 
 
3組件化的技術(shù)難點(diǎn)
 
 
0、熱插拔的實(shí)現(xiàn)
 
  熱插拔不是一個(gè)新詞,這里的熱插拔的與常規(guī)的還是有一定的區(qū)別。
  熱插拔:添加依賴(插),則這個(gè)組件的數(shù)據(jù)庫(kù)、組件初始化、組件接口自動(dòng)可用,去除依賴(拔),則這個(gè)組件的所有功能全部移除,并且不影響其他組件的編譯和發(fā)布。詳細(xì)看下面的數(shù)據(jù)庫(kù)和App初始化的工作流程
1、數(shù)據(jù)庫(kù)合并與拆分
 
  實(shí)現(xiàn)方式:
 
  方式1、在App中添加配置文件db_libraries.properties,配置文件中添加對(duì)應(yīng)的組件的TableSetHelper,數(shù)據(jù)庫(kù)初始化時(shí)讀取配置文件中的內(nèi)容通過(guò)反射調(diào)用組件中的TableSetHelper的方法。
 
  兼容方式2、(如果沒(méi)有配置文件才執(zhí)行)數(shù)據(jù)庫(kù)初始化時(shí)掃描所有的Class,找出所有extends TableSetHelper并有@TableSetLibrary注解的Class,反射調(diào)用其中的方法。
 
數(shù)據(jù)庫(kù)設(shè)計(jì)uml類圖
 
 
 
數(shù)據(jù)庫(kù)合并及升級(jí)流程圖
 
 
組件化數(shù)據(jù)庫(kù)合并.png
2、組件Application生命周期
實(shí)現(xiàn)方式:
 
方式1:在App中添加配置文件app_libraries.properties,配置文件中添加對(duì)應(yīng)的組件的Application,App初始化時(shí)讀取配置文件中的內(nèi)容通過(guò)反射調(diào)用組件中的Application的生命周期方法。
 
兼容方式2:(如果沒(méi)有配置文件才執(zhí)行)App初始化時(shí)掃描所有的Class,找出所有extends Application并有@Applibrary注解的Class,反射調(diào)用其中的生命周期方法。
 
App初始化流程設(shè)計(jì)uml類圖
 
 
Applibrary.png
App初始化流程
 
App初始化流程.png
3、組件之間的解耦與交互
 
為了達(dá)到組件之間的解耦,組件之間不能直接依賴,采用Router中間件的方式進(jìn)行轉(zhuǎn)接。
 
組件之間交互流圖
 
 
數(shù)據(jù)路由訪問(wèn)流圖.png
使用方法:  
 
Router module中添加對(duì)應(yīng)的接口
 
 
在實(shí)現(xiàn)的Module中(ModuleA)添加對(duì)應(yīng)的實(shí)現(xiàn)
 
 
編譯時(shí)IOC框架會(huì)掃描獲取到Data注解,自動(dòng)在對(duì)應(yīng)的ModuleA中生成一個(gè)類
 
 
在另一個(gè)ModuleB中要使用這個(gè)接口時(shí)調(diào)用
 DataRouter.findApi(ISum.class)
 
DataRouter會(huì)嘗試調(diào)用
 
ISum sum = ISumImpFactory.generator();
 
返回給ModuleB。 ModuleB 就能使用sum與ModuleA進(jìn)行交互。
 
4、android.library依賴注入問(wèn)題
 
在Library類型的Module中,R文件的ID并不是常量,這將導(dǎo)致ioc注入框架無(wú)法正常使用,這里的解決辦法是利用Gradle動(dòng)態(tài)復(fù)制一份R類生成新的R文件(K.java),使用的時(shí)候使用新生成的K文件即可。
 
 
5、Activity交互回調(diào)
 
Activity、Service等之間的數(shù)據(jù)交互均是使用Bundle傳遞,而B(niǎo)undle只能傳遞基礎(chǔ)數(shù)據(jù)類型以及Serializable序列化的對(duì)象,這樣有比較大的局限性,尤其是某個(gè)Activity需要接收多種數(shù)據(jù)回調(diào)的時(shí)候尤其不方便。
 
這里研究了一種新的方式:使用Java的動(dòng)態(tài)代理傳遞一個(gè)代理的接口回調(diào)給Bundle,然后使用代理的回調(diào)對(duì)象與調(diào)用者進(jìn)行交互。
 
代碼示例:
 
 
 
 
 
4開(kāi)發(fā)管理
 
 
說(shuō)了這么多,看起來(lái)這么復(fù)雜,開(kāi)發(fā)的時(shí)候會(huì)不會(huì)很難,發(fā)布的時(shí)候會(huì)不會(huì)很麻煩?其實(shí)跟正常發(fā)布沒(méi)有任何區(qū)別。
 
 
 
后面會(huì)對(duì)其中的技術(shù)問(wèn)題進(jìn)行一一詳解。


免费视频观无码一区,国内精品一区二区无码,99精品无码视频在线播放,ā片国产在线播放