Android APK瘦身实战(二)——资源文件优化

在前一篇文章——Android APK瘦身实战(一)APK分析中,我们可以知道自己APK的大小构成,在知道APK的大小构成后,我们就可以针对特定的部分瘦身了。

删除无用资源

  在APK中,资源文件占用了很大的比重,所以在APK瘦身的时候,首先可以考虑优化,资源文件,删除无用的音视频、图片资源。借助于Android Studio的分析工具,我们可以很方便找到未使用的资源文件。

Analyze>Run Inspection by name(Windows下也可以调用快捷键:Ctrl + Shift + Alt + I),然后输入 unused resource

选择你的project或者module

然后在Inspection Results中会看到有哪些无用的资源,比如我们作坊的一个项目inspection结果如下:

在这里你可以发现有哪些是无用的资源,保险起见,你可以一个个查看,然后删除这些无用资源。当然,咱们也可以一次性全部删掉,反正咱们不是有Git 吗,那么选中你的module,右键Refactor > Remove Unused Resources ,然后选择Refactor。

完了之后,再次检测时会发现已经没有了未使用的资源文件,但是这个还没有结束,因为还有可能有些未使用的类中引用了资源文件,这个时候,再次检查未使用的声明,

这里比较麻烦,需要一个个的去找未使用的类,然后根据具体情况判断是否要删掉他们,删掉后再检查未使用的资源文件。Stack Overflow上面一个关于只检查未使用的类的方法,但是并不凑效。

图片优化

  图片优化是APK瘦身效果最明显的地方,毕竟每个应用中都有不少的图片。图片优化我们可以从以下几个方面来进行:

如何选择图片

  首先要吐槽下我作坊的UI,每次切图过来,所有的图都是32位深的,然后我就问了,为什么都是32位的,他说不知道。选择位深度的依据是啥,也是同样不知道。敢情切图都是随意蒙的啊,甚至曾静给我一张3M多的48位的背景图(虽然在编译成APK时,studio会将它压缩为24位的图),真想把他拉去打靶。。。。不知道也可以查查嘛,再不济也大概可以看看其他大厂的切图是怎样的,然后基本确定下位深度的选择吧。

  • png 8 ,支持256种颜色的索引值表示。png8适合那些颜色比较单一的图像,比如纯色。png8是使用索引值来表示颜色的,并不是采用RGB值来表示,用一个比较直观的例子说明什么是使用索引表示颜色。

    有一张32位深的图,使用PS转化成web和设备所用格式(快捷键:Alt + Ctrl + Shift + S)

    1,选择png8,选透明度是指是否透明,不勾选的话就是不透明。

    2,鼠标放在绿色区域,

    3,然后可以看到该区域的alpha值和16进制颜色值,以及索引。alpha 255表示不透明,索引 1表示鼠标选中的区域的颜色在这张图中所有颜色中的索引。将鼠标放在不同的区域,这些值会变化;从图中可以看出,包括透明区域,有三种颜色,所以索引值有:0、1、2三种。

  • png 24,8位3通道颜色表示,GRB分表用8bit位表示,不支持透明。在图片颜色比较丰富,而又不需要透明的时候可以考虑用24位png图,但是这个时候很多都会用JPG来替代了,因为毕竟JPG更小啊

  • png 32,在24位的基础上增加8bit位表示alpha通道,也就是alpha值可以从1到256。

从上面的解释来看,既然png8 和png32 都支持透明,那该如何选择呢?除了png32表示的色彩更丰富,还有一点需要考虑,png8 透明图片的边缘会有毛刺,通过下面的图对比可以看得比较明显。

所以,以后如果你碰到一个类似我作坊的UI,请告诉他正确的切图方式,这是为他好,我担心他会失业。。。

查看带alpha通道图片的alpha通道

 在查阅alpha通道相关概念时,比较容易找到有关alpha通道概念的描述,但是比较难直观的查看alpha通道到底是咋样的,下面就介绍下怎样通过PS查看带alpha通道的图片的alpha通道

  • 以上面转换成web和设备的32位png为例,将图片拖动到PS
  • 在图层栏,Ctrl + 鼠标点击图层
  • 在通道栏,将选区存储为通道,然后就可以看到通道多了一个alpha通道,而这个alpha通道就是该图的alpha通道样式

在上图中,黑色区域就是透明区域,白色区域就是不透明区域,这样就是比较直观的看到图片的alpha通道的样子了。

png 压缩

 png图片的压缩包括有损压缩和无损压缩,有损压缩这里主要是指将图片转化成webp格式;无损压缩,这里我们是指通过Google提供的zopfli工具对png进行无损压缩。

png转webp

 在Android Studio中选择图片右击 >>Convert to WebP ,然后可以选择有损压缩和无损压缩以及其他的配置项,对于图片质量要求不高的可以选择有损压缩,然后定义适当的压缩比例。

zopfli无损压缩png

 zopfli是Google开源的一款png无损压缩工具,可以将大多数png图片无损压缩10%左右,甚至可以达到30%。zopfli工具的使用请参考这里,如果没有配置过local bin,配置过程可参考这里。配置好zopfli环境(Mac/Linux)后,就可以通过zoplipng 命令压缩png图片了,一个个压缩比较麻烦,我们可以写个脚本,比如我的Python脚本如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import os
#iterate current director to find all png file,then compress it
def transferFile():
list = os.listdir('./')
for i in list: #
print(i)
if(i.endswith('.png')):
doTransfer(i)
# call zopflipng to compress png file
def doTransfer(i):
if(not os.path.isdir('zoped')):
os.makedirs('zoped')
os.system('zopflipng ' + i + ' ./zoped/' + i)
#delete the original png file
def deletePng():
os.system('rm ./*.png')
transferFile()
deletePng()

总结

 在对APK资源进行优化的时候,我们可以总结为以下几个方面考虑:

  • 删除无用资源文件;
  • 选择正确格式的图片文件;
  • 压缩图片文件

参考:

“追踪圣诞老人”— 每年最新API和应用开发技术的试验田

Android APK 瘦身 - JOOX Music项目实战

PNG的使用技巧

Portable Network Graphics

Portable Network Graphics (PNG) Specification