從零開始的Android新項目1 - 架構搭建篇
最近一直在忙新項目的事情,所以有的坑一直沒填。。現在看來可能一時半會兒還填不了,倒不如記錄一下新項目的搭建。
試想一下,如果沒有歷史負擔,沒有KPI壓力,去新搭建一個項目,你會怎麼設計和實現呢?
本系列文章不是教你怎麼從0開始學Android,從0開始怎麼建一個項目,而定位於零負擔的情況下,在2016年怎麼去創建一個好的Android項目,其中一部分技術並不太適合剛入門的初學者。
Application specific
類似clean architecture,分為三層 presentation - data - domain。
關於Clean Architecture由於國內的一些文章和項目都多少有偏離和錯誤,建議直接看
- http://fernandocejas.com/2014/09/03/architecting-android-the-clean-way/
- http://fernandocejas.com/2015/07/18/architecting-android-the-evolution/
兩篇文章。
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?