Android組件化

後期我會面試50家互聯網公司,不斷總結完善和思考,寫出一本完美的安卓面試書籍,大家支持我嗎?

1、組件化和插件化區別:
1.1組件化開發:
(1)、組件化是將一個app分成多個Module,每個Module都是一個組件;
(2)、組件化在發佈的時候,所有組件以lib的形式被主app工程依賴,並打包成1個apk,不支持動態加載。

插件化開發:
(1)、插件化是將整個app拆分成很多模塊,這些模塊包括一個宿主和多個插件,每個模塊都是一個apk;
(2)插件化在發佈的時候,可以將宿主apk和插件apk,分開或者聯合打包,在運行時,宿主apk可以動態加載某個插件apk。

相同點:
(1)、兩者都是爲了使項目模塊化解耦;
(2)、二者中組件或者插件都可以單獨調試。

2、組件化的優點和缺點:
2.1組件化的有點
(1)、業務隔離;
(2)、單獨以app運行能提高開發及調試效率;
(3)、組件化之後,很容易地實現一些組件層面的AOP,比如打開頁面的時候進行異步數據加載;
2.2組件化的缺點:
(1)、每個組件都需要依賴公用庫,會拖慢整體編譯速度;

3、CC組件化原理
cc組件化中,組件之間通信採用了組件總線通信的方式,在組件管理類(ComponentMananger)中註冊了所有組件對象,當請求某個組件服務時,ComponentMananger通過查找映射表找到組件對象並調用並返回結果,它支持同步異步調用組件和同步異步實現組件,並且支持跨app調用組件。

3.1、app內部調用流程是



當組件a需要請求組件b的服務時,它就通過cc去調用cm,然後cm查找路由表,找到對應組件,進行調用,最後將結果返回給組件a。

3.2、跨app調用流程



當app1中的組件a請求app2中的組件B的服務時,它依然是通過cc調用cm,cm路由表中不存在組件B,它會通過BroadReceiver+Localsocket和app2建立通信,然後app2中的cm去查找自身的路由表,如果存在組件B,就就行調用,然後將結果通過LocalSocke返回給組件a。

3.3、app內部,組件之間的具體調用流程


3.4、跨app調用流程


3.5、cc監控策略
在ChainProcessor開啓攔截器鏈的之前是調用CCMonitor.addMonitorFor(cc);將此次調用流程加入到監控隊列中。
在CCMonitor中維護這一個ConcurrentHashMap<String, CC>,並且使用minTimeoutAt記錄ConcurrentHashMap中cc的最短超時時間,當ConcurrentHashMap不爲時,就會開啓一個監控線程去檢測這個map中的cc,具體的過程就是監控線程先阻塞minTimeoutAt秒,然後去遍歷map,超時cc從map中去除並調用cc.timeout,終止調用流程(設置將finished設爲ture,每個攔截器調用chain.proceed之前會檢測finished,如果爲true就終止流程),然後在遍歷的過程中篩選出隊列中剩餘最短的超時時間minTimeoutAt,再次循環檢測。直到map爲空,監控線程停止。(注意:當新加入的cc超時時間比minTimeoutAt小時,主動喚醒監控線程)。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章