一、Android組件化含義
組件化是指解耦復(fù)雜系統(tǒng)時,將多個功能模板拆分、重組的過程。在Android工程表現(xiàn)上就是把app按照其業(yè)務(wù)的不同,劃分為不同的Module。組件化架構(gòu)的目的就是讓每個業(yè)務(wù)模塊變得相對獨立,各個組件在組件模式下可以獨立開發(fā)調(diào)試,集成模式下又可以集成到“app殼工程”中,從而得到一個具有完整功能的APP。
二、為什么要Android組件化
1、提高工程編譯速度
進行組件化拆分后,每個業(yè)務(wù)或者功能都是一個單獨的工程,這個單獨的工程可以獨立編譯運行,拆分后的工程通常都比較小,代碼量也比較少,我再也不用像以前編譯一下得等待好幾分鐘了。
2、利于多人團隊協(xié)作開發(fā)
業(yè)務(wù)組件之間不能相互引用,每個組件都把對應(yīng)的業(yè)務(wù)功能收斂在一個工程里,彼此互不打擾。 在多人團隊里,每個人只負(fù)責(zé)自己的業(yè)務(wù)模塊,他對業(yè)務(wù)功能的增刪改查,都只限定在自己的這個業(yè)務(wù)模塊里,不會影響其他人的業(yè)務(wù),他代碼質(zhì)量的好壞也只會影響到自己的業(yè)務(wù)模塊;對測試來說,也十分方便,大部分情況下,我們只需要著重測試修改過的業(yè)務(wù)組件即可,而不用老是進行全部回歸測試。
3、組件化是功能重用的基石
業(yè)務(wù)組件類似一個個積木一樣,我們可以用積木搭建出不同的房子,同理我們也可以創(chuàng)建多個不同的APP。我們只需要維護好每個組件,需要用到該組件的功能時,一建引用集成就可以了。
4、提高組件復(fù)用性
可能有些人會覺得,提高復(fù)用性很簡單,直接把需要復(fù)用的代碼做成Android Module,打包AAR并上傳代碼倉庫,那么這部分功能就能被方便地引入和使用。但是我們覺得僅僅這樣是不夠的,上傳倉庫的AAR庫是否方便被復(fù)用,需要組件化的規(guī)則來約束,這樣才能提高復(fù)用的便捷性。
5、降低組件間的耦合
我們需要通過組件化的規(guī)則把代碼拆分成不同的模塊,模塊要做到高內(nèi)聚、低耦合。模塊間也不能直接調(diào)用,這需要組件化通信框架的支持。降低了組件間的耦合性可以帶來兩點直接的好處:
代碼更便于維護降低了模塊的Bug率三、Android組件化基礎(chǔ)
1、組件之間的跳轉(zhuǎn)
組件化中兩個功能模塊時不直接依賴的,其依賴規(guī)則是通過 Base module 間接依賴,當(dāng)組件之間的 Activity 進行界面跳轉(zhuǎn)時,由于沒有相互依賴的關(guān)系,往往會無法引用另一個 module 中的 Activity。
2、隱式跳轉(zhuǎn)
隱式跳轉(zhuǎn)是通過 Android 原生 Intent 匹配機制來實現(xiàn)相應(yīng)跳轉(zhuǎn),就是使用 Action 來跳轉(zhuǎn)到對應(yīng)的 Activity,這樣使用隱式跳轉(zhuǎn)的方式就可以跨 module 實現(xiàn) Activity 之間的跳轉(zhuǎn)了,注意一點,如果移出 Activity 所在的 module 而不移出相應(yīng)的跳轉(zhuǎn),如果繼續(xù)跳轉(zhuǎn)會出現(xiàn)異常,使用隱式 Intent 跳轉(zhuǎn)需要驗證是否會接收該 Intent,需要對該 Intent 對象調(diào)用 resolveActivity() 方法來判斷至少有一個應(yīng)用能夠處理該 Intent,通過隱式跳轉(zhuǎn)的方式還可以設(shè)置 exported 為 false 來確保只有自己的 App 才能夠啟動對應(yīng)的組件。
3、ARouter跳轉(zhuǎn)
在 Android 開發(fā)中可將 module 看成不同的網(wǎng)絡(luò),而對應(yīng)的 Router 就是連接各個 module 的中轉(zhuǎn)站,這個中轉(zhuǎn)站可以對頁面跳轉(zhuǎn)的參數(shù)等進行統(tǒng)一處理,ARouter 是阿里開源出來的一個頁面跳轉(zhuǎn)路由,使用 ARouter 可以替代隱式跳轉(zhuǎn)來完成不同 module、不同組件之間的跳轉(zhuǎn)以及跳轉(zhuǎn)過程的監(jiān)聽、參數(shù)的傳遞等,ARouter 支持路徑跳轉(zhuǎn)和 URL 跳轉(zhuǎn)兩種方式,使用也非常靈活,ARouter 的具體使用這里不做介紹,其具體使用會在單獨一篇文章中詳解,ARouter 與 Android 傳統(tǒng)跳轉(zhuǎn)方式的對比如下:
顯示跳轉(zhuǎn)需要依賴于類,而路由跳轉(zhuǎn)通過指定的路徑跳轉(zhuǎn);隱式跳轉(zhuǎn)通過 AndroidManifest 集中管理,導(dǎo)致協(xié)作開發(fā)困難;原生使用 AndroidManifest 來注冊,而路由使用注解注冊原生 startActivity 之后跳轉(zhuǎn)過程交由 Android 系統(tǒng)控制,而路由跳轉(zhuǎn)采用的是 AOP 切面編程可對跳轉(zhuǎn)過程進行攔截和過濾。4、動態(tài)創(chuàng)建
組件化開發(fā)中最重要的一點就是各個模塊、各個組件之間要盡可能解耦,這樣很容易就會想到使用 Java 中的反射機制,使用反射可在運行狀態(tài)下獲取某個類的所有信息,然后就可以動態(tài)操作這個類的屬性和方法了。如果 Fragment 單獨作為一個組件來使用時,當(dāng)這個 Fragment 組件不需要被移出后,如果是常規(guī)的 Fragment 則會因為索引不到該 Fragment 而使得 App 崩潰,想一下如果使用反射創(chuàng)建 Fragment 的方式則至少不會引起 App 崩潰,這里可以捕捉異常完成相關(guān)邏輯,這樣是不是降低了耦合呢。可見,雖然反射有一定的性能問題,但使用反射確實能在一定程度上降低耦合,學(xué)習(xí)組件化 Java 反射機制應(yīng)該是必須的一部分。
延伸閱讀1:組件化結(jié)構(gòu)
app殼:負(fù)責(zé)管理各個業(yè)務(wù)組件和打包APK,沒有具體的業(yè)務(wù)功能;業(yè)務(wù)組件層:最上層的業(yè)務(wù),每個組件表示一條完整的業(yè)務(wù)線,彼此之間相互獨立;功能/基礎(chǔ)組件層:支撐上層業(yè)務(wù)組件運行的基礎(chǔ)業(yè)務(wù)服務(wù);基礎(chǔ)庫:包含了各種開源庫以及和業(yè)務(wù)無關(guān)的一個自研工具庫。