数据结构论坛

首页 » 分类 » 问答 » 抖音包大小优化资源优化
TUhjnbcbe - 2020/9/25 4:55:00
1.概述

随着业务的快速迭代,抖音Android端的包大小爆发式增长。包大小直接影响到下载转化率、推广成本、运行内存和安装时间等因素,因此对apk进行瘦身是一件很有必要且收益很大的事情。apk主要由dex、resource、asserts、nativelibraries和meta-data组成,针对每一部分,都可以专项去做包大小优化。抖音Android端经过一段时间努力,包大小优化已经取得了阶段性的成果。目前仍在持续的优化中。

-优化前优化后百分比抖音73MB61.5MB15.7%抖音lite10MB4.9MB51%

其中,资源在apk包体积中占比很大,针对资源进行优化是包大小优化中很重要的部分。本着追求极致的原则,本文将详细阐述抖音Android端针对资源部分的优化措施。

2.图片压缩2.1图片压缩原理

在不进行压缩的情况下,图片大小计算公式:图片大小=长x宽x图片位深。一张原始图像(x),如果每个像素32bit表示(RGBA),那么图像需要的存储大小xx4=Byte,大约8M,一张图这么大是难以接受的。因此我们使用的图片都是经过压缩的。图片压缩利用的是空间冗余和视觉冗余原理:

空间冗余利用的是图像上各采样点颜色之间存在着的空间连贯性,把本该一个一个像素存储的数据,合并压缩存储,加载时进行解压还原。通常无损压缩利用的就是空间冗余原理。视觉冗余是指人类的视觉系统由于受生理特性的限制,对于图像场的注意是非均匀的,人对细微的颜色差异感觉不明显。例如,人类视觉的一般分辨能力为26灰度等级,而一般的图像的量化采用的是28灰度等级,即存在视觉冗余。通常有损压缩利用的是人的视觉冗余原理,擦除了对人的眼睛来说冗余的信息。2.2优势

抖音Android研发团队开发了Gradle插件McImage,在编译期间hook资源,采用开源的算法pngquant/guetzli进行压缩,支持webp压缩。与tinypng等一些已知的方案相比,存在以下优势:

McImage现支持webp压缩,压缩比高于tinypng,不过Android上webp需要做兼容,下文会详细介绍;tinypng不开源,每个账号每个月只能免费压缩张;McImage使用的压缩算法都是基于开源算法;McImage不仅可以压缩module中的图片,还能压缩jar和aar中的图片;McImage支持压缩算法扩展,有更优的压缩算法选择时扩展方便;和行业里其他方案相比,McImage还能够支持压缩包含透明度的webp图片,并且兼容了aapt2对资源的hook。2.3收益

McImage支持两种优化方式,这两种优化方式不可同时使用:

Compress,pngquant压缩png图片,guetzli压缩jpg图片;ConvertWebp,webp压缩png\png图片。

webp的压缩比要高于pngquant、guetzli,所以现在更推荐使用ConvertWebp这种压缩方式。

McImage还被应用于字节跳动旗下多个产品的图片压缩优化工作中,收益如下:

描述收益抖音-Compress9.5MB抖音-ConvertWebp11.6MB火山-ConvertWebp3.6MBVigo-ConvertWebp4MBVigoaab-Compress1.2MBvigoaab-ConvertWebp3.2MB多闪-ConvertWebp3.5MB2.4其他

除了压缩、优化图片,McImage还提供了以下功能:

大图检测。在app/build/mcimage_result目录下会生成mcimage_log.txt日志文件,除了输出转换结果的日志外,在最后还输出了大像素图片和大体积图片,阈值可在McImageConfig里进行设置,方便大图复盘优化包大小;也支持编译阶段检测,检测到大图直接block编译,可及时发现大图提交;压缩算法方便扩展。如果想接入其他压缩算法,只需要继承AbstractTask,实现ITask接口中的work方法即可;支持多线程压缩。把所有task的执行放入线程池中执行,大大缩短了mcimage的执行时间;增加了图片缓存cache,进一步缩短打包时间。在开启多线程+图片缓存的情况下,全部命中缓存的情况下,整个mcimage的过程不到10s;缓存路径可配置;压缩质量可配置,满足不同的压缩质量需求,缓存文件也会按照不同的压缩质量进行保存和命中;扫描不包含透明通道的图片到app/build/mcimage_result目录下。3.webp无侵入式兼容3.1tinypng和webp的选择

tinypng与webp到底哪个压缩比更高呢?在网上找不到两种压缩算法压缩比的直接比较,需要更直观的对比,于是做了如下的实验:

扫描项目中张图片,通过不同的算法压缩进行对比:描述大小原图.07KBwebp压缩.18KBtinypng压缩.18KB从项目中找张图片,新建demo,不同算法压缩图片后比较打包apk的大小:描述大小原图APK.53KBwebp压缩APK.06KBtinypng压缩APK.80KB

通过这两组实验对比,可以看出webp的压缩比是优于tinypng的。之前也手动的使用webp工具压缩过抖音工程中所有图片,包大小减少了1.6MB左右。因此选择了Webp压缩算法。

3.2方案选型

webp压缩算法,相较于pngquant、guetzli、tinypng,webp压缩比更高,所以webbp压缩图片应该是更优的选择。但是Android设备对webp的支持存在兼容性问题,在4.3以上才完全支持。通过

1
查看完整版本: 抖音包大小优化资源优化