WebP的问题和解决方案

5,031 阅读2分钟

千万不要用webp做app的logo,logo还是老老实实用png吧。

加载比png慢

webp相比于png最明显的问题是加载稍慢,不过现在的智能设备硬件配置越来越高,这点差异越来越小。腾讯之前有一篇对于webp的分析文十分不错,如果你准备要用webp了,那么它绝对值得一看。

webp的编码时间较长,是png的5倍以上,但解码速度与png差不多,甚至很多时候比png快。而webp在编码时占用内存比png高25%,解码时比png低30%。——摘自《WebP原理和Android支持现状介绍》

只支持4.2.1+

官方文档中说只有在4.2.1+以上的机型,才能解析无损或者有透明度调整的webp图片,4.0+才开始支持无透明度的webp图片。我通过云测发现,在4.0~4.2.1的系统中,带有透明度的webp图片虽然不会崩溃,但是完全无法显示。

《APK瘦身记,如何实现高达53%的压缩效果》一文中也提到有alpha值的jpg图片经过webp转换后,无法在4.0、4.1的Android系统上运行的问题,具体原因见官方文档

image_1asbq6bejqva1mtuvaj3kc1al22n.png-14kB

机型兼容性不理想

除了兼容性问题外,webp在某些机型和rom上可能会出现一些诡异的问题。在三星的部分机型上,部分有alpha通道的图中会有一条很明显的黑线(三星的rom对于shape的alpha的支持也有问题,是红线)。在小米2刷成4.xx的手机上,系统未能正确识别xml文件中描述的webp图片,也会导致加载webp失败。

不便于预览

因为webp的图片格式是很难预览的,as也没有办法直接预览webp格式,我一般是通过chrome浏览器打开webp,十分不方便。

image_1asbq487rk9b1ff514p7nrefe02a.png-115.1kB

我们知道gradle在build时,有一个mergeXXXResource Task,它将项目的各个aar中所有的res资源统一整合到/build/intermediates/res/flavorName/{buildType}目录下。

webpConvertPlugin这个gradle插件可以在mergeXXXResource Task和processXXXResource Task之间插入一个task,这个task会将上述目录下的drawable进行统一处理,将项目目录里的png、jpg图片(不包含.9图片,webp转换后显示效果不佳)批量处理成webp图片,这样可以让我们在日常开发时用png、jpg,正式发包时用webp。