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內部呼叫流程是

app內部呼叫流程.png
當元件a需要請求元件b的服務時,它就通過cc去呼叫cm,然後cm查詢路由表,找到對應元件,進行呼叫,最後將結果返回給元件a。
3.2、跨app呼叫流程

跨app呼叫流程.png
當app1中的元件a請求app2中的元件B的服務時,它依然是通過cc呼叫cm,cm路由表中不存在元件B,它會通過BroadReceiver+Localsocket和app2建立通訊,然後app2中的cm去查詢自身的路由表,如果存在元件B,就就行呼叫,然後將結果通過LocalSocke返回給元件a。
3.3、app內部,元件之間的具體呼叫流程

app內部元件呼叫流程.png
3.4、跨app呼叫流程

跨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小時,主動喚醒監控執行緒)。