1. 程式人生 > >Android 專案架構演進

Android 專案架構演進

浪費了“黃金五年”的Java程式設計師,還有救嗎? >>>   

入職安居客三年從工程師到Team Leader,見證了Android團隊一路走來的發展歷程。因此有心將這些記錄下來與大家分享,也算是對自己三年來一部分工作的總結。希望對大家有所幫助,更希望能得到大家寶貴的建議。

一、三網合併

三年前入職時安居客在業務上剛完成了三網合併(新房、二手房、好租和商業地產多個平臺多個網站合成現在的[

http://anjuke.com],這在公司歷史上稱之為三網合併),因此app端也將原先的新房、二手房、好租和商業地產多個app合併成為了現在的安居客app。所謂的合併也差不多就是將多個專案的程式碼拷貝到了一起組成了新的Anjuke Project。下面這張圖能更加直觀的呈現當時的狀況。

這一時期程式碼結構混亂、層次不清,各業務技術方案不統一,冗餘程式碼充斥專案的各個角落;甚至連基本的包結構也是胡亂不堪,專案架構更是無從談起。大家只不過是不停地往上堆砌程式碼新增新功能罷了。於是我進入公司的第一件事就是向Leader申請梳理了整個專案的結構。

而後隨著專案的迭代,我們不斷引入了Retrofit、UniversalImageLoader、OKHttp、ButterKnife等一系列成熟的開源庫,同時我們也開發了自己的UI元件庫UIComponent、基礎工具庫CommonUtils、基於第三方地圖封裝的MapSDK、即時聊天模組ChatLibrary等等。這之後安居客專案架構大致演變成了由基礎元件層、業務元件層和業務層組成的三層架構。如下圖:

其中業務層是一種非標準的MVC架構,Activity和Fragment承擔了View和Controller的職責:

前面這種分層的架構本身是沒太大問題的,即使到了現在我們的業務專案也已然是基於這種分層的架構來構建的,只不過在不斷的迭代中我們做了些許調整(分層架構後面在介紹元件化和模組化的時候會詳細介紹)。但是隨著業務的不斷迭代,我們慢慢發現業務層這種非標準的MVC架構帶來了種種影響團隊開發效率的問題:

  • Activity和Fragment越來越多的同時承擔了Controller和View的職責,導致他們變得及其臃腫且難以維護;
  • 由於Controller和View的揉合,導致單元測試起來很困難;
  • 回撥巢狀太多,面對複雜業務時的程式碼邏輯不清晰,難以理解且不利於後期維護;
  • 各層次模組之間職責不清晰等等

鑑於三網合併時期我還未加入安居客,所以對這一塊的理解難免有偏差,如果有安居客的老同事發現文章中的描述有不對的地方還望批評指正。

二、由RxJava驅動的MVP架構

一種技術架構無法滿足所有的業務專案,更不可能有一種架構方案能夠一勞永逸。正如上一節中提到的隨著業務的不斷迭代,現有架構的缺陷逐漸浮出水面,專案架構必需不斷升級迭代才能更好地服務於業務。

2.1 MVP的設計與實現

在研究了Google推出的基於MVP架構的demo後,我們發現MVP架構能解決現在所面臨過的很多問題,於是我們學習並引入到了我們的專案中來,並針對性的做了部分調整。下圖呈現的是安居客MVP方案:

以前面提到的三層架構的方案來看是這樣的:

  • View Layer: 只負責UI的繪製呈現,包含Fragment和一些自定義的UI元件,View層需要實現ViewInterface介面。Activity在專案中不再負責View的職責,僅僅是一個全域性的控制者,負責建立View和Presenter的例項;
  • Model Layer: 負責檢索、儲存、操作資料,包括來自網路、資料庫、磁碟檔案和SharedPreferences的資料;
  • Presenter Layer: 作為View Layer和Module Layer的之間的紐帶,它從model層中獲取資料,然後呼叫View的介面去控制View;
  • Contract: 我們參照Google的demo加入契約類Contract來統一管理View和Presenter的介面,使得某一功能模組的介面能更加直觀的呈現出來,這樣做是有利於後期維護的。

另外這套MVP架構還為我們帶來了一個額外的好處:我們有了足夠明確的開發規範和標準。細緻到了每一個類應該放到哪個包下,哪個類具體應該負責什麼職責等等。這對於我們的Code Review、接手他人的功能模組等都提供了極大的便利。前面提到的[MinimalistWeather]就是為了定規範定標準而開發的。

這一時期我們還在專案中引入了RxJava,很好的解決了前面提到的巢狀回撥的問題,同時能夠幫助我們簡化複雜業務場景下的程式碼邏輯(當然RxJava的好處遠遠不止這麼一點,對RxJava不瞭解的同學可以去翻翻我之前[一系列關於RxJava的文章]。我們也將網路庫升級到了Retrofit2+OKHttp3,它們和RxJava之間能更好的配合。

2.2 MVP帶來的新問題及解決方案

是不是升級到了MVP架構就高枕無憂了呢?很明顯不是這樣!MVP架構也會帶來以下新的問題:

  • 由於大量的業務邏輯處理轉移到了Presenter層,在一些複雜的業務場景中Presenter同樣會變得臃腫難懂。細心的同學可能注意到了前面的架構圖中的Model層有個Data Repository模組,Data Repository在這裡有兩個作用:一是可以將原本由Presenter處理的部分邏輯轉移到這裡來處理,包括資料的校驗、部分單純只與資料相關的邏輯等等,向Presenter遮蔽資料處理細節,比如作為Presenter就不必關心Model層傳遞過來的資料到底是來至網路還是來至資料庫還是來至本地檔案等等;二是我們引入了RxJava,但是隻有網路層中的Retrofit能返回Observable物件,其他模組都是返回的還是一些非Observable的Java物件,為了能在整個Presenter層中都體驗RxJava帶來的美妙之處,因此可以通過Data Repository做一層轉換;
  • 現在的MVP架構中最重的部分就是Model Layer了,這一點從前面的架構圖中就能體現。因此這就要求我們在Model層的設計過程中職責劃分要足夠清晰,分包更明確,耦合度更低。至於分包大家可以參考[MinimalistWeather]的方案:db包為資料庫模組、http包為網路模組、preference包是對SharedPreferences的一些封裝、repository包就是前面提到的Data Repository模組;
  • 同時還有一點需要注意,很多人在使用RxJava的過程中往往忘記了對生命週期的管理,這很容易造成記憶體洩露。[MinimalistWeather]中採用了CompositeSubscription來管理,你也可以使用RxLifecycle這類開源庫來管理生命週期。

三、元件化與模組化

去年下半年我們Android團隊內部成立了技術小組,基礎元件的開發是技術小組很重要的一部分工作,所以元件化是我們正在做的事;模組化更多的是現有的方案受到來自業務上的挑戰以及受到了Oasis Feng在MDCC上的分享和整個大環境的啟發,現在正處於設計規劃和demo開發的階段。

3.1 元件化

元件化不是個新概念,通俗的講元件化就是基於可重用的目的,將一個大的軟體系統拆分成一個個獨立元件。

元件化的帶來的好處不言而喻:

  • 避免重複造輪子,節省開發維護成本;
  • 降低專案複雜性,提升開發效率;
  • 多個團隊公用同一個元件,在一定層度上確保了技術方案的統一性。

現在的安居客有是三個業務團隊:安居客使用者app、經紀人app、集客家app。為了避免各個業務團隊重複造輪子,團隊中也需要有一定的技術沉澱,因此元件化是必須的。從本篇的第一節大家就能看到元件化的影子,只不過在這之前我們做的並不好。現在我們需要提供更多的、職能單一、效能更優的元件供業務團隊使用。根據業務相關性,我們將這些元件分為:基礎元件和業務元件。後面在介紹模組化的時候會有進一步的描述。

3.2 模組化

自從Oasis Feng在去年的MDCC2016上分享了模組化的經驗後,模組化在Android社群越來越多的被提起。我們自然也不落俗的去做了一些研究和探索。安居客現在面臨很多問題:例如全量編譯時間太長(我這臺13款的MacBook Pro打一次包得花十多分鐘);例如新房、二手房、租房等等模組間耦合嚴重,不利於多團隊並行開發測試;另外在17年初公司重新將租房app撿起推廣,單獨讓人來開發維護一個三年前的專案並不划算,所以我們希望能直接從現在的安居客使用者端中拆分出租房模組作為一個單獨的app釋出上線。這樣看來模組化似乎是一個不錯的選擇。

所以我們做模組化的目的大致是這樣的:

  • 業務模組間解耦
  • 單個業務模組單獨編譯打包,加快編譯速度
  • 多團隊間並行開發、測試
  • 解決好租App需要單獨維護的問題,降低研發成本

15年Trinea還在安居客的時候開發了一套外掛化框架,但受限於當時的團隊規模並且外掛化對整個專案的改造太大,因此在安居客團隊中外掛化並未實施下來。而模組化其實是個很好的過渡方案,將專案按照模組拆分後各業務模組間解耦的問題不存在了,後續如有必要,再進行外掛化改造只不過是水到渠成的事。

來看看安居客使用者app的模組化設計圖:

整個專案分為三層,從下往上分別是:

  • Basic Component Layer: 基礎元件層,顧名思義就是一些基礎元件,包含了各種開源庫以及和業務無關的各種自研工具庫;
  • Business Component Layer: 業務元件層,這一層的所有元件都是業務相關的,例如上圖中的支付元件AnjukePay、資料模擬元件DataSimulator等等;
  • Business Module Layer: 業務module層,在Android Studio中每塊業務對應一個單獨的module。例如安居客使用者app我們就可以拆分成新房module、二手房module、IM module等等,每個單獨的Business Module都必須準遵守前面提到的MVP架構。

同時針對模組化我們也需要定義一些自己的遊戲規則:

  • 對於Business Module Layer,各業務模組之間的通訊跳轉採用路由框架Router來實現(可能會採用成熟的開源庫,也可能會選擇重複造輪子);
  • 對於Business Component Layer,單一業務元件只能對應某一項具體的業務,對於有個性化需求的對外部提供介面讓呼叫方定製;
  • 合理控制各元件和各業務模組的拆分粒度,太小的公有模組不足以構成單獨元件或者模組的,我們先放到類似於CommonBusuness的元件中,在後期不斷的重構迭代中視情況進行進一步的拆分
  • 上層的公有的業務或者功能模組可以逐步下放到下層,合理把握好度就好;
  • 各Layer間嚴禁反向依賴,橫向依賴關係由各業務Leader和技術小組商討決定。

對於模組化專案,每個單獨的business module都可以單獨編譯成APK。在開發階段需要單獨打包編譯,專案釋出的時候又需要它作為專案的一個module來整體編譯打包。簡單的說就是開發時是application,釋出時是library。因此需要你在business module的gradle配置檔案中加入如下程式碼:

if(isBuildModule.toBoolean()){
    apply plugin: 'com.android.application'
}else{
    apply plugin: 'com.android.library'
}

如果我們需要把租房模組打包成一個單獨的租房app,像下面這樣就好:

我們可以把Basic Component Layer和Business Component Layer放在一起看做是Anjuke SDK,新的業務或者專案只需要依賴Anjuke SDK就好(這一點同樣是受到了Trinea文章的啟發)。甚至我們可以做得更極致一些,開發一套自己的元件管理平臺,業務方可以根據自己的需求選擇自己需要的元件,定製業務專屬的Anjuke SDK。業務端和Anjuke SDK的關係如下圖所示:

最後看看安居客模組化的整體設計圖:

模組化拆分對於安居客這種比較大型的商業專案而言,由於歷史比較久遠很多程式碼都執行五六年了;各個業務相互交叉耦合嚴重,所以實施起來還是有很大難度的。過程中難免會有預料不到的坑,這就需要我們對各個業務有較深的理解同時也要足夠的耐心和細緻。雖然辛苦,但是一旦完成模組化拆分對整個團隊及公司業務上的幫助是很大的。

以上是我的簡單總結以及對模組化的一些思考,不足之處還望大家批評指正。後面模組化的demo完善後我會把它放到GitHub,並再出一篇文章詳細介紹模組化的設計實現細節。

最後給大家分享一份非常系統和全面的Android進階技術大綱及進階資料,及面試題集

想學習更多Android知識,請加入Android技術開發交流 7520 16839

進群與大牛們一起討論,還可獲取Android高階架構資料、原始碼、筆記、視訊

包括 高階UI、Gradle、RxJava、小程式、Hybrid、移動架構、React Native、效能優化等全面的Android高階實踐技術講解效能優化架構思維導圖,和BATJ面試題及答案!

群裡免費分享給有需要的朋友,希望能夠幫助一些在這個行業發展迷茫的,或者想系統深入提升以及困於瓶頸的

朋友,在網上部落格論壇等地方少花些時間找資料,把有限的時間,真正花在學習上,所以我在這免費分享一些架構資料及給大家。希望在這些資料中都有你需要的內容。

相關推薦

Android 專案架構演進

浪費了“黃金五年”的Java程式設計師,還有救嗎? >>>   

Java企業級電商專案架構演進之路 Tomcat叢集與Redis分散式分享

第1章 課程介紹與前置專案回顧【配合一期課程,效果最佳】 本章首先會對一期成果進行回顧、然後確定本次進階課程的演進目標以及進階課程的內容安排。然後會介紹課程使用各種技術版本,以方便大家的環境和課程保持一致,減少因版本不同而踩的沒必要的坑。之後會對二期專案初始化進行講解,包括IDEA中匯入二期原

Java企業級電商專案架構演進之路 Tomcat叢集與Redis分散式

6-1 本章概要 6-2 使用者模組一期回顧與二期任務 6-3 Redis連線池構建與測試-1 6-4 Redis連線池構建與測試-2 6-5 Jedis api封裝與除錯 6-6 Jsonutil 封裝及除錯-1 6-7 Jsonutil 封裝及除錯-2 6-8 Jsonutil

Android專案架構--知識體系簡單梳理(一)

Android專案結構按模組module來劃分 lib_base:包含各種Base基類,如 BaseActivty、BaseFragment、BaseApplication,這是一些專案的開始基礎。

架構系列一:大型專案架構演進過程

作為一名程式設計師,單單隻會Coding是遠遠不夠的,想要走的更高更完,還必需懂Coding之外的其他東西,如架構設計,系統分析等,今天就架構這塊,談談自己的理解 一、單機時代 單機時間的應用,都很簡單,一個應用,一臺伺服器,就搞定了,大至的架構設計如下圖

Android專案架構之業務元件化

前言: 從個人經歷來說的話,從事APP開發這麼多年來,所接觸的APP的體積變得越來越大,業務的也變得越來越複雜,總來來說只有一句話:這是一個APP臃腫的時代!所以為了告別APP臃腫的時代,讓我們進入一個U盤時代,每個業務模組都是一個具備獨立執行的盤,插在哪裡都

Java企業級電商專案架構演進之路 Tomcat叢集與Redis分散式教程

高併發、高效能、高可用必經之路,基於一個完整電商專案進行架構演進,覆蓋Tomcat叢集+Nginx負載均衡+Redis分散式等核心技能點。第1章 課程介紹與前置專案回顧【配合一期課程,效果最佳】1-1 課程導學1-2 大型Java專案架構演進解析(學過一期的同學可跳過)1-3 一期課程與問答服務回顧(學過一期

大型Java專案架構演進(小白)

增加伺服器 大部分的訪問都在小部分的資料(快取)上 增加快取(具有哪種業務特點的資料適合使用快取) 遠端快取 遠端單機快取 遠端分散式快取 (叢集) 分散式快取在擴容時會遇到什麼問題 分散式

android 專案架構

1.微盤       微盤的架構比較簡單,我把最基本,最主幹的畫了出來:       第一層:com.sina.VDisk:com.sina(公司域名)+app(應用程式名稱) 。       第二層:各模組名稱(主模組VDiskClient和實體模組entities)

大型專案架構演進過程及思考

淘寶架構 我們以淘寶架構為例,瞭解下大型的電商專案的服務端的架構是怎樣,如圖所示 上面是一些安全體系系統,如資料安全體系、應用安全體系、前端安全體系等。 中間是業務運營服務系統,如會員服務、商品服務、店鋪服務、交易服務等。 還有共享業務,如分散式資料層、資料分析服務、配置服務、資料搜尋服務等。 最下面呢

Android工程架構設計:專案架構設計

我們寫程式碼的時候,經常會把多個類相同的功能程式碼(方法)抽出來封裝成父類,各個子類繼承父類再做擴充套件。 隨著公司開發維護的專案越來越多,你會發現各個專案中有一些通用的可複用的程式碼或者模組,考慮到資源替換,工程複用等問題,需要把公共部分剝離出來。 公司名為sky_dreaming,目前公

Android JetPack架構篇,一個實戰專案帶你學懂JetPack

今日科技快訊 第五屆世界網際網路大會昨日開幕,來自76個國家的1500餘位嘉賓出席大會。騰訊公司董事會主席兼執行長馬化騰在大會開幕式演講中表示,全球產業都在進行數字化,在此期間機遇挑戰並存,產業網際網路機會巨大。 作者簡介 本篇來自 w

APP社交類專案設計之六ANDROID前臺架構及通訊介紹

       前臺安卓功能採用了MVP架構,與後臺通訊使用了當前主流的RetrofitManager網路通訊外掛,底層通訊過程封裝了Okhttp。在與後臺實際通訊過程中,RetrofitManager是單例模式,如下圖所示    

Android 專案最新架構

0.前言為了幫助開發著打造一款優秀的APP,Google可謂費盡心力,推出了各種諸如MVP,MVVM等等專案架構的思路,幫助開發者更加高效的開發,儘管這樣,Google還是接著推出了一個新的專案架構,以便給予開發者更多的選擇,至於這種架構思路和MVP等框架的優劣,各位看完文章

MVP架構-Android官方MVP專案和響應式MVP-RxJava專案架構分析對比解讀

介紹 MVP這個架構一直是Android開發社群討論的焦點,每個人都有自己的分析理解眾說紛紜。直到GitHub上Google官方釋出用MVP架構搭建的專案。感覺是時候分析了。 MVP架構簡介 這不是本文重點,所以摘抄自李江東的博文 MVP架構簡介

美團點評Android客戶端融合架構演進之路

一 背景 點評美團合併之後,業務需要整合,我們部門的幾條業務需要往美團平臺遷移,為了降低遷移成本,開發和維護成本,以及將來可能要做的單元測試,需要對架構進行相應的調整。之前的程式碼都堆在Activity或Fragment裡面,UI,業務,資料混合在一起,就使得難以單

通用Android應用架構:從建專案開始

1.專案結構 現在的MVP模式越來越流行。就預設採用了。 如果專案比較小的話: app——Application Activity Fragment Presenter等的頂級父類 config——API,常量表等 model——資料層 entit

大型Java web專案分散式架構演進

http://blog.csdn.net/binyao02123202/article/details/32340283/ 知乎相關文章https://www.zhihu.com/question/22764869 分散式架構的演進 系統架構演化歷程-初始階段架構 初

android中,專案架構的搭建

一.首先搭建這個專案框架的時候需要關聯兩個庫檔案,分別是menu_library和xutillibrary。 二.現在把專案架構中需要建立的包展示如下: 三.把搭建的專案架構展示如下:

android app 架構設計01

clas -h tab size data 資源 top post 樣式 1:本文有摘抄, 1 2 3 4 5 - 開發過程中。需求、設計、編碼的一致性 - 整個程序具有統一的風格,比方對話框樣式,button風格,色調等UI元素 - 整個程序詳細統一的結