您当前的位置:首页 > 电脑百科 > 程序开发 > 移动端 > Android

58同城Android瘦身优化之webq实践

时间:2022-06-16 10:47:43  来源:  作者:Android秃老师

前言

我们知道,理想的网页应该在 1 秒内打开,而在页面的整体大小中,图片往往是所占比例最大的一部分(大约占到 60% 以上,更多了解请点击),也可以参照如下图所示。优化图片不仅可以加快页面显示,还能降低移动网络的流量费用。原图产生的 PNG、JPEG、GIF 和 SVG 图片一般都有很大的压缩余地。下文将重点介绍一款图片新格式:WebP,从而揭开它神秘的面纱。

58同城Android瘦身优化之webq实践

 

解决方案:使用 WebP 优化图像

什么是Webp?

WebP是一种同时提供了有损压缩与无损压缩(可逆压缩)的图片文件格式,至于什么是有损压缩,什么是无损压缩,自己点进去看看

WebP的压缩的原理

第一步:宏块

与JPG相同的时,WebP也采用宏块进行压缩,典型的宏块由一个 16×16 的亮度像素(luma pixel)块和两个 8×8 的色度像素(chroma pixel)块组成。分块越小,预测越准,需要记录的信息也越多,一版来说,细节月丰富的地方,分块越细。相对不丰富的地方使用16x16分块。

58同城Android瘦身优化之webq实践

 

image.png

第二步:预测

WebP最大的不同之处在于每个4x4的宏块中都有一个预测模型。(又名:过滤),PNG过滤用的比较多,它对每一行做同样的事,WebP过滤是针对每一个块。

VP8帧内预测常用的三种宏块:

  • 4x4 亮度像素块
  • 16x16 亮度像素块
  • 8x8 色度像素块

编码器会将它们放在一个4x4的测试像素块填满,并确定哪一个生成了最接近原始块的值。这些用不同方法填满的块叫做”预测块”。

主要使用的预测方式有以下4种:

  • H_PRED(Horiz prediction-水平预测)——像素块中每一列使用左边一列(col L)的数据填充
  • V_PRED (vertical prediction-垂直预测)——像素块中每一行使用其上边一行(row A)的数据填充
  • DC_PRED (DC prediction - DC 预测)——像素块中每个单元使用 row A 和 col L 的所有像素的平均值填充。
  • True Motion (TrueMotion 预测)——一种超级先进的模式,我没找到原理,暂时还不懂。
58同城Android瘦身优化之webq实践

 

image.png

对于4x4的亮度块,会有6种额外预测模式,类似于垂直预测与水平预测方式,他们可以从不同的方向去填充剩余色块。

第三步:DCT(离散余弦变换)

将预测部分的原图数据减去预测出来的数据,得到差值矩阵,最后对差值进行DCT。此步骤会生成一个频率系数矩阵,坐上的系数幅度最大,右下的最小,幅度值越小,频率越高。大部分图片信息都在左上区域,这一步的作用就是朱熬出图片的高频区域和低频区域。

第四步:量化

人眼对高频部分不敏感,这一步会将高频部分舍去。对上一步的频率系数表和量化表进行计算,将频率系数表和量化表按位相除,并四舍五入整数位,最终生成一个量化矩阵。

第五步:算法编码

WebP不同于JPEG,也可以说由于JPEG压缩的地方在于,WebP采用了算法编码压缩(Arithmetic encoding),JPEG采用的是霍夫曼编码(Huffman encoding),算法编码提供了优于霍夫曼编码5%-10%的压缩率。

WebP转换技术图片瘦身实践

一、Android系统版本对WebP的支持

Android 系统在 4.0 版本中添加入了 WebP 的支持,并在 4.2.1 版本中加强了它:

  • 4.0+ (Ice Cream Sandwich): 基础的 WebP 支持
  • 4.2.1+ (Jelly Beam MR1): 支持带透明度与无损的 WebP

Fresco 默认使用系统的 WebP 方案来加载它。

但同时,Fresco 能够让你在更老的版本中使用 WebP,所以如果你想要在 Android 2.3 版本的设备上使用 WebP, 你需要做的就是在工程中添加一个 webpsupport的依赖:

