從零開始的Android新專案(1):架構搭建篇

markzhai發表於2016-03-19

最近一直在忙新專案的事情,所以有的坑一直沒填。。現在看來可能一時半會兒還填不了,倒不如記錄一下新專案的搭建。

試想一下,如果沒有歷史負擔,沒有KPI壓力,去新搭建一個專案,你會怎麼設計和實現呢?

architecture

Application specific

類似clean architecture,分為三層 presentation – data – domain。

關於Clean Architecture由於國內的一些文章和專案都多少有偏離和錯誤,建議直接看

兩篇文章。

domain為純領域模型,是Java library,包含了use case(Interactor)、DO、repository介面等domain package,目標是在任何Java語言的平臺上都能直接使用,所以必須是平臺無關,對平臺沒有任何依賴,能使用Java的方法(JUnit + Mockito)來直接進行測試。

data為domain的實現,是Android library,從MVP的角度來說,即是M層,內部隱藏所有資料細節,cache、資料庫、網路、PO、exception(根據業務特點自定義的exception)、repository的具體實現(內部遮蔽資料細節,可能來自網路、資料庫、快取等)。使用Robolectric 3 + JUnit + Mockito進行整合測試。

presentation即展示層,是Android application module,對data不存在實際感知,依賴僅僅是Dagger注入的例項化,所有訪問都通過介面進行,可見的是domain裡的介面。包含了error message factory(所有exception都會被factory生成對應的message)、DI、mapper(vo轉換)、VO(data binding進行MVVM)、navigation、presenter(不強制,僅在一些特別複雜的場景引入)、usersystem、utils(業務相關)、view(activity、fragment、adapter等)、application實現、業務常量等。可以使用Espresso和Android Instrumentation進行UI測試。

整個專案類似MVP+MVVM的混合(誰跟你說的MVP和MVVM是互斥的?),不過P層不一定存在,以避免為了模式而模式所導致的開發壓力。

Common libraries

aar依賴以避免對編譯速度造成影響,不過這裡比較巧妙的是依賴作為module引入,所以當需要原始碼依賴的時候在build.gradle裡進行註釋/反註釋就能迅速切換,十分方便。

lib_uiframework: UI framework,包含了各種Base類,如BaseActivity、BaseFragment、Navigator(應用中的一切通過scheme跳轉)、ActivityManager、FragmentBackHelper等。

lib_uikit: 各種自定義view、第三方view的gradle或者原始碼依賴。

lib_im: 即時通訊庫。

lib_component: 元件庫,如cache、gif、ClassLoaderInjecter、Log、SP、Web等。

lib_authorize: 第三方認證(登陸),目前包括QQ、微信、微博、LinkedIn。

lib_share: 第三方分享,目前包括QQ、微信、微博。

…等等

Third party libraries

Dagger, jsr250: 依賴注入框架讓我們省了很多程式碼,jsr250則是Dagger注入時的一個annotation根據,我們的domain依賴了jsr250。

Rx大家族: RxJava, RxAndroid, RxBinding。新時代Android開發必備,還用說嗎?

Retrofit: 裝逼,喔,不對,高效率開發必備的網路框架。使用註解生成API,方便極了。我這裡的實踐是根據業務劃分多個API介面,然後通過Dagger module進行例項化注入。

EventBus: 有了RxJava還要EventBus?當然,事件並不總是一對一的,也不總是流式的(可能是持續被動的)。舉個簡單的例子,feed詳情資訊更新後(比如點贊資料),外部可能有2個timeline頁面也需要更新這個資料,這個時候EventBus就可以優雅地進行事件廣播。

Realm:一個不依賴於SqlLite的ORM庫,特點就是…快。還有同時有多個平臺的方案: ReactNative, OC, Swift, Java…

Google Support庫, data binding: Google家的,不用說了吧。

LeakCanary, BlockCanary: 開發階段必備工具,前者是square家檢測記憶體洩露的,後者是我自己做的卡頓檢測工具。

Glide, Glide Transformation: 不折騰fresco,乖乖用Glide。

打賞支援我寫出更多好文章,謝謝!

打賞作者

打賞支援我寫出更多好文章,謝謝!

任選一種支付方式

從零開始的Android新專案(1):架構搭建篇 從零開始的Android新專案(1):架構搭建篇

相關文章