实现思路
在 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 ::isPngExceptRaw
Cwebp.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 ::isPngExceptRaw
Cwebp.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::class
else -> CwebpCompressFlatImages::class
}
else -> when (supportAlpha) {
true -> CwebpCompressOpaqueImages::class
else -> CwebpCompressImages::class
}
}
}
通过是否支持supportAlpha和aapt2决定不同的task
minsdk只要大于17都是支持alpha的,且gradle 3.0以上都是使用aapt2了,所以这里创建CwebpCompressOpaqueFlatImages
4.SimpleCompression