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

5,773 阅读4分钟

ImgCompressPlugin

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

github地址:github.com/duking666/I…

解决的场景

  • 需要对apk体积瘦身的应用
  • 解决逐个手动压缩的繁杂过程,一键点击即可解决
  • 项目中曾经不慎引入了没压缩过的图片但没发现.怎么破?ImgCompressPlugin帮你解决!
  • UI童鞋给予的设计图大小感觉像压缩过,但实际可能没有,那我究竟是该手动压缩一下还是偷偷懒直接放项目中呢?ImgCompressPlugin帮你解决!
  • 团队版本迭代过程中,多人协同开发,如何避免重复压缩导致的失真,怎么确定图片已经被其他童鞋压缩过呢?ImgCompressPlugin帮你解决!

如何使用

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

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        ...
        classpath 'com.kingkingdu.plugin:img-compressor:1.1.5'
    }
}
...
...
//图片压缩插件配置,后文有对配置信息介绍
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,双击即可执行,等待压缩结果即可

gradle_guide

配置信息

  • 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
原图
tiny
pngquant
zopflip

如何选择合适的压缩方式

  • 如果项目本身原先使用的压缩方式与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类型都会被扫描到

最后

此插件已在笔者团队中线上使用,效果不错. 最后,附上项目开源地址:github.com/duking666/I… 欢迎star和fork,欢迎广大网友为项目贡献代码或提出issue,谢谢