Android 二进制XML文件格式XML

介绍

  Android12之后,引入一种自定义的写XML的协议,这样的二进制文件叫二进制XML。这个基准测试拿典型的packages.xml文件作比较,是原来写入速度的4.3倍快,并且存储空间少2.4倍。
  这个序列化是有一些限制:
  1、仅UTF-8的编码是支持的
  2、存储的数据的长度不能超过65535字节,并且像String值是被存储成UTF-8。
  3、Namespaces, prefixes, properties, and options 是不支持的。

格式

  原来的XML格式文件,人是可以识读的,因为都是字符。二进制XML,人是没法识读了,看下图它的格式。
二进制XML数据格式

二进制XML格式

  开头的三个字节,固定为“ABX”,代表"Android Binary XML.",第四个字节是版本,目前是0,以后随着协议改变,可能会增加。

  接着就是START_DOCUMENT相关,它是用一个字节来表示。它的值是START_DOCUMENT | TYPE_NULL。START_DOCUMENT 是0,TYPE_NULL是1 << 4。START_DOCUMENT 在这里叫做Token,包括下面的Tag也叫做Token。TYPE_NULL是值类型,这个是空。这样,一个字节的高四位代表值类型,低四位代表Token。下面也是这样,每到一个事件开始时,都是用一个字节来这样保存Token和值类型。
  一个START_DOCUMENT是对应一个END_DOCUMENT,看结构的最后一个字节,就是END_DOCUMENT相关,也是一个字节,放置着值类型和Token。
  挨着START_DOCUMENT往下的结构就是START_TAG了,可以看到它的Token是START_TAG,值类型是TYPE_STRING_INTERNED。TYPE_STRING_INTERNED的处理需要说一下,

TYPE_STRING_INTERNED类型值的处理

  对于该类型的值,如果之前已经处理过该值,则将它出现的顺序值作为结果写入。
  如果没有出现过,则首先写入一个65535的2字节值。接着写入该值的UTF-8的字节长度,最后再写入UTF-8字节值。二进制XML格式图中 tag内容 的第一次写入的格式参考下图
STRING_INTERNED值布局

STRING_INTERNED类型值布局

  在第一次处理了该值之后,后面就会将它收集起来,下次再写入的时候,会先检查收集的数据里面是否存在它,如果存在,就能找到收集它的顺序值,直接写入顺序值了。这样就能节省大量存储空间。

  说完tag和tag内容之后,就得说一下tag的属性了。属性开始的第一个字节是ATTRIBUTE | TYPE_**,因为属性的值类型比较多样,所以我这里用了TYPE_**表示。它的类型有TYPE_STRING,TYPE_BYTES_HEX,TYPE_BYTES_BASE64,TYPE_INT,TYPE_INT_HEX,TYPE_LONG等。属性的key写入方式是按照上面说的STRING_INTERNED类型写入的,但是值随着格式不同,写入也不一样,这里拣TYPE_STRING、TYPE_INT来说一下,先看TYPE_STRING格式的,二进制XML格式图 属性内容 它写入文件的格式布局参考下图:
TYPE_STRING值布局

TYPE_STRING值布局

  再看下TYPE_INT格式的值的布局格式 TYPE_INT值布局

TYPE_INT值布局

   二进制XML格式图里面有个紫色块的内容,它是用来描述Token为TEXT的格式。像<string>TEXT</string>这种中间的“TEXT”就是这个情况。可以看到它的Token是TEXT,类型是TYPE_STRING。text内容的具体格式,它的格式和上面TYPE_STRING值布局 是一样的。
  二进制XML格式图里面有个省略号,写着“其他tag(里面可能嵌套)”,是说里面可以继续嵌套其他标签,里面的内容格式基本和这上面说的都差不多。
  这样基本就将二进制XML文件格式的内容说完了。在Android源码里,用来生成二进制XML文件的类是platform\frameworks\base\core\java\com\android\internal\util\BinaryXmlSerializer,用来解析它的类是platform\frameworks\base\core\java\com\android\internal\util\BinaryXmlPullParser,具体的逻辑可以进入这俩文件中查看。

将二进制转换为可读XML文件

  根据源文件,整理出来了应用可实用的代码工具文件,具体见XmlBinaryToTextUtil

猜你喜欢

转载自blog.csdn.net/q1165328963/article/details/125007694