实现思路

在 mergeRes 和 processRes 任务之间插入 WebP 压缩任务,如下图所示:

使用开源框架Cwebp,使用命令行对所有的图片进行遍历处理,然后将结果输出
Google 官方提供的下载地址:https://storage.googleapis.com/downloads.webmproject.org/releases/webp/index.html 下载的 cwebp 二进制可执行文件 64 位版本。

由于 WebP 格式在 14 <= minSdkVersion <= 17 不支持带 alpha 通道的图像,所以,针对 AAPT2, alpha 两个维度,将 task 分成了4 种:

应用是发布在 Google Play 上,应用的启动图标必须是 PNG 格式,否则 Google Play 不会接受。

代码实现

以下代码均来自booster开源项目

1.自定义gradle插件BoosterPlugin.java

这里的variantProcessors方法代码如下:

  private val variantProcessors: Collection<VariantProcessor>get() = BoosterServiceLoader.load(VariantProcessor::class.java, javaClass.classLoader).sortedBy {it.javaClass.getAnnotation(Priority::class.java)?.value ?: 0}

通过BoosterServiceLoader加载所有实现VariantProcessor接口的类,例如CwebpCompressionVariantProcessor就是用于webp图片压缩,PngquantCompressionVariantProcessor用于针对于不能使用cweb的情况进行图片压缩,还有很多其他的Processor。

查看CwebpCompressionVariantProcessor代码

@AutoService(VariantProcessor::class)
class CwebpCompressionVariantProcessor : VariantProcessor {override fun process(variant: BaseVariant) {val results = CompressionResults()val filter = if (variant.project.aapt2Enabled) ::isFlatPngExceptRaw else ::isPngExceptRawCwebp.get(variant)?.newCompressionTaskCreator()?.createCompressionTask(variant, results, "resources", {variant.scope.mergedRes.search(filter)}, variant.mergeResourcesTask)?.doLast {results.generateReport(variant, Build.ARTIFACT)}}}

这里通过谷歌的AutoService来实现,这里使用实现VariantProcessor接口的方式,主要是为了解耦,因为有很多插件的功能,但是别人使用不一定都会用到,通过接口实现的方式,如果没使用到的功能,没有引入,则没有实现类

2.CwebpCompressionVariantProcessor#newCompressionTaskCreator

@AutoService(VariantProcessor::class)
class CwebpCompressionVariantProcessor : VariantProcessor {override fun process(variant: BaseVariant) {val results = CompressionResults()val filter = if (variant.project.aapt2Enabled) ::isFlatPngExceptRaw else ::isPngExceptRawCwebp.get(variant)?.newCompressionTaskCreator()?.createCompressionTask(variant, results, "resources", {variant.scope.mergedRes.search(filter)}, variant.mergeResourcesTask)?.doLast {results.generateReport(variant, Build.ARTIFACT)}}}

3.Cwebp#newCompressionTaskCreator()

 override fun newCompressionTaskCreator() = SimpleCompressionTaskCreator(this) { aapt2 ->when (aapt2) {true -> when (supportAlpha) {true -> CwebpCompressOpaqueFlatImages::classelse -> CwebpCompressFlatImages::class}else -> when (supportAlpha) {true -> CwebpCompressOpaqueImages::classelse -> CwebpCompressImages::class}}}

通过是否支持supportAlpha和aapt2决定不同的task

minsdk只要大于17都是支持alpha的,且gradle 3.0以上都是使用aapt2了,所以这里创建CwebpCompressOpaqueFlatImages

4.SimpleCompression

