(一)Doodle - 精簡的圖片載入框架 - 概述篇

語言: CN / TW / HK

一、序

Doodle是我幾年前釋出的一個圖片載入框架。
寫Doodle的初衷:早期對包大小之類的還是很看重的,當時覺得Glide依賴包比較大,而我們需要的功能又比較簡單,然後Picasso又不支援GIF,於是我就自己寫了一個圖片載入庫。
也由於當時的需求比較簡單,所以功能實現得比較保守,比如不支援載入視訊縮圖,不支援自定義解碼等。
時過境遷,如今大家對包大小已不太在意了,秉著有始有終的想法,我一直想完成一個更完善的版本。
其實去年就重構得差不多了,但又想著要豐富一下測試場景,於是補了一些用例,包括網路圖片列表載入,以及一個相簿元件。
如今終於完成併發布了。

二、簡單對比

網上流行的圖片載入框架不少,有Universal-Image-Loader,Picasso, Glide, Fresco, Coil等,各有千秋。

  • Universal-Image-Loader:名字取的很直白,最早的圖片載入框架,很久之前就停止維護了。
  • Picasso:最“輕量”, 但功能也最弱,也接近停止維護的狀態了。
  • 不支援GIF,不支援解碼視訊縮圖,不支援自定義解碼。
  • 磁碟快取完全委託給OkHttp, 只快取原檔案,不快取解碼後的圖片到磁碟,相比於Glide, 再次從磁碟載入的要慢得多。
  • 有的圖片無法正確地降取樣,有的圖片無法處理圖片方向。
  • 不支援生命週期(Activity結束時取消載入)。
  • Glide: 很全面,基本上挑不出問題。非要吹毛求疵的話,就是程式碼比較複雜,網上很多原始碼分析的文章,沒幾篇捋的清楚。
  • Fresco: 解碼支援全面,功能強大,除了常規的功能之外,還有漸進式JPEG這種絕活。
    但代價就是依賴包比較大(Fresso依賴包比較多,我沒有一個個去統計,問了ChatGPT, 得到3.5M的回答)。
  • Coil: 基於Kotlin實現,依賴AndroidX Lifecycles, OkHttp, Coroutines等,實現了一些對ImageView的擴充套件函式,語法糖甜度飽和。
    Coil的Github主頁聲稱庫比較“輕量",並舉例其方法數大約2000,“和Picasso相當,遠小於Glide/Fresco”。
    方法數沒有虛報,但“和Picasso相當”就比較有水分了, 事實上無論是包大小還是方法都是接近Glide而遠多於Picasso。

特別提一下,關於方法數,新入行的朋友可能已經不太聽說了。
早期的Android版本執行Dalvik虛擬機器,最多支援64K方法,安裝包總方法數超過64K需要做適配,可以參考:https://developer.android.com/studio/build/multidex?hl=zh-cn
統計方法數可以用這個外掛:https://github.com/KeepSafe/dexcount-gradle-plugin
目前很多APP支援的最低版本都在Android 5.0以上,方法數多少已不重要,但可作為綜合衡量程式碼複雜程度的因素之一吧。

各圖片載入框架簡要資訊如下: | | 版本| 包大小|方法數 ---|---|---|--- Picasso | 2.8 | 106k | 527 Glide | 4.15.0 | 809k | 3746 Fresco | 2.6.0 | 3.5M | 5923 Coil | 2.2.2 | 505k | 2000 Doodle | 2.0.2 | 93k | 459

Doodle如今釋出2.0版本,依然不改初衷,維持了簡潔的實現。
Doodle不依賴第三方庫(OkHttp, AndroidX等),不需要註解和配置混淆,開箱即用。

三、特性

Doodle雖然只有幾百個方法,不到百K的大小,但“麻雀雖小,五臟俱全“。
其實現的功能包括但不限於以下列表: - 支援載入File, Uri, Resource(raw/drawable), assets, http等形式的檔案; - 支援靜態圖片,動態圖片,視訊縮圖; - 支援載入媒體檔案縮圖的加速(讀取系統的thumbnail); - 支援自定義資料載入; - 支援自定義解碼實現; - 支援自定義圖片變換(內建圓形和圓角剪裁); - 支援監聽生命週期,並做對應處理(如頁面結束時取消載入); - 支援暫停/恢復載入; - 支援磁碟快取(包括快取原檔案和解碼結果); - 支援記憶體快取(包含LRU快取和弱引用快取); - 支援佔位圖,動畫; - 支援降取樣/上取樣,剪裁……

Doodle 2.0在功能方面可以說是很接近Glide了;
效能上,我對比了下Doodle和Glide在載入本地媒體檔案的速度,基本持平(每次測量結果兩者都有浮動,綜合來看耗時差不多)。

四、後序

專案已經發布Github, 歡迎各位朋友提PR或者建議。
地址:https://github.com/BillyWei01/Doodle

Doodle的用法和實現細節,就不放在這篇文章裡了,另外開了兩篇做具體講述。
(二)Doodle - 精簡的圖片載入框架 - 原理篇
(三)Doodle - 精簡的圖片載入框架 - 用法篇

原理篇是在之前的釋出的文章上修改的,原文名為《如何實現一個圖片載入框架》。
雖然講的不是主流的圖片載入庫,但圖片載入相關的要點其實是相通的,讀完原理篇對於分析其他圖片載入庫也是有所幫助的。