前言
项目中引入了“大量的”lottile动画文件以优化动画显示效果,稍微统计了下,共20多个,小的几十k,大的1.33M,总大小超过8M,apk包体积急速膨胀。
解决方案
由于项目中显示动画的需要,引入了大量的Lottie动图,以优化显示效果导致包体积急速膨胀,目前可以想到的解决方案主要有如下2种:
方案1)远端方案
将lottie json文件放置在远程服务端,在需要时加载文件或者提前预加载到本地。
这个方案可以说是针对“包体积”最优的解决方案,但缺点也同样致命。优化方案会切入业务逻辑,对于已经开发好的项目需要重新进行测试评估,增加了业务逻辑Bug的风险,只适合在项目开启之初同步介入。对于此方案还需要增加对json文件“下载-管理-失败重试”等文件管理相关的业务逻辑,增加了维护调试成本。但如果相关方案一旦建立和稳定运行,还是很“香”的。同时还有文件在什么时候加载也是门学问,如果简单化的一股脑在启动时加载,极易造成运行卡顿或者内存占用过高OOM等风险。
方案2)“本地”方案
压缩lottie json文件的大小,缓解apk包体积急速膨胀的问题。
这个方案只能稍微缓解下apk包体积膨胀的问题,只能是个临时方案,后续建议采用方案1)替代。
如何压缩Lottie动画文件的大小?
回到本文的正题,Lottie导出的动画文件简单归类主要有两种,一种是以.zip
或.lottie
文件结尾的文件,也可能是个文件夹(里面包含一堆图片和一个.json
文件),另一种则是单独只有一个json文件(开头截图中的那种)。
针对以.zip
或.lottie
文件结尾的Lottie文件(素材图片独立于.json
文件),压缩方案直接对这些图片素材进行压缩。可以参考我以前写的一篇文章《Android图片资源压缩记》和使用图片批量压缩工具进行处理。
PS: 强烈建议是不改文件及其后缀名,如果确实需要修改,则要注意要把.json
文件里相应的name也同步更改,否则使用时将导致找不到文件直接报错。
针对单独只有一个.json
文件的Lottie文件,我这边开发了一个脚本,用于压缩json文件,可以有效的对文件进行压缩,效果如下:
PS:不同的文件压缩率不同,取决于使用素材图片的大小和多寡。
批处理程序:tiny-lottie.exe
开源地址: 码云(gitee) /chockqiu/tiny-lottie
在需要批处理的文件夹下运行如下命令,将批量处理文件夹下所有*.json文件。
Windows环境
tiny-lottie.exe -q 75 -p
Mac/Linux环境
python tiny-lottie.py -q 75
命令行参数
usage: TinyLottie [-h] [-d directory] [-q quality] [-o] [-p]
Lottie文件批处理工具, 支持使用webp图片压缩Lottie文件
optional arguments:
-h, --help show this help message and exit
-d directory, --dir directory 运行文件夹,默认当前文件夹
-q quality, --quality quality 质量百分比[0-100],Webp图片压缩率,数字越大质量越高
-o, --overwrite 是否覆盖源文件
-p, --pause 执行完是否暂停窗口以便查看输出