一篇文章搞懂Android組件化!

如今已經有了不少關於組件化開發的文章了,組件化原理很簡單,可是真正實施起來仍是挺困難的,我本人學習組建化的過程也借鑑了網上先輩們的文章。但大多數文章都從底層的細枝末節開始講述,由下而上給人一種這門技術「博大精深」望而生畏的感受。git

在最近這兩年的時間內,我曾經主導開發過多個採用組件化架構的APP項目,其中有對老項目進行重構的,也有一開始就採用組件化架構的新項目,在這期間踩了很多坑,也積累了很多經驗,現計劃將這些都記錄下來,而我寫這篇文章的初衷就是由上而下,但願別人在閱讀的過程當中可以以爲「組件化原來也就是這幾個東西」的感受,對或者不對歡迎你們一塊兒探討。程序員

因爲內容較多,文末放了組件化相關學習視頻幫助有疑惑的朋友們加深理解,文末有領取!github

首先咱們來看一下組件化項目和傳統項目的區別

在傳統的項目裏

咱們一般狀況下會有一個commonLib的Libary模塊和一個app的application模塊,業務中的邏輯都寫在app中各個功能模塊放到不一樣的包下。這樣作有如下幾個主要的缺點: 1.不管分包作的再好,隨着項目的增大,項目會逐漸失去層次感,別人來接手的時候會很吃力。小程序

2.咱們在debug一個小功能的時候每次修改代碼都須要從新build整個項目,這樣顯的很不合理(不知道AS的熱部署有沒有解決這個問題)微信小程序

3.多人聯合開發在版本管理中很容易出現衝突和代碼覆蓋的問題性能優化

在組件化項目中

除了有commonLib和app模塊外,咱們按照功能劃分各個業務組件模塊(eg:微信能夠劃分出chat,contract,find,mine四個大模塊),以前的包變成如今的模塊,增長了層次感;每一個功能模塊能夠單獨編譯,加快了編譯速度,也爲提供單元模塊測試提供了支持;多人開發只負責本身的模塊,直接避免了版本管理的衝突。微信

在明白了組件化爲咱們解決的主要問題後咱們來看看須要怎麼作

初步實現組建化其實咱們最終要解決的問題就只有2個:架構

1.設置模塊之間的依賴,且使得業務模塊可單獨編譯--經過配置gradle便可解決

2.業務模塊之間的頁面跳轉以及通訊--使用阿里開源的ARouter便可解決

接下來咱們具體來看一下如何操做

首先來看一下模塊間依賴的問題

咱們能夠參照微信的四個模塊(chat,contract,find,mine)來配置

首先咱們項目基本結構以下:app

咱們一共須要建6個module,除了4個功能模塊外還有一個基本的common庫和一個做爲啓動的application。框架

在建好項目後咱們須要給4個module配置一個是否單獨編譯的開關:

關於開關的配置位置這是一個問題,咱們把它添加在gradle.properties文件中,這樣咱們每次修改值的時候就能夠觸發gradle的從新構建,便於咱們單獨編譯module。

咱們單獨編譯的開關配置好了,如今咱們來配置6個module之間的依賴關係:

首先,爲了方便各個module之間的交互咱們借用了阿里的充分ARouter庫,因此在每一個非common的庫(包括主Application)中我都強烈建議加入對ARouter和commonlib的依賴。

其次,4個功能模塊庫咱們要爲它裝上咱們以前配置的是否單獨編譯的開關,咱們須要修改以下2個地方:

能夠看到咱們要修改的就是我紅框框住的地方,當咱們的開關打開的時候,咱們就把他當成一個單獨的application來編譯,而且賦予它一個獨一無二的applicationId,這樣咱們就能夠經過剛剛在gradle.properties中配置的開關來控制它是否單獨做爲一個application來編譯。

而對於咱們的入口module--app模塊咱們則須要作以下的配置:

咱們除了須要配置基本的ARouter以及commonlib依賴之外還須要在app模塊的gradle文件中根據開關選擇是否須要依賴咱們的功能模塊,這個和各個功能模塊中的配置是相呼應的。

而對於其餘組件模塊,重複上述步驟便可完成組件化框架的搭建:

在完成了組件化框架的搭建後咱們來簡單的看看框架中一些具備特點的使用方法。

咱們首先來看一下各個模塊的頁面間是怎樣跳轉的。

咱們以前已經依賴了ARouter(詳細用法參照github.com/alibaba/ARo…),咱們要用它來幫咱們實現跳轉須要如下幾步:

跳轉的方法就如同圖2-1中顯示,咱們須要標明目標頁面,附帶上要傳送的參數,而後調用navigation()就能夠跳轉了,不過有人問目標頁面怎麼看着就是一個路徑,它是怎樣定義的?

  • 首先要用@Route註解標註頁面,並在path變量中給頁面定義一個路徑
  • 對於傳送過來的變量咱們直接定義一個同名的字段用@Autowired變量標註,Arouter會對該字段自動賦值
  • 最後咱們還須要將該頁面注入到ARouter中(原理相似ButterKnife),讓他幫咱們完成咱們須要的工做

這樣,咱們就完成了頁面間的跳轉了,是否是比起咱們傳統的方法更加簡單合理?

最後咱們來看一下組件間如何爲彼此提供服務。

  • 這裏我想在主module中調用home組件的sayHello方法來Toast一我的的名字
  • 那home裏的方法怎樣才能被其餘模塊(包括主模塊和其餘組件模塊)調用

首先在commonlib模塊裏建立一個暴露方法的接口,並定義接口簽名,同時繼承 Iprovider 接口

而後在home模塊中繼承commonlib裏定義的接口,並實現簽名方法。

這裏咱們一樣使用Arouter的 @Router註解來提供此次服務的路由。

最後,咱們在其餘模塊使用 @Autowired 註解就能夠調用該方法了

能夠看到咱們一樣使用了@Autowired註解來初始定baseService服務,並將頁面注入Arouter中便可調用服務中的方法,且對於服務的依賴是基於接口的依賴,大大提升了其靈活性!

基本組件化框架的搭建就完成了,但願認真看完的朋友能有所收穫!若有不正之處還望指正!

須要注意的是,咱們並不要爲了組件化而組件化,咱們要根據實際狀況來決定。若是組件化帶來的好處遠大於單一工程開發,那你就大膽使用組件化開發方案吧。

以上項目的碼雲地(歡迎參與改進): gitee.com/zsq519/ARou…

原文:juejin.im/post/5c207b…

讀者福利:

好了,寫到這裏也結束了,在文章最後放上一個小小的福利,如下爲小編本身在學習過程當中整理出的一個學習思路及方向,從事互聯網開發,最主要的是要學好技術,而學習技術是一條慢長而艱苦的道路,不能靠一時激情,也不是熬幾天幾夜就能學好的,必須養成平時努力學習的習慣,更加須要準確的學習方向達到有效的學習效果。 因爲內容較多就只放上一個大概的大綱,以後還有免費的高級UI、性能優化、移動架構師、NDK、混合式開發(ReactNative+Weex)微信小程序、Flutter全方面的Android進階實踐技術資料。

下面是部分資料截圖,特別適合有3-5年開發經驗的Android程序員們學習。

資料免費領取方式:點贊+加羣Android架構設計(185873940)

  • Android前沿技術—組件化框架設計大綱

  • 全套體系化高級架構視頻——組件化;視頻+源碼+筆記

相關文章
相關標籤/搜索