2016裏一些Android最佳實踐列表——Opinionated

本文是一篇屬於Opinionated的文章,只是表明了做者的我的觀點,筆者看到Medium有兩人發了都是關於最佳實踐的Checklist,就把兩者集成了下,而且加入了一些我的的見解,基本的知識點分佈方式參考了:個人知識體系架構。仍是要強調下,本文的觀點/評價只是屬於我的觀點,歡迎討論。html

android-development-some-of-the-best-practices-by-Abderrazak Laanayaandroid

android-development-some-of-the-best-practices-jun-2016-edition-by-Stepan Goncharovgit

Language:基本的語法

  • 使用任何的第三方庫以前都要三思而行,從筆者本身的經驗裏,抽象漏洞定理是一個顛仆不破的定理啊。雖然不少庫宣揚的都是很是Nice,Demo也很誘人,可是你壓根不知道它到底會帶來怎樣的Side Effect。筆者是建議若是真的打算應用某個庫到正式的大型項目中,必定要好好考量下它的社區和活躍度。之後流的淚,都是當時腦子進的水。github

  • 儘可能使用那些較小的,每每只是完成單個功能的庫,未來比較好替換。數據庫

  • Stepan Goncharov建議使用 Kotlin,能夠幫你省掉不少譬如懶加載等等JDK未提供的功能。不過筆者表示持保守態度,畢竟學習成本上來了,就像當年LinkedIn轉到Scala同樣,誰知道將來會咋樣呢?並且Java8,9以後Java自己也在逐步完善,若是真的須要不少附加功能,我以爲Lombok就不錯。segmentfault

  • 給方法命名的時候儘可能清晰點,不能隨意命名緩存

  • 不要使用Guava架構

  • 使用Parcel在Android中引入AutoValueapp

  • FlatBuffers是一個高效地跨平臺序列化框架,而Serializable雖然方便使用,可是效率低下框架

UI

  • 使用Picasso或者Glide來做爲圖片容器

  • 使用Lint來輔助進行佈局與層次優化,這樣有助於發現冗餘的佈局

  • 使用styles來減小布局XML中的重複屬性

  • 不要使用層次過深的ViewGroups繼承

  • Launch Screen是用戶看到的第一個畫面,要謹慎,不過也不能在不必的時候強行加入一個Launch Screen

  • 使用ConstraintsLayout來扁平化視圖層次

  • 使用數據綁定來減小UI代碼的數目

  • 避免在AsyncCallback以及靜態對象中引用View,而且避免將View放入沒有明確的內存模式的集合中,能夠考慮放到WeakHashMap中

Network

  • 不要嘗試着重複造輪子,可使用Volley或者OkHTTP,能夠考慮使用Retrofit做爲上層封裝

  • 記得監控當前鏈接類型,在Wifi下進行較大量的數據更新

Storage

DataBase

  • 除非確實有必要,不然不要盲目的引入數據庫支持。這一點筆者也是贊同的,不少時候簡單的緩存能夠用SharedReference就能夠了。不過反過來,若是你真的有必定的須要持久化的數據,不要猶豫,立馬引入數據庫的支持

  • 若是引入了DB支持,那考慮使用ORM框架的支持,避免重複造輪子

  • 關於Realm,這是一個很炫的東西,可是筆者本身老實說在Android和iOS平臺引入以後,發現仍是會存在一些問題Abderrazak Laanaya對Realm是持積極態度而Stepan Goncharov是保守態度。筆者本身的感受是Realm確實很酷,可是必定要作好其引起未知Crash的心理準備

SysProc

  • 使用RxJava來代替AsyncTasks,不過對於RetroLambda的使用仍是持保留意見

  • 對於Event Bus的使用持謹慎態度,一不當心就可能把你的程序變得有些雜亂,能夠考慮使用RxJava+

LocalBroadcastManager做爲替代

  • 不要把太多東西塞入到Application線程中

  • 使用JobScheduler來處理長期週期化運行的無狀態任務

  • 在應用程序中要注意避免Memory Leaks,不過onLowMemory()是會在整個系統的內存較低的狀況下被觸發,所以不能用於避免OOMs

  • 系統的30%的電量消耗用在了圖片、動畫等,而70%用於分析、廣告、地圖以及GPS

TestRelease

  • 如今的應用程序很容易突破65K的方法數量的限制,Multidexing能夠幫你解決這個問題

  • 應該按照Feature打包,而不該該按照Layers打包

  • 使用Gradle以及其推薦的項目結構,而且將密碼以及其餘關鍵數據放置到gradle.properties中

  • 將應用分爲多個較小靈活地模塊中,這樣能夠儘可能保證可維護性較好、耦合度較低的CodeBase,也能夠選擇將小的模塊發佈到公開或者私有的倉庫中,而後在主項目中引入。

  • 使用以下的表達式來過濾日誌:

^(?!(NotificationManager|Timeline|SensorManager|Configs|libc-netbsd|art|stetho|Choreographer|CliptrayUtils|BubblePopupHelper|ViewRootImpl|libEGL|System.out|PhoneWindow))

相關文章
相關標籤/搜索