@author ASCE1885的Github簡書微博CSDN
本文我們將如約來分析下廚房故事這款德國app的技術堆棧。由于國內和國外網絡環境,技術環境的不同,我們將會看到它和最美時光很不一樣的東西。我們需要思考的是如果是自己開發一款全新的app時,會如何選擇屬于自己的技術堆棧呢?
使用的開源函數庫
Bolts是一個由Parse和Facebook設計的面向iOS和Android的底層庫集合,最初用于公司內部使用。它主要包含兩個特性:
Tasks:更好的組織管理復雜的異步代碼,類似于JavaScript的Promise。
實現了App Links協議,幫助我們鏈接到其他app的提供的內容,同時處理接收到的deep-link。
參考文檔:
Parse發布Bolts,一個面向iOS和Android的底層庫集合
2.開源日志記錄函數庫JakeWharton's Timber
Timber是明星程序員JakeWharton開源的一個日志記錄函數庫,它基于Android Log類基礎上, 提供了簡潔可擴展的API。
日志記錄行為被抽象為一顆一顆的樹??,例如有打印日志到Logcat的樹,有打印日志到文件的樹等等,如果我們要使用某種類型的樹,首選需要創建一個實例,并調用Timber.plant函數將其種植下來,之后就可以隨意使用了。
Butterknife同樣是JakeWharton的一個知名作品,基于編譯時注解方式實現Android視圖屬性和方法的綁定,主要特性如下:
在屬性上使用@Bind注解代替findViewById
支持多個類似的View組成一個列表或者數組,并一次性實現數組里面所有View的注入
使用@OnClick對函數進行注解,可以替換匿名內部類的使用
在屬性上使用資源注解可以替換傳統的資源查找方式
參考文檔:
GSON
是Google出品的函數庫,可以將JSON字符串反序列化為對應的Java對象,或者反過來將Java對象序列化為對應的JSON字符串。免去了開發者
手動通過JSONObject和JSONArray逐個JSON字段進行解析的煩惱,也減少了出錯的可能性,增強了代碼的質量。
參考文檔:
okio作為java.io和java.nio的補充,是由square公司開發的一個函數庫,使得開發者可以更方便的訪問,存儲和處理數據。一開始是作為okhttp的一個組件存在的,當然我們也可以單獨使用它。
OkHttp是一個高效的HTTP客戶端,具有如下特性:
支持HTTP/2和SPDY,對同一臺主機的所有請求共享同一個socket
當SPDY不可用時,使用連接池減少請求的延遲
透明的GZIP壓縮減少下載的數據大小
緩存響應避免重復的網絡請求
OkHttp
在網絡性能很差的情況下能夠很好的工作,它能夠避免常見的網絡連接問題。如果你的HTTP服務由多個IP地址,OkHttp在第一次連接失敗時,會嘗試其
他可選的地址。這對于IPv4+IPv6以及托管在冗余數據中心的服務來說是必要的。OkHttp使用現代的TLS特性(SNI,
ALPN)初始化HTTP連接,但握手失敗時,會降級使用TSL1.0嘗試初始化連接。
更詳細的使用方法參見文檔。
7.圖片異步加載緩存函數庫Android-Universal-Image-Loader
這個函數庫簡稱UIL,是一個功能強大靈活且高度可自定義的用于加載,緩存和顯示圖片的開源函數庫,它提供一系列配置選項,并能很好的控制圖片加載和緩存的過程。
主要特性有:
同步或者異步的多線程圖片加載
高度可自定義:線程池,下載器,解碼器,內存和磁盤緩存,圖片顯示選項等等
每張圖片的顯示支持多種自定義選項:默認存根圖片,緩存切換,解碼選項,Bitmap處理和顯示等
圖片可緩存在內存或者磁盤(設備的文件系統或者SD卡)上
可實時監聽圖片加載流程,包括下載進度。
參考文檔:
Android-Universal-Image-Loader 圖片異步加載類庫的使用(超詳細配置)
Android 開源框架Universal-Image-Loader完全解析
Android Universal Image Loader 源碼分析
LeakCanary
是Square公司又一力作,可用于Debug版本中監控Activity,Fragment等的內存泄露,使用這個函數庫后,square修復了很多內
存泄露問題,甚至發現了Android SDK中的泄露,號稱解決了自家產品中94%的oom泄露問題。
參考文檔:
利用 LeakCanary 來檢查 Android 內存泄漏
Realm是一個現代的移動平臺數據庫,用于替換SQLite和Core Data,它的主要特性有:
移動優先:第一個專為手機,平板和可穿戴設備而生的數據庫
使用簡單:Realm不是基于SQLite之上的ORM框架,相反,它實現了自己的持久化引擎,專注于簡單和速度。
跨
平臺:Realm支持iOS & OS X(Objective-C & Swift)&
Android三個平臺,可以跨平臺共享Realm文件,在Java,Swift和Objective-C中使用相同的模型類,在所有平臺上實現相似的業
務邏輯。
快速:歸功于零拷貝設計,Realm比ORM框架快很多,通常情況下也快于原生SQLite數據庫。
良好的支持:官方在Github,StackOverflow和Twitter上都提供良好的技術支持。
Realm相對于SQLite而言是一個較新的函數庫,還在快速發展進化中,喜歡嘗試新技術的同學可以試試看,當然機遇和挑戰并存,你可能會遇到一些隱藏的bug需要花精力修復,不過一個人想要追求技術的進步就是需要不斷挑戰自我的。
目前試用Realm的知名產品如下圖所示:
參考文檔:
Dagger是Square公司開源的一個針對Android和Java的快速依賴注入函數庫,是受到Guice的啟發創建的。它在編譯時實現綁定,并使用反射機制實現圖的構成。
Dagger
算是一個比較成熟穩定的函數庫了,Google維護了一個新分支,習慣上稱之為Dagger2,它在Dagger的基礎上不斷進化,取消了反射的使用,提
供了更好的性能,因此,目前來看,如果要使用Dagger作為依賴注入函數庫的話,推薦采用Dagger2。
參考文檔:
11.EventBus
GreenRobot開發的EventBus是一個專門為Android平臺優化過的發布訂閱事件總線系統。它簡化了Android四大組件之間的通信,使得系統更好的解耦。EventBus的優點是代碼簡潔,使用簡單,并將事件發布與訂閱充分解耦。比較有名的另外一個事件總線函數庫Square公司是otto。

