天天看點

搭建高品質的Android項目架構系列一

1.程式設計規範

1.1.Application Name: 項目應用名,命名規則簡單

1.2.Package Name:包名遵循“DNS反轉”約定,亦即将企業組織或公司的域名反轉後,在尾部附加上應用名稱。遵循此約定可以保證包名的唯一性,遵循MVC的命名原則。

![這裡寫圖檔描述](https://img-blog.csdn.net/20160318184941119)
![這裡寫圖檔描述](https://img-blog.csdn.net/20160318185016995)
![這裡寫圖檔描述](https://img-blog.csdn.net/20160318185044465)
![這裡寫圖檔描述](https://img-blog.csdn.net/20160318185112794)
2.設計架構
![這裡寫圖檔描述](https://img-blog.csdn.net/20160318185146607)
           

根據經驗,一個良好的架構設計可大緻分三層:

  1. 上層是Activity、Fragment、Views&Widget等視圖渲染和業務調用。
  2. 中層是針對業務的三方庫,以及主要邏輯實作,業務流程在這完成,此層還可以細分,不再贅述。
  3. 底層是業務無關的架構庫,用之四海而皆準,各類庫内高内聚,不同庫間低耦合

    1)遵循原則:基本遵循MVC的設計模式,以及23種設計模式和六大原則

    2)設計模式六大原則:

    http://www.uml.org.cn/sjms/201211023.asp#1

    3)23種設計模式:、

    https://github.com/iluwatar/java-design-patterns

    http://chjavach.iteye.com/category/111368?show_full=true

搭建高品質的Android項目架構系列一

同款APP不同終端

App View層 :視圖&控制層,重視互動、體驗、布局、資源,作為上層快速實作視覺和界面,activity、fragment、layout、resource等在這裡。

App SDK:業務層,重視業務、邏輯、模型,作為中層因其界面無關性而快速支援同款App的不同終端或者UI層,全部業務邏輯在這裡實作,邏輯控制、資料解析和模型等在這實作。

Lite SDK :功能層,重視通用、性能、便捷,作為底層快速支撐不同App,由HTTP、ORM、IOC、Async、Base/Common等通用元件組成。

3.設計原則

總體:一個好的架構設計是基于業務需求的,脫離了具體業務談架構也沒多大的意義,把一些通用的功能子產品抽象出來,作為服務提供給開發人員使用。

1) 功能單一的。也就是設計法則中的單一職責。單一職責原則适用于類和方法的設計,同樣也适用于架構的設計。

2) 良好的封裝以及簡單地 API 調用。架構作為服務提供者,很多情況下是為了提升開發效率,對于一個相對穩定的第三方架構,開發者是不會關注于其具體實作的。

3) 良好的擴充性。也就是開閉原則,一個設計良好的子產品,應該在不被修改的前提下被擴充。我們擴充開來,一個設計良好的架構,應該在具體代碼業務不被修改的前提下進行修改。

4) 低耦合高内聚。其實就是對前面1 2 3 點的總結。

5) 穩定性高于一切。

6) 測試覆寫率,盡量保證每一個功能點都被覆寫。

7) 異常機制。就像前面所說的,穩定性高于一切。穩定性不光得益于良好的設計,還需要良好的異常機制的設計。對異常進行處理,不光适用于架構的設計,也适用于App 的設計。抛出異常來說明異常狀況,但是不要強迫用戶端使用異常來控制流。

8) 從普通使用者的角度去考慮抽象,技師增加一定的代碼量,這也是值得的。

9) 起一個萌一點的名字,最好能夠萌到看一眼就知道功能。這包括類的設計、方法的設計以及參數清單的命名。

10) 需要開發者配置的參數盡量對象化。比如一個方法參數可接受三種 int 型的值(1 , 2, 3),用以表示不同的意思。那麼盡可能的建立一個 State 類,裡面有三個靜态常量 STATE_ONE ,STATE_TWO ,STATE_THREE 。

11) 對參數進行校驗。接收到參數之後,盡可能的對每一個參數進行非法驗證,比如非空判斷、參數無意義的判斷等,用異常的方式告知開發者需要傳遞正确的參數。

12) 盡可能簡單地方法參數。或者說盡可能多的重載方法。但是需要注意模棱兩可的重載。

13) 如12所說,延展說來就是盡量避免使用長參數清單。長參數清單更容易出差,而且對于維護以及編譯、運作并不友好。如有必要,建立參數助手類(參考11)。

14) 對可能會犯的錯誤進行預計,要用發展的思維來設計架構,這一點有點跟11意思一樣。

15) 版本相容性。保證架構更新之後,對于老版本的支援。

