基础知识之XML
xml
可扩展标记语言(标记语言),标准通用标记语言的子集,简称XML。是一种用于标记电子文件使其具有结构性的标记语言
axml
(Android Binary XML)是安卓项目中、清单文件、布局文件以及其它所有xml资源,经过编译后产生的:二进制化的xml文件
二进制化的好处
文件尺寸缩减,例如:文件中大量使用到android:属性=“内容”,经过二进制化以后,xml中所有的android字符就只需要一个索引值指向android的命名空间即可,原本需要7个字符才能表示的信息,现在只需要一个索引 ID,直接省掉6个字符的空间 何况是全文共用这一个ID 这节省量是相当可观的。当然,其中的属性和内容也是同理。所以这种减过肥的xml看起来会更加性感。
执行效率更高,xml文件对人类而言,结构清晰,逻辑明确。但是对安卓系统来说并非如此。如果安卓直接使用xml,它就需要先解析xml,然后将文字信息一一对应到它所能识别的逻辑上(这种 将你懂的事情变成它能懂的事情,是一件耗时费力的过程。所以说:对人说人话,对机器就要说01话。)二进制化所产生的那一系列ID是直接指向安卓所能识别的逻辑上的,所以AXML对程序的执行来说,效率是非常哇塞的。
axml对安卓来讲到底算个什么东西?
既然它不是程序逻辑,那它就是程序资源。所以去寻找资源相关的东西。感兴趣的话,可以自己去源码里一探究竟。
axml用到的格式在ResourceTypes.h已有定义。
axml干货
ResourceTypes.h里提出了一个概念,叫做chunk块
整个axml文档是由 一块(chunk) 又 一块(chunk) 的结构堆叠起来的,为了便于理解,可以把chunk理解为一个盒子。
整个axml是最大的一个盒子(chunk) 盒子里面依次是
- 字符串盒子(String Chunk)
这个盒子里,存放的是整个文档用到的字符串信息,文档用到字符串的地方,都会拿着索引来这里领取字符串。 - 然后是资源盒子(System Resource Chunk)
这个盒子里,存放的是该文档用到的安卓的系统属性对应的索引(你可以在安卓源码的android.R$attr.**中找到这些索引的身影)。 - 最后是一个大盒子:命名空间盒子([Start and End] Name Space Chunk)
它是整个xml文档的开始,整个文档以Start命名空间为开始,又以End命名空间为结束,所有的文档标签都在它所属的命名空间内展开。一个文档内可以有多个命名空间并存:例如系统的android空间,与自定义控件用到的app空间可以并存。命名空间内部存放的就是整个文档的具体结构信息了。
命名空间内所存放的 结构盒子(chunk) 依次是
- 开始标签(Start Tag Chunk)
开始标签是具体标签的开始
例如:<manifest… 的开始以及<application… 的开始。
同时里面存放了该标签所需要的所有具体的属性信息(Attribute)
例如:application中的android:theme=“@style/Theme.TestApk”
以及android:icon=“@mipmap/ic_launcher”
等等所有的属性都在属性信息(Attribute) 里存储。
(TIPS:这里的icon是属性名,android是该属性所在的命名空间,@mipmap/ic_launcher 是该属性的值。不过要注意,这里存的不是 @mipmap/ic_launcher 这个字符串,而是它对应到resources.arsc 文件中,记录的索引值,由于arsc文件不是本作文的主角,所以它没有资格在这篇作文里占太多的篇幅) - 最后是结束标签(End Tag Chunk)
所有的 开始标签(Start Tag Chunk) 都有一个与之对应的 结束标签(End Tag Chunk) 。
开始标签(Start Tag Chunk) 与 结束标签(End Tag Chunk) 之间可以嵌套另外的标签。
例如:
标签的开始与结束之间嵌套了 标签; 标签又嵌套了 标签; 标签又嵌套了 标签;
以此类推,循环往复,就组成了整个xml文档的结构

浙公网安备 33010602011771号