一键解决Android项目图片压缩烦恼,为apk瘦身!

Posted Android开发中文站

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一键解决Android项目图片压缩烦恼,为apk瘦身!相关的知识,希望对你有一定的参考价值。

ImgCompressPlugin

一款android端自动化图片压缩的gradle插件,一键扫描项目中的资源目录并进行批量图片压缩,提供3种压缩方式,支持有损及无损压缩.同时会记录已压缩的文件,适合个人及团队协同使用.

解决的场景
  • 需要对apk体积瘦身的应用

  • 解决逐个手动压缩的繁杂过程,一键点击即可解决

  • 项目中曾经不慎引入了没压缩过的图片但没发现.怎么破?ImgCompressPlugin帮你解决!

  • UI童鞋给予的设计图大小感觉像压缩过,但实际可能没有,那我究竟是该手动压缩一下还是偷偷懒直接放项目中呢?ImgCompressPlugin帮你解决!

  • 团队版本迭代过程中,多人协同开发,如何避免重复压缩导致的失真,怎么确定图片已经被其他童鞋压缩过呢?ImgCompressPlugin帮你解决!

如何使用

第一步:在Project的build.gradle文件中:

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        ...
        classpath 'com.kingkingdu.plugin:img-compressor:1.1.4'
    }
}
...
...
//图片压缩插件配置,后文有对配置信息介绍
apply plugin: 'img-compressor'
imgCompressOpt{
    way="pngquant"
    test = false
    whiteFiles=["text_pic1.png","test_pic2.jpg"]
    minSize=5
    tinyKeys=["your key"]
}

第二步:引入后点击sync now,gradle配置完毕后会显示下图imgCompressTask,双击即可执行,等待压缩结果即可

配置信息
  • way:设置压缩的方式,支持3种常见的压缩,"tinypng","pngquant","zopflip" 3选1,压缩方式选择及压缩效果见下图

  • test:设置测试模式是否开启,false表示压缩后图片直接覆盖原图,true表示会把原图及压缩图输出到测试目录(Project/ImageCompressTest)

  • whiteFiles:选填,白名单文件数组,不进行压缩

  • minSize:单位为KB,设置原图大于某个数值才触发压缩,0表示全部都压缩

  • tinyKeys:选填,仅在way="tinypng"情况下才需要,tinyKeys申请教程入口

压缩效果
原图 tinypng pngquant zopflip
压缩类型 有损 有损 无损
1.3M 445KB 542KB 903KB
一键解决Android项目图片压缩烦恼,为apk瘦身!
一键解决Android项目图片压缩烦恼,为apk瘦身!



如何选择合适的压缩方式
  • 如果项目本身原先使用的压缩方式与3种模式之一相同,则way选择相同的方式.

  • 如果原先没有固定的压缩方式,那么推荐使用tiny或者pngquant,相对来说,tiny压缩时间较长,需要去tinyKey官网申请key,教程入口,但效果最好.pngquant压缩快速,效果也不错

白名单的意义
  • 当进行图片压缩后发现有少量图片失真,则可以加入白名单,避免被压缩

测试模式
  • 适合场景:UI设计师可能需要协助对比压缩后的图片是否失真,但又没项目的代码权限,所以把压缩后的图片放置在一个目录整体打包,发给设计师审阅,当然最便捷的方式是Android studio自带的版本对比工具.

  • 当配置中test=true时,会把原图及压缩后的图输出到测试目录(Project/ImageCompressTest),压缩后的图片命名为xxxx(test).png

  • 注意:当测试目录中只存在原图但不存在压缩后的图片时,表示图片已充分压缩,无需再压缩

最佳实践
  • 引入本插件,配置测试模式test=false,初次执行imgCompressTask后,查看log,会打印类似日志:

Task finish, compressed:3 files  skip:3 Files  before total size: 951.50KB after total size: 309.67KB save size: 641.83KB
通过日志可得知被压缩图片为3个,跳过图片为3个,图片压缩前后的大小比较.图片跳过的原因为图片已充分压缩,无需再压缩

  • 执行task后会在project目录下生成image-compressed-info.json文件,记录了已压缩的图片信息

  • 通过Android studio自带的版本控制对比压缩前后图片是否失真,将失真图片(一般很少)加入白名单中,同时revert恢复原图

  • 将image-compressed-info.json文件加入到版本控制,提交修改后的图片及json文件

  • 在后续的版本开发中,团队中的任何人在开发过程中加入任何图片,或者等版本提测后,执行一次task即可压缩新版本引入的图片,旧版本的图片保持不变,也不会出现团队成员重复压缩的情况

  • 建议团队中一位童鞋专门处理图片压缩即可,无需所有人都懂得使用.也避免了json文件冲突问题.

问题解答

Q1:如果在后续版本迭代过程中,已压缩的图片替换成新的图片,会不会忘记压缩了?

答:不会.插件本身会通过MD5进行校验,而不是图片命名进行校验,故新图片也会执行压缩的

Q2:支持的图片格式有哪些?

答:支持png,jpg格式,webp暂时不支持

Q3:对于组件化项目存在多个module,是否会扫描所有的module?

答:会全部扫描,只要是application类型或者Android library类型都会被扫描到

最后

此插件已在笔者团队中线上使用,效果不错.


以上是关于一键解决Android项目图片压缩烦恼,为apk瘦身!的主要内容,如果未能解决你的问题,请参考以下文章

Android APK瘦身大法——SVG图片瘦身

Android文件Apk下载变ZIP压缩包解决方案

华科云KVM瘦客户机化身“美国队长”,让商务办公没烦恼

如何使用 Gradle 6.1.1 为 APK 设置压缩?

Android APK安装过程学习笔记

APK 简析