從零開始的Android新項目1 - 架構搭建篇

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

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

本系列文章不是教你怎麼從0開始學Android,從0開始怎麼建一個項目,而定位於零負擔的情況下,在2016年怎麼去創建一個好的Android項目,其中一部分技術並不太適合剛入門的初學者。

Application specific

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

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

  • fernandocejas.com/2014/
  • fernandocejas.com/2015/

兩篇文章。

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。

歡迎加入QQ群:568863373。

歡迎關注我們的公眾號:魔都三帥,歡迎大家來投稿~只需要是未在微信平台上發布過的技術相關類文章都可以哦(不局限於任何語言和平台)。


推薦閱讀:

#每天一個小目標#Unity技術分享(十)
我想開發一個APP,現在有React Native 和 API Cloud 兩個框架,我該如何選擇?
不越獄,直接跳過 App Store 安裝軟體是什麼原理?
某熊周刊系列:一周推薦外文技術資料(1.4)
一個普通而技能全面的互聯網工作者,選擇 Mac 還是 Windows PC?

TAG:Android | 移动开发 | 前端开发 |