dependencies { // your App's other dependencies compile 'com.facebook.fresco:webpsupport:1.0.1'}
  1. 无损压缩的WebP比PNG至少压缩26%的体积,在相同的SSIM下有损压缩的WebP比JPEG压缩至少25-34%的体积;
  2. 无损WebP的支持的透明通道只占大约22%的字节,有损压缩支持RGB和透明度的压缩,通常可以压缩PNG的1/3文件大小

二、实践转换图片

实践出真知,为了得出准确的结论,将WebP技术应用到我们的58Android项目中,以下内容都为实践结论:

将PNG转换WebP的效果

将三种图片同时在手机上显示查看效果,图片类型如下:

  1. 原图
  2. 原图无损压缩(58%)
  3. 原图转WebP(有损压缩75%)
58同城Android瘦身优化之webq实践

 

从上图可以看出三种图片从肉眼看是无差别的

PNG转WebP是可以控制有损压缩比例的,上图有损压缩75%,肉眼查看无差别,那其他的压缩比例呢?

接下来我们继续做实验查看:

三张图片进行对比

第一张为原图、第二张为使用tinypng在线压缩过的图片、第三张为WebP不同压缩比例的图片

  • 无损压缩转换
  • 有损压缩(75%)转换
  • 无损压缩(50%)转换
  • 无损压缩(0%)转换

三、数据分析

 

58同城Android瘦身优化之webq实践

 

通过图片效果对比和上表数据分析,WebP的有损压缩75%是图片肉眼看是无差别的,文件体积减少也是较大的,是官方推荐方案

以上对比我们初步有了方案,再思考一个问题:

PNG经(tinypng)压缩是可以叠加压缩,同时图片体积也叠加减少的,那叠加压缩的图片在进行WebP转换是不是效果会更好呢?

带着问题我们做一个实验

1.先将PNG经过tinypng叠加压缩,查看效果

58同城Android瘦身优化之webq实践

 

2.将每次叠加压缩后的图片转换WebP(有损压缩75%),查看效果

原图转换WebP

58同城Android瘦身优化之webq实践

 

第一次压缩(叠加)后转换WebP

58同城Android瘦身优化之webq实践

 

第二次压缩(叠加)后转换WebP

58同城Android瘦身优化之webq实践

 

第三次压缩(叠加)后转换WebP

58同城Android瘦身优化之webq实践

 

第四次压缩(叠加)后转换WebP

58同城Android瘦身优化之webq实践

 

可以看出图片肉眼看是无差别的

我们在分析一下体积变化

58同城Android瘦身优化之webq实践

 

结论:webp文体大小与图片压缩次数成正比,WebP的转换最好是用原图转换

GIF转换WebP效果对比

1、原GIF图

58同城Android瘦身优化之webq实践

 

2、将原gif转换AnimationWebP

 

58同城Android瘦身优化之webq实践

 

PNG(images with transparency/alpha)转换WebP效果对比

带有透明通道的图片转换效果对比

58同城Android瘦身优化之webq实践

 

查看效果后产出结论

1、项目中的原图体积是39.6KB(之前是经过压缩了的图片),转换(75%)后的体积是43.0KB,反而增大了;2、不是所有的图片在推荐的有损转换75%的情况下体积会变小,尤其是有透明度通道的图片; 四、讲解一下Android studio 自带 WebP Tool

58同城Android瘦身优化之webq实践

 

  • 支持有损转换,默认推荐75%,同时支持无损转换;
  • 可以跳过那些转换后比原是大小大的文件;
  • 点9图是默认跳过,不支持转换的;
  • 可以跳过有透明度通道的图片;

四、将项目中hybrid module 的drawable资源压缩

以上试验可以看到WebP转换技术可以使图片体积减小,如果我们将项目中的资源图片都替换成WebP是不是APK的体积会明显减小呢?

就以我们58主工程的hybrid module的drawable资源做实验

  1. 使用WebP tool 将所有资源转换,跳过含有透明度通道的图片
  2. 查看APK大小

 

58同城Android瘦身优化之webq实践

 

效果分析:1、仅hybird库就可以减少将近1MB的大小,全部替换更客观; 2、但因为WebP格式存在机型适配问题,不能将全部图片替换.

WebP对图片的体积减少真的是个利器,那么内存方面的影响呢,我们项目中图片框架是Fresco,同时Fresco对WebP也做了很好的支持,接下来使用Fresco加载WebP查看内存的占用。

五、Fresco加载WebP在项目实践中的内存占用

项目中往往引导图都是较大的图片资源,使用引导图作为试验对象,查看内存情况,同时可以得出是否有优化空间。

1、项目中找一个引导图做实践

先来看PNG和WebP图片引导图的显示效果

PNG图片,原生控件ImageView加载显示

58同城Android瘦身优化之webq实践

 

WebP图片,Fresco控件加载WebP显示

58同城Android瘦身优化之webq实践

 

显示效果一致,肉眼看无差别 #引导图PNG转换为WebP操作数据对比

58同城Android瘦身优化之webq实践

 

图片体积减少40% 2、引导图PNG和WebP内存占用对比

为了更好的显示对比效果,我做了一个显示数量扩大的试验,具体操作步骤如下:

先使用PNG图片为引导图

  • 使用一个引导框(Dialog)为例,有一个引导图,如上图显示;
  • 将引导图的PNG图片资源用原生ImageView加载,在未弹起引导框时记录初始状态内存量(A);
  • 弹起引导框->关闭引导框->再弹起引导框->关闭引导框,每个引导框对象都是new 出来的,如此重复1000次后,记录执行1000次引导操作后内存量(B);
  • 强制执行GC操作,执行多次,在内存平稳时记录执行GC后内存量(C);
  • 计算执行GC后比初始状态增加内存量(C-A)。

将PNG图片转换为WebP后使用Fresco加载,重复PNG图片引导图的操作步骤,然后进行数据对比

58同城Android瘦身优化之webq实践

 


58同城Android瘦身优化之webq实践

 


58同城Android瘦身优化之webq实践

 

3、将结果纪录并对比

58同城Android瘦身优化之webq实践

 

结论:1、5.0以上系统,由于内存管理的优化,所以对于5.0以上的系统 Fresco将Bitmap缓存直接放到了JAVA Heap中,5.0以下系统,图片不存储在Java heap,而是存储在ashmem;2、Android 原生ImageView的PNG显示引导图增大了native heap内存;3、使用原生ImageView 加载图片内存增大要比使用Fresco大;4、强制执行GC只会释放Java Heap,对Native Heap 无影响; 七、Android Profier的使用简介

58同城Android瘦身优化之webq实践

 

如上图所示,内存分析器的默认视图包括以下内容:

  • ① 强制执行垃圾收集事件的按钮。
  • ② 捕获堆转储的按钮。
  • ③ 记录内存分配的按钮。
  • ④ 放大时间线的按钮。
  • ⑤ 跳转到实时内存数据的按钮。
  • ⑥ 内存使用时间表,其中包括以下内容:
    • 每个内存类别使用多少内存的堆栈图,如左边的y轴和顶部的颜色键所示。
    • 虚线表示已分配对象的数量,如右侧y轴所示。
    • 每个垃圾收集事件的图标。
58同城Android瘦身优化之webq实践

 

在classes列表中,您可以看到以下信息:

  • Heap Count: 堆中的实例数。
  • Shallow Size: 此堆中所有实例的总大小(以字节为单位)。
  • RetAIned Size: 这个类的所有实例(以字节为单位)保留的内存总大小。

在类列表的顶部,可以使用左下拉列表在以下堆转储之间切换

  • Default heap: 当系统没有指定堆时。
  • App heap: 应用程序分配内存的主堆。
  • Image heap: 系统引导映像,包含在引导期间预加载的类。这里的分配保证永远不会移动或离开。
  • Zygote heap: Android系统中分发应用程序进程的写时复制堆

六、项目使用WebP格式文件的规范

  1. 使用推荐转换方案,75%有损压缩;
  2. Fresco对WebP的使用做了支持,相当于扩展了一种图片类型,API的使用和PNG、JPEG、GIF无差别;
  3. 对于大图显示建议使用Fresco加载,使用WebP格式降低文件体积

总结

WebP的压缩优于其他图片,主要得益于起继承自VP8的帧内预测技术,相比于JPEG对图像原值进行编码来说,WebP编码的是预测值和原值的差值,这也是WebP体积更小的主要原因,最后,WebP使用了更优秀的算法编码。有关Android性能优化的更多学习;可前往:

这个WebP的压缩过程用,一张图可以囊括表述:

58同城Android瘦身优化之webq实践

 

当然以上主要是针对WebP的有损压缩(lossy WebP)来进行的原理讲解,无损压缩的逻辑与其完全不同,不过我们提高性能,主要也是采用的有损WebP。

希望以上内容,对大家了解WebP的原理有一定的帮助,能让大家更好的去使用WebP。



Tags:webq   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
58同城Android瘦身优化之webq实践
前言我们知道,理想的网页应该在 1 秒内打开,而在页面的整体大小中,图片往往是所占比例最大的一部分(大约占到 60% 以上,更多了解请点击),也可以参照如下图所示。优化图片不仅可以加...【详细内容】
2022-06-16  Search: webq  点击:(400)  评论:(0)  加入收藏
▌简易百科推荐
Android Emulator黑屏怎么办 Android模拟器黑屏解决方法
Android Emulator黑屏问题困扰了非常多的玩家,Android Emulator作为一款安卓模拟器,可以让你在电脑上运行和浏览安卓应用程序,但是程序本身不是很稳定,很容易会出现黑屏,启动不了...【详细内容】
2024-03-04  18183游戏网    Tags:Android Emulator   点击:(45)  评论:(0)  加入收藏
Android开发中常见的Hook技术有哪些?
Hook技术介绍Hook技术是一种在软件开发中常见的技术,它允许开发者在特定的事件发生时插入自定义的代码逻辑。常见的应用场景包括在函数调用前后执行特定的操作,或者在特定的事...【详细内容】
2023-12-25  沐雨花飞蝶  微信公众号  Tags:Android   点击:(91)  评论:(0)  加入收藏
在Android应用开发中使用NFC功能
NFC介绍NFC是指“近场通讯”(Near Field Communication),它是一种短距离无线通信技术,允许设备在非接触或极短距离内进行通信。NFC通常用于移动支付、门禁系统、智能标签和其他...【详细内容】
2023-12-22  沐雨花飞蝶  微信公众号  Tags:Android   点击:(104)  评论:(0)  加入收藏
关于Android图像Bitmap类,你要知道的一切
Bitmap介绍Bitmap是一种图像文件格式,它由像素阵列组成,每个像素都有自己的颜色信息。在计算机图形学中,Bitmap图像可以被描述为一个二维的矩阵,其中每个元素代表一个像素的颜色...【详细内容】
2023-12-19  沐雨花飞蝶  微信公众号  Tags:Android   点击:(102)  评论:(0)  加入收藏
Android开发中如何进行单元测试?
单元测试介绍单元测试是软件开发中的一种测试方法,用于验证代码中的最小可测试单元(通常是函数或方法)是否按预期工作。单元测试通常由开发人员编写,旨在隔离和测试代码的特定部...【详细内容】
2023-12-11  沐雨花飞蝶  微信公众号  Tags:Android   点击:(170)  评论:(0)  加入收藏
一篇聊聊Jetpack Room实现数据存储持久性
Room介绍Room 是 Android Jetpack 组件库中的一部分,它是用于在 Android 应用中进行本地数据库访问和管理的库。Room 提供了一个抽象层,使开发者能够更轻松地访问 SQLite 数据...【详细内容】
2023-12-08  沐雨花飞蝶  微信公众号  Tags:Jetpack   点击:(149)  评论:(0)  加入收藏
了解Android系统架构中的HAL硬件抽象层
在Android系统中,HAL的存在使得不同厂商的硬件可以统一被上层的应用程序调用,从而提高了系统的兼容性和可移植性。HAL还可以帮助开发者更方便地开发应用程序,因为他们不需要为...【详细内容】
2023-12-06  沐雨花飞蝶  微信公众号  Tags:Android   点击:(212)  评论:(0)  加入收藏
我们一起聊聊 IntentService 与 Service 的区别?
Service介绍Service组件是Android应用开发中的四大组件之一,用于在后台执行长时间运行的操作或处理远程请求。它可以在没有用户界面的情况下执行任务,并且可以与其他应用组件...【详细内容】
2023-12-06  沐雨花飞蝶  微信公众号  Tags:IntentService   点击:(178)  评论:(0)  加入收藏
Android数据对象序列化原理与应用
序列化与反序列化「序列化」是将对象转换为可以存储或传输的格式的过程。在计算机科学中,对象通常是指内存中的数据结构,如数组、列表、字典等。通过序列化,可以将这些对象转换...【详细内容】
2023-11-14  沐雨花飞蝶  微信公众号  Tags:Android   点击:(279)  评论:(0)  加入收藏
你了解Android中的SELinux吗?
SELinux介绍SELinux(Security-Enhanced Linux)是一种安全增强的Linux操作系统,它通过强制访问控制(MAC)机制来提供更高级别的系统安全保护。相比于传统的Linux访问控制机制(DAC),SEL...【详细内容】
2023-11-09  沐雨花飞蝶  微信公众号  Tags:Android   点击:(272)  评论:(0)  加入收藏
相关文章
    无相关信息
站内最新
站内热门
站内头条