最美應用-從Android研發工程師的角度之[廚房故事]

jopen 9年前發布 | 41K 次閱讀 Android

@author ASCE1885的 Github 簡書 微博 CSDN

本文我們將如約來分析下廚房故事這款德國app的技術堆棧。由于國內和國外網絡環境,技術環境的不同,我們將會看到它和最美時光很不一樣的東西。我們需要思考的是如果是自己開發一款全新的app時,會如何選擇屬于自己的技術堆棧呢?

使用的開源函數庫

1. 底層庫集合Bolts-Android

Bolts是一個由Parse和非死book設計的面向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函數將其種植下來,之后就可以隨意使用了。

3. 視圖注入函數庫Butterknife

Butterknife同樣是JakeWharton的一個知名作品,基于編譯時注解方式實現Android視圖屬性和方法的綁定,主要特性如下:

  • 在屬性上使用@Bind注解代替findViewById

  • 支持多個類似的View組成一個列表或者數組,并一次性實現數組里面所有View的注入

  • 使用@OnClick對函數進行注解,可以替換匿名內部類的使用

  • 在屬性上使用資源注解可以替換傳統的資源查找方式

參考文檔:
官方文檔
ButterKnife--View注入框架

4. JSON解析函數庫GSON

GSON 是Google出品的函數庫,可以將JSON字符串反序列化為對應的Java對象,或者反過來將Java對象序列化為對應的JSON字符串。免去了開發者 手動通過JSONObject和JSONArray逐個JSON字段進行解析的煩惱,也減少了出錯的可能性,增強了代碼的質量。

參考文檔:
官方的用戶指南
第三方的用戶指南

5. 現代的I/O操作函數庫okio

okio作為java.io和java.nio的補充,是由square公司開發的一個函數庫,使得開發者可以更方便的訪問,存儲和處理數據。一開始是作為okhttp的一個組件存在的,當然我們也可以單獨使用它。

6. 現代的HTTP函數庫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 源碼分析

8. 內存泄露檢測函數庫LeakCanary

LeakCanary 是Square公司又一力作,可用于Debug版本中監控Activity,Fragment等的內存泄露,使用這個函數庫后,square修復了很多內 存泄露問題,甚至發現了Android SDK中的泄露,號稱解決了自家產品中94%的oom泄露問題。

參考文檔:
LeakCanary:檢測所有的內存泄漏
利用 LeakCanary 來檢查 Android 內存泄漏

9. 專為移動設備而生的數據庫Realm

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和推ter上都提供良好的技術支持。

Realm相對于SQLite而言是一個較新的函數庫,還在快速發展進化中,喜歡嘗試新技術的同學可以試試看,當然機遇和挑戰并存,你可能會遇到一些隱藏的bug需要花精力修復,不過一個人想要追求技術的進步就是需要不斷挑戰自我的。

目前試用Realm的知名產品如下圖所示:

最美應用-從Android研發工程師的角度之[廚房故事]

參考文檔:
Realm數據庫基礎教程

10. 依賴注入函數庫Dagger

Dagger是Square公司開源的一個針對Android和Java的快速依賴注入函數庫,是受到Guice的啟發創建的。它在編譯時實現綁定,并使用反射機制實現圖的構成。

Dagger 算是一個比較成熟穩定的函數庫了,Google維護了一個新分支,習慣上稱之為Dagger2,它在Dagger的基礎上不斷進化,取消了反射的使用,提 供了更好的性能,因此,目前來看,如果要使用Dagger作為依賴注入函數庫的話,推薦采用Dagger2。

參考文檔:
Dagger: 一種Android平臺的依賴注入框架
Dagger 源碼解析
詳解Dagger2

11. EventBus

GreenRobot 開發的EventBus是一個專門為Android平臺優化過的發布訂閱事件總線系統。它簡化了Android四大組件之間的通信,使得系統更好的解耦。 EventBus的優點是代碼簡潔,使用簡單,并將事件發布與訂閱充分解耦。比較有名的另外一個事件總線函數庫Square公司是otto

最美應用-從Android研發工程師的角度之[廚房故事]

參考文檔:
EventBus 源碼解析
EventBus使用詳解
跟我一起寫EventBus

12. Design Support Library

Google I/O 2015為Android開發者帶來的一個全新的開發函數庫,使得開發者更容易創建符合材料設計的移動應用。

Android的材料設計兼容庫(Design Support Library)

使用的第三方SDK

1. 云服務Parse SDK

Parse是一個國外的云服務平臺,一年多前被非死book收購,目前辦公地點在美國的加利福尼亞。廚房故事app使用了這家的云服務,因此引入了對應平臺的SDK。

2. Crash統計SDK Crashlytics

Crashlytic 成立于2011年,是專門為移動應用開者發提供的保存和分析應用崩潰信息的工具。2013年1月,Crashlytics被推ter收購,成為又一 個成功的創業產品。Crashlytics是功能強大且輕量級的Crash統計SDK,支持Java層和NDK層崩潰統計與分析。

參考文檔:
Android下使用Crashlytics
iOS開發工具——統計Crash的工具Crashlytics

3. 非死book SDK

非死book由于某些眾所周知的原因,在國內是幾乎用不了的,但這并不妨礙我們進行介紹,有興趣的話你還可以下載這個SDK下來看下源碼,還是有值得學習的地方的。翻不了墻的可以到我的網盤下載。

參考文檔:
Android下使用最新非死book SDK 3.0

4. Google推送服務GMS

還是由于某些眾所周知的原因,國內的app幾乎沒有使用GMS的,但作為Android開發者還是應該知道它的存在的。

5. amplitude sdk

實時的用戶統計分析工具,類似國內的友盟,知道用戶使用app的行為,能夠幫助產品經理更好的不斷改進產品。

分析與總結

最美時光相 比,廚房故事雖然在某些開源庫的選擇上有些重疊(都使用了GSON,OkHttp,okio,UIL,Timber等),但主體上可以看出很大的不同,廚 房故事使用的開源函數庫更“前衛”一些。無論是全新數據庫Realm的使用,Google剛推出不久的Design Support Library的使用,還是LeakCanary的引入,使用RecyclerView代替ListView,抑或是充分利用依賴注入如 ButterKnife,dagger來簡化代碼,都可以看出廚房故事更善于,更有勇氣利用新技術來為自身服務。

另一方面,從使用的第三方 SDK可以看出國內app和國外app的顯著不同之處。當然,每個app的技術堆棧都會千差萬別,這取決于團隊的梯隊建設和成員質量,每一個開源函數庫的 選擇都會是折衷的,不存在哪一個函數庫是必選的,總會有替代品,有時選擇可能只是一念之差。但我們總是應該不斷進步,不斷發現或創造新的函數庫,并應用到 實際產品開發中,使得我們的工作和生活越來越美好,這個是大勢所趨。


 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!