android应用资源预编译,编译和打包全解析- https://cloud.tencent.com/developer/article/1033926
Android系统提供了一套强大的资源管理框架Resources和AssetManager。
-- Android应用资源由两部分构成:资源目录和资源文件。
1.资源目录就是res目录下的各个子目录,如anim、drawable、drawable-hdpi、layout、menu、raw、values等。这些目录都必须是系统预定义的,也就是说像res/drawable,res/layout都是合法的,而像res/kinbos、res/abcd都不是合法的,系统是识别不了的。无法在R类中生成相应的数据。
2.资源文件就是资源目录下的数据文件,比如.xml、图片、音视频文件等。注意:资源文件只能放在资源目录下,而不能放在res目录下。
Android应用程序是将代码逻辑和界面资源进行分离的,Android应用程序资源可以分为两大类,分别是assets和res。assets和res的区别:
1、res目录中的所有资源都会注册在R类中,可以通过R类直接调用;而assets中的资源则不会被注册在R类中,所以只能通过文件名引用。
res类资源按照不同的用途可以进一步划分为以下9种子类型:animator;anim;color;drawable;layout;menu;raw;values;xml;
2、assets目录中的文件和res/raw不做处理,所以在解压apk文件后可以看到原文件。
只有那些类型为res/animator、res/anim、res/color、res/drawable(非Bitmap文件,即非.png、.9.png、.jpg、.gif文件)、res/layout、res/menu、res/values和res/xml的资源文件均会从文本格式的XML文件编译成二进制格式的XML文件。这些资源文件是通过Android资源打包工具aapt(Android Asset Package Tool)打包到APK文件里面的。在打包之前,大部分文本格式的XML资源文件还会被编译成二进制格式的XML资源文件。XML资源文件的编译和打包过程;了解Android系统的资源管理框架
为了使得一个应用程序能够在运行时同时支持不同的大小和密度的屏幕,以及支持国际化,即支持不同的国家地区和语言,Android应用程序资源的组织方式有18个维度,每一个维度都代表一个配置信息,从而可以使得应用程序能够根据设备的当前配置信息来找到最匹配的资源来展现在UI上,从而提高用户体验。
-- Android资源打包工具aapt在编译和打包资源的过程中,会执行以下两个额外的操作:
1. 赋予每一个非assets资源一个ID值,这些ID值以常量的形式定义在一个R.java文件中。
2. 生成一个resources.arsc文件,用来描述那些具有ID值的资源的配置信息,它的内容就相当于是一个资源索引表。
有了资源ID以及资源索引表之后,Android资源管理框架就可以迅速将根据设备当前配置信息来定位最匹配的资源了。接下来我们在分析Android应用程序资源的编译和打包过程中,就主要关注XML资源的编译过程、资源ID文件R.java的生成过程以及资源索引表文件resources.arsc的生成过程。
在打包之前,大部分文本格式的XML资源文件还会被编译成二进制格式的XML资源文件。
资源ID是一个4字节的无符号整数,其中,最高字节表示Package ID,次高字节表示Type ID,最低两字节表示Entry ID。
Package ID相当于是一个命名空间,限定资源的来源。Android系统当前定义了两个资源命令空间,其中一个系统资源命令空间,它的Package ID等于0x01,另外一个是应用程序资源命令空间,它的Package ID等于0x7f。所有位于[0x01, 0x7f]之间的Package ID都是合法的,而在这个范围之外的都是非法的Package ID。前面提到的系统资源包package-export.apk的Package ID就等于0x01,而我们在应用程序中定义的资源的Package ID的值都等于0x7f,这一点可以通过生成的R.java文件来验证。
Android应用程序资源的编译和打包过程了,其中最重要的是要掌握以下四个要点:
1. Xml资源文件从文本格式编译为二进制格式的过程。
2. Xml资源文件的二进制格式。
3. 资源项索引表resources.arsc的生成过程。
4. 资源项索引表resources.arsc的二进制格式。
-- 应用程序资源的编译、打包以及查找过程