图片框架 - 三方库调研
一、主流图片框架:
Android-Universal-Image-Loader
Picasso
Glide
Fresco
具体图片库介绍参考对应项目文档。
Android-Universal-Image-Loader、Picasso不支持gif图,且项目比较早,目前大部分app会优先考虑使用功能更全面的Glide和Fresco。
二、图片库对比
对比项 | Glide | Fresco |
---|---|---|
发布时间 | 2014年9月 | 2015年5月 |
是否支持gif | true | true |
是否支持webP | 支持静图,不支持动图 | 都支持 |
视频缩略图 | true | true |
大小 | 500K | 2-3M |
加载速度 | 高 | 高 |
静图(max java heap) | 11.1MB | 13.9MB |
静图(max native heap) | 43.8MB | 43.8MB |
静图(avg wait time) | 34ms | 44ms |
动图(max java heap) | 74.8.1MB | 36.1MB |
动图(max native heap) | 66.8MB | 545.3MB |
动图(avg wait time) | 33910ms | 15142ms |
缓存 | 内存、磁盘 | 三级缓存,分别是 Bitmap缓存,未解码图片缓存, 文件缓存。 |
加载进度 | false | true |
数据参考:https://cloud.tencent.com/developer/article/1385853
整体对比来看,需要考虑的区别有:
1.webP动图支持:
本地webP的动图和静图Glide加载都没问题,但是外链的webP动图,Glide加载不了。
Glide(最新4.11.0版本): 不支持加载外链的webP动图,但是可以参考Fresco写个webpsupport,现在也有类似的三方库,比如:https://github.com/zjupure/GlideWebpDecoder。自测发现确实可以做到。
Fresco本身有webpsupport支持。
这点上来说,两种已经没有太多差异。
2.内存:
动图,max java heap:Glide开销比Fresco大不少。max native heap: Fresco碾压了Glide。java heap确实Fresco开销小点,不容易造成oom,但是native heap太高了,虽然native heap不受虚拟机约束,但是对设备整体内存是有压力的,尤其是像盒子这样的设备,内存也就是1G,小的512M。
Fresco核心功能下沉到了native实现的,因此native heap开销,java heap开销小,但是如果native heap开销如上表数据所示的话,那确实也太大了点,从内存这点上看,我认为Glide至少不会比Fresco差。
3.包大小:
Glide比Fresco更轻量级。Glide能省2M左右的包大小,这个也比较关键。
目前没发现必须Glide切到Fresco的理由,当然也有可能有些点是我没调研到的,欢迎讨论。另外切换成本也比较高,Fresco是基于自定义控件SimpleDraweeView做的,而Glide是基于ImageView,所以改动也会比较大。