Android Apk瘦身方案2——gradle插件将png自动压缩为webp相关推荐

  1. Android Apk瘦身方案1——R.java文件常量内联

    R.java 文件结构 R.java 是自动生成的,它包含了应用内所有资源的名称到数值的映射关系.先创建一个最简单的工程,看看 R.java 文件的内容: R文件生成的目录为app/build/gen ...

  2. Android Apk瘦身指南大全

    Android Apk瘦身指南大全 前言 为什么Android应用Apk要瘦身?虽然安装包大小对应用使用没有影响,但应用的安装包越大,用户下载的门槛越高,安装等待时间也会越长,特别是在移动网络情况下, ...

  3. Android APK 瘦身

    Android APK 瘦身的几个方法 将项目中的图片由png.jpg转为webp格式.如下操作: 1.1选中图片或者含有图片的文件夹 右键选择Convert toWebP.. 1.2根据自身情况选择 ...

  4. Android APK 瘦身 - JOOX Music项目实战

    JOOX Music是腾讯海外布局的一个音乐产品,2014年发布以来已经成为5个国家和地区排名第一的音乐App.东南亚是JOOX Music的主要发行地区,由于JOOX Music所面对的市场存在很多 ...

  5. Android apk瘦身讲解

    apk瘦身 想办法较减少apk大小 必要性 同样功能,apk越小越好,用户下载动机更大 了解apk的组成 classes.dex:是java源码编译后生成的java字节码文件 resources.ar ...

  6. Android apk瘦身之使用TinyPng压缩图片

    1 前言 Android apk太大了怎么办,有的时候需要减小apk的体积,例如上传到服务器的时候有文件大小的限制.百度一下,发现大致有以下几种方法: 使用混淆,减少代码体积 删除不使用的资源 减少使 ...

  7. APK瘦身记,怎样实现高达53%的压缩效果

    作者:非戈@阿里移动安全,很多其它技术干货.请訪问阿里聚安全博客 1.我是怎么思考这件事情的 APK是Android系统安装包的文件格式.关于这个话题事实上是一个老生常谈的题目.不论是公司内部.还是外 ...

  8. APK瘦身记,如何实现高达53%的压缩效果

    原文链接:http://drops.wooyun.org/mobiledev/14289#more-14289 0x00 我是怎么思考这件事情的 APK是Android系统安装包的文件格式,关于这个话 ...

  9. android APK瘦身全面总结——如何从32.6M到13.6M

    前言 之前我简单介绍了关于svg图片瘦身的问题,在公司,瘦身这个问题是我提出来的,所以这锅我背了.公司项目是32.6M,我给自己的要求就是低于20M.上周花了一个星期瘦身,至于为什么花了一周,主要是s ...

最新文章

  1. java excel md5,excel表格数据md5加密-excel 怎么把文本转化成md5
  2. 数塔 HDU - 2084
  3. android 获取控件高度_安卓开发入门教程UI控件_ProgressBar
  4. java hashcode 例子_Java UUID hashCode()用法及代码示例
  5. DBA跳槽应该去大公司还是小公司?99%的人这样说...
  6. PMP 第十章 项目沟通管理
  7. kubernetes kubeadm init this version of kubeadm only supports deploying clusters kubeadm版本降级
  8. 9008刷机教程oppo_OPPO手机解锁教程
  9. 如何把PDF锁定,限制修改文档内容?
  10. Computer Vision: Algorithms and Applications阅读笔记
  11. 两台win7电脑,双网卡主机共享网络(局域网和Internet)给从机
  12. 门禁上的push是什么意思_门禁系统专业术语对照表
  13. uniapp获取用户数据昵称为“微信用户”(小程序)@杨章隐
  14. TF-A中的工具介绍
  15. ubuntu系统外连接两个显示器设置
  16. 计算机密码是空的怎么重置,电脑忘记开机登录密码怎么办? Windows 密码重置 - 合一学院...
  17. [4G5G基础学习]:流程 - 4G LTE 接入网的随机接入流程
  18. 大蟒蛇养殖教程之“模块”
  19. 华为odjava机试题_华为OD机试 :找终点
  20. Android 玩机之路(刷第三方recovery twrp+面具Magisk)

热门文章

  1. 周口科技学院计算机怎么样,周口科技职业学院-周口科技职业学院怎么样啊? 爱问知识人...
  2. ImageGP新上工具:序列提取ID、motif、翻译、反向互补
  3. 前端使用mockjs模拟接口数据
  4. 机器学习教程 之 独立成分分析:PCA的高阶版
  5. 网络营销实验二网站搜索引擎友好性分析
  6. 程序开发心理学(银年纪念版)(经典重读,与温伯格大师的思想共舞)
  7. 从程序员成为技术领导者:掌握全面解决问题的方法(温伯格)
  8. ubuntu中杀掉卡死的Pycharm
  9. C++中的仿函数functor
  10. 怎么样网上赚钱?过来人告诉你一些经验!