Android Resource资源解析

  • Post author:
  • Post category:其他


资源文件打包流程

AAPT2 支持通过启用增量编译实现更快的资源编译。这是通过将资源处理拆分为两个步骤来实现的:

1、编译:将资源文件编译为二进制格式。

把所有的Android资源文件进行解析,生成扩展名为.flat的二进制文件。比如是png图片,那么就会被压缩处理,采用.png.flat的扩展名。可以在build/intermediates/merged_res/文件下查看生成的中间产物

2、链接:合并所有已编译的文件并将它们打包到一个软件包中。

首先,这一步会生成辅助文件,比如R.java与resources.arsc,R文件大家应该都比较熟悉,就是一个资源索引文件,我们平时引用也都是通过R.的方式引用资源id。而resources.arsc则是资源索引表,供在程序运行时根据id索引到具体的资源

最后,会将R文件,ressources.arsc文件和之前的二进制文件进行打包,打包到一个软件包中。

aapt工具编译res资源文件,把大部分xml文件编译成二进制文件(图片文件除外),同时生成R.Java文件和resources.arsc文件,里面保存了资源的ID和在APK中的路径。

Android res资源目录

分组资源类型

将各类资源放入项目 res/ 目录的特定子目录中。 子目录的名字特别重要。我们把不同的资源放到不同的子目录中。

animator/:用于定义属性动画的 XML 文件。

anim/:用于定义渐变动画的 XML 文件。(属性动画也可保存在此目录中,但为了区分这两种类型,属性动画首选 animator/ 目录。)

color/:用于定义颜色状态列表的 XML 文件。

drawable/:位图文件(.png、.9.png、.jpg、.gif)或编译为以下可绘制对象资源子类型的 XML 文件: 位图文件、九宫格(可调整大小的位图)、状态列表、形状、动画可绘制对象、其他可绘制对象。

mipmap/:适用于不同启动器图标密度的可绘制对象文件。应用图标放这里。mipmap后面跟着的dpi类别,比如hdpi mdpi,里面的图标尺寸大小是不同的。可以参考默认图标的大小,来切App的图标。如果要省事,可以用一个图标复制进各个目录中。

layout/: 用于定义用户界面布局的 XML 文件。放 layout 文件。

menu/: 用于定义应用菜单(如选项菜单、上下文菜单或子菜单)的 XML 文件。

raw/:需以原始形式保存的任意文件。如要使用原始 InputStream 打开这些资源,请使用资源 ID(即 R.raw.filename)调用 Resources.openRawResource()。 但是,如需访问原始文件名和文件层次结构,则可以考虑将某些资源保存在 assets/ 目录(而非 res/raw/)下。assets/ 中的文件没有资源 ID,因此只能使用 AssetManager 读取这些文件。

values/:包含字符串、整型数和颜色等简单值的 XML 文件。其他 res/ 子目录中的 XML 资源文件会根据 XML 文件名定义单个资源,而 values/ 目录中的文件可描述多个资源。对于此目录中的文件, <resources style="box-sizing: inherit; margin-top: 0px; margin-bottom: 0px;"> 元素的每个子元素均会定义一个资源。例如,<string style="box-sizing: inherit;"> 元素会创建 R.string 资源,<color style="box-sizing: inherit;"> 元素会创建 R.color 资源。由于每个资源均使用自己的 XML 元素进行定义,因此您可以随意命名文件,并在某个文件中放入不同的资源类型。

但是,您可能需要将独特的资源类型放在不同的文件中,使其一目了然。 例如,对于可在此目录中创建的资源,下面给出了相应的文件名约定:

arrays.xml:资源数组(类型数组)。

colors.xml:颜色值。

dimens.xml:尺寸值。

strings.xml:字符串值。

styles.xml:样式。

xml/:可在运行时通过调用 Resources.getXML() 读取的任意 XML 文件。各种 XML 配置文件(如可搜索配置)都必须保存在此处。

font/:带有扩展名的字体文件(如 .ttf、.otf 或 .ttc),或包含 元素的 XML 文件。 作者:安卓开发好多年 https://www.bilibili.com/read/cv13632080?spm_id_from=333.999.0.0 出处:bilibili

编译生成的R文件

R文件

当Android应用程序被编译,会自动生成一个R类,其中包含了所有的res/目录下资源的ID,如布局文件,资源文件,图片

res目录下保存的文件大多数都会被编译,并且被赋予资源ID,这些ID被保存在R.java文件中,这样我们就可以在程序中通过ID来访问res类的资源

资源文件只能以小写字母和下划线做首字母,随后的名字中只能出现【a-z0-9_.】这些字符,否则R.java不会自动更新

在写Java代码的过程中,你可以使用R类,通过子类+资源名或者直接使用资源ID来访问资源

R.java文件中资源ID的含义

Android中的资源使用几乎无处不在,layout,String、drawable、raw、style、theme等等都是,这些资源会在编译过程中被打包进APK中(res文件夹)或者被打包成独立的资源APK包(如framework-res.apk)

资源都会被赋予独一无二的ID,即资源索引来方便系统的访问

这些资源索引由Androi的,的工具AAPT(Android Asset Packing Tool)生成八位十六进制整数型



版权声明:本文为weixin_44008788原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。