Android为什么把文本格式的XML文件编译成二进制格式的XML文件

1,150 阅读2分钟

        当我们把一个apk文件以zip的形式进行解压,得到其中的文件,我们找到其中的一个布局文件,用文本编辑器(比如vscode)查看,发现并不能打开:

image.png

这是为什么呢?

        原来Android工程在构建的过程中,把类型为res/animator、res/anim、res/color、res/drawable(非Bitmap文件,即非.png、.9.png、.jpg、.gif文件)、res/layout、res/menu、res/values和res/xml的资源文件均会从文本格式的XML文件编译成二进制格式的XML文件。

        如果我们在vscode中以hexdump的格式查看这个文件,还能依稀看见这个文件的一些影子:

image.png

        这些XML资源文件之所以要从文本格式编译成二进制格式,主要是因为二级制格式的xml文件有一下好处:

  1. 二进制格式的XML文件占用空间更小。这是由于所有XML元素的标签、属性名称、属性值和内容所涉及到的字符串都会被统一收集到一个字符串资源池中去,并且会去重。有了这个字符串资源池,原来使用字符串的地方就会被替换成一个索引到字符串资源池的整数值,从而可以减少文件的大小。

  2. 二进制格式的XML文件解析速度更快。这是由于二进制格式的XML元素里面不再包含有字符串值,因此就避免了进行字符串解析,从而提高速度。

        那我们如果查看已经打包好的apk文件中的xml文件呢?别着急,Android Studio已经帮我们提供了工具。我们可以利用Android Studio 的 apk analyze工具来查看xml文件。

        我们可以通过如下图选择我们想要查看的apk文件来查看对应的xml文件:

image.png

image.png

当然我们把apk文件直接拖到Android Studio中也是一样的效果。