參考文檔:
Google I/O 2015為Android開發者帶來的一個全新的開發函數庫,使得開發者更容易創建符合材料設計的移動應用。
Android的材料設計兼容庫(Design Support Library)
使用的第三方SDK
Parse是一個國外的云服務平臺,一年多前被Facebook收購,目前辦公地點在美國的加利福尼亞。廚房故事app使用了這家的云服務,因此引入了對應平臺的SDK。
Crashlytic
成立于2011年,是專門為移動應用開者發提供的保存和分析應用崩潰信息的工具。2013年1月,Crashlytics被Twitter收購,成為又一
個成功的創業產品。Crashlytics是功能強大且輕量級的Crash統計SDK,支持Java層和NDK層崩潰統計與分析。
參考文檔:
iOS開發工具——統計Crash的工具Crashlytics
Facebook由于某些眾所周知的原因,在國內是幾乎用不了的,但這并不妨礙我們進行介紹,有興趣的話你還可以下載這個SDK下來看下源碼,還是有值得學習的地方的。翻不了墻的可以到我的網盤下載。
參考文檔:
4. Google推送服務GMS
還是由于某些眾所周知的原因,國內的app幾乎沒有使用GMS的,但作為Android開發者還是應該知道它的存在的。
實時的用戶統計分析工具,類似國內的友盟,知道用戶使用app的行為,能夠幫助產品經理更好的不斷改進產品。
分析與總結
和最美時光相比,廚房故事雖然在某些開源庫的選擇上有些重疊(都使用了GSON,OkHttp,okio,UIL,Timber等),但主體上可以看出很大的不同,廚房故事使用的開源函數庫更“前衛”一些。無論是全新數據庫Realm的使用,Google剛推出不久的Design Support Library的使用,還是LeakCanary的引入,使用RecyclerView代替ListView,抑或是充分利用依賴注入如ButterKnife,dagger來簡化代碼,都可以看出廚房故事更善于,更有勇氣利用新技術來為自身服務。
另一方面,從使用的第三方
SDK可以看出國內app和國外app的顯著不同之處。當然,每個app的技術堆棧都會千差萬別,這取決于團隊的梯隊建設和成員質量,每一個開源函數庫的
選擇都會是折衷的,不存在哪一個函數庫是必選的,總會有替代品,有時選擇可能只是一念之差。但我們總是應該不斷進步,不斷發現或創造新的函數庫,并應用到
實際產品開發中,使得我們的工作和生活越來越美好,這個是大勢所趨。