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