Android的APPT工具会优化PNG吗?

转载请注明出处:http://www.jianshu.com/p/cc17d18c3447

本篇文章翻译自谷歌出的优化视频里面的光头佬(Colt McAnlis),原文地址需翻墙, 以下正文:

Dan的问题:Android程序在构建期间会对PNG图片进行优化吗?

答案是:会的,安卓的工具链确实会在构建期间对PNG做一些优化。你可以看看官方文档

AAPT工具可能会在构建期间自动对res/drawable/文件夹下的图片资源做无损压缩。例如,一张真彩色(RGB)的PNG图片,如果它实际需要的颜色不大于256种,那么就有可能会被转换成一张8位的调色板图片(PNG8)。转换之后的图片质量未减却只占用更小的内存。所以需要注意一点,在这个目录下的二进制图像在构建期间可能会被改变。

Hmm..这倒不错,<256颜色的的图片会被转换成索引模式,但这就完了吗?欲知详情,阅读源码才知道。

APPT工具对PNG图片做了什么

Android系统其中的一个好处是它的大部分工具都是开源的,我们可以直接看AAPT的源码,看看它到底做了什么。在png.cpp文件里定位到analyze_image方法,我们可以看到它会做三个优化检查:

  1. 每个像素都是 R == G == B (grayscale 灰度)
  2. 每个像素都是 A == 255 (opaque 全透明)
  3. 是否有超过256种不同的RGBA颜色

所以APPT会加载PNG图片,判断它是否可以被转成灰度格式的图片,判断它是否是全透明的,或判断它是否可以被转成一张索引图。这就是AAPT干的事。

这些检测是很有意义的,因为实际上APK里的大部分PNG文件通常都是灰度图,全透明,或有限颜色的图片。在有能力知道这些图片的格式,并把它们转成更小的PNG文件,何乐而不为呢。

能否让APPT做得更多?

可能更有趣的是,APPT有哪些事它没有做:

A: 那些会改变图片视觉效果的处理(可能会降低图片的质量)
B: 那些比改变色彩模式更先进的处理

这就是为什么我上一篇文章讨论使用更先进的工具的原因。使用这些先进的工具帮你减少PNG文件的大小,这是AAPT没办法帮你做的。

警告

重要的事情说三遍:当今的数据压缩算法,递归数据压缩是不可能的!!!递归数据压缩是不可能的!!!递归数据压缩是不可能的!!!。如果你对数据压缩过一次,然后想再压缩一次,最好的情况是数据大小不变,但通常情况会得到一个更大的数据。

所以,如果你在把PNG图片扔给AAPT前已经做了一次优化,那么最终可能会变得更大,大概大10%。这似乎不太正常:你都已经花了那么多时间压缩了你的PNG图片了,它们后来怎么还能变大呢:\

解决这个问题的办法是在Gradle文件里用cruncherEnabeled选项去掉对PNG文件的处理:

aaptOptions {
    cruncherEnabled = false
}

这个选项会关掉APPT对你APK里非.9图片的优化。(我还没发现APPT会对.9图片做什么处理…)

最后总结,你可以用自己的优化工具尽可能的把PNG优化得更小,然后记得关掉APPT工具的处理就好。

PS:由于文人水平有限,如有翻译得不好的地方,请留言讨论。
PPS:CSDN的图片注释没显示出来,可以到我简书的博客看。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章