16) 架構 API 生命周期的管理。具體的手段可以是設計 API 級别,比如内部、測試、開發、穩定等等。

4.常用架構:[其實就是jar包庫,為業務服務Architecture is About Intent, not Frameworks]

4.1.Http/ REST 請求網絡通信 :Volley/okhttp/android-async-http/ Retrofit/ RoboSpice/ http-common/ Retrofit 2

4.2.圖檔異步加載:ImageLoader/Glide/Fresco/Picasso/ CommonLib/UIL

4.3.資料解析:GSON/FastJSON/ Jackson/JSON快速生成實體Java類:Jsonschema2pojo/AndroidStudio插件 GsonFormat

4.4.UI效果 :PullRefreshListView

4.5.檢查記憶體洩露 leakcanary

4.6.View 注解,控件注入和事件綁定:ButterKnife(配合 ButterKnife Zelezny 有奇效)

4.7.各種各樣的彈窗:DialogPlus

4.8.代替 Toast 的消息提示:AppMsg

4.9.事件總線EventBus/ otto【為了解耦】

4.10.依賴注入Dagger/ RoboGuice/ ButterKnife/ Dagger2

【1)使用類似Guice或者RoboGuice等framework injection他們能夠簡化代碼。但是mapped pages會長時間的被保留在RAM中,讓記憶體消耗更嚴重】

【2)dagger的注解會在編譯的時候生成代碼,是以不會産生Guice等依賴runtime注解的記憶體問題,而且dagger2似乎是google自己fork dagger然後經一步改進了的】

4.11.資料庫ActiveAndroid /ormlite /greendao/dbflow

【簡化對于SQlite操作的對象關系映射架構OrmLite:】

4.12.響應式程式設計RxJava/ RxAndroid

4.13.日志輸出Logger/ KLog/ LogUtils/Timber/hugo

4.14.崩潰統計平台Crittercism/ Crashlytics

4.15. 版本相容:官方 support 全家桶

4.16. Java8:Retrolambda/Lightweight-Stream-API

4.17. 快速開發合集:Afinal/xUtils/Android Annotations/ Square 全家桶/ Jake大神的各種庫,Facebook的Android庫,support庫

4.18.常用工具類:https://github.com/l123456789jy/Lazy

4.19.遊戲開發:https://github.com/lfkdsk/JustWeEngine

4.20.動畫:NineOldAndroids

4.21.單元測試:https://github.com/robolectric/robolectric

4.22. 切圖、圖檔壓縮:cutterman 這個Photoshop的插件值得擁有

4.23. PNG優化工具: windows : PNGGauntlet/Mac: ImageOptim/web app: https://tinypng.com/ 能極大減小圖檔體積,并保障圖檔品質

4.24.UI:Support Lib + Design Lib + 各種開源 View 控件。

【1】Tab滑頁 、廣告頁 的 PagerSlidingTabStrip 或 ViewPagerIndicator +ViewPager

【2】檢視圖檔的 PhotoView

【3】選擇時間日期 省市地域的 各種改版 WheelView

【4】support包裡的 SwipeRefreshLayout, DrawerLayout,新出的 recyclerview cardview 等 ,還有toolbar,design

【5】Listview 加動效的listviewanimations

【6】提高操作性的左滑後退 SwipeBackLayout

【7】多标簽流的 flowlayout;

【8】 material design的設計和控件,還有一些牛人實作的ui效果

github搜尋awesome android

更多參考【包括一些開源項目】:https://www.zhihu.com/question/37160415

https://www.zhihu.com/question/27667028

https://www.zhihu.com/question/34452706

Trinea 彙總的開源項目,類目非常全面: https://github.com/cesards/AndroidElementals

國外開發者彙總的開源項目: https://github.com/Trinea/android-open-project

http://blog.daimajia.com/android-library-collection/

http://litesuits.com/

5.架構之餘

搭建高品質的Android項目架構系列一

其實對于初學者而言:學習四大元件,研究ActivityManager,PackgeMag-

不使用開源的控件嘗試使用Canvas 或者OpenGL自繪,閱讀一下Dalvik的源代碼了解ClassLoader和記憶體回收,看看整個Android的核心架構Binder,直接使用Android提供的HttpClient,HttpConnection網絡請求庫,自己動手寫寫SQL查詢語句。

6.三大模式

https://www.zhihu.com/question/19729778

http://v.youku.com/v_show/id_XNzQzNDkzMjUy.html

https://www.zhihu.com/question/20148405

延伸閱讀:

怎麼做好網際網路公司的技術團隊負責人?

https://www.zhihu.com/question/39421456/answer/81233608?from=profile_answer_card

https://www.zhihu.com/question/27163593/answer/42703123

https://www.zhihu.com/question/27163593