gpt4 book ai didi

android - android资源和资源ID之间的映射是如何工作的?

转载 作者:IT老高 更新时间:2023-10-28 13:14:24 24 4
gpt4 key购买 nike

Android 只需通过 R.id.XXX 就可以找到合适的资源是很神奇的。

AFAIK,资源被编译成二进制格式,那么这个映射逻辑是如何工作的呢?

也许它是这样工作的:

例如,在 layout1.xml 中,我们得到:

<Button android:id="@+id/button1" >

AAPT 会在 R.java 中生成这个:

public static final int button1=0x7f05000b;

生成*.apk时,@+id/button1会被替换为“0x7f05000b”。

因此,当我们调用时:

findViewById(R.id.button1);

虽然 ID 是像 0x7f05000b 这样的数字,但我们本质上仍然是根据 ID 进行搜索。

谢谢!

添加

我真正想知道的是,资源id整数是如何解析成资源内容的?也就是说,Android运行时是如何定位以resource id为唯一线索的资源内容的?

例如,如何找到带有资源 id 的可绘制图片?或者如何找到带有资源 id 的字符串值?

最佳答案

在构建时,aapt 工具会收集您定义的所有资源(尽管是单独的文件或文件中的显式定义)并为它们分配资源 ID。

资源 ID 是一个 32 位数字,格式为:PPTTNNNN。 PP 是资源用于的包; TT 是资源的类型; NNNN 是该类型中资源的名称。对于应用程序资源,PP 始终为 0x7f。

TT 和 NNNN 值由 aapt 任意分配——基本上对于每种新类型,都会分配和使用下一个可用数字(从 1 开始);同样,对于类型中的每个新名称,都会分配和使用下一个可用编号(从 1 开始)。

因此,如果我们让 aapt 按此顺序处理这些资源文件:

layout/main.xml
drawable/icon.xml
layout/listitem.xml

我们看到的第一个类型是“layout”,因此被赋予 TT == 1。该类型下的第一个名称是“main”,因此被赋予 NNNN == 1。最终资源 ID 为 0x7f010001。

接下来,我们看到“drawable”,因此给出了 TT == 2。该类型的名字是“icon”,因此得到 NNNN == 1。最终资源 ID 是 0x7f020001。

最后我们看到另一个“布局”,它和以前一样具有 TT == 1。这有一个新名称“listitem”,以便获得下一个值 NNNN == 2。最终资源 ID 为 0x7f010002。

请注意,默认情况下 aapt 不会尝试在构建之间保持这些标识符相同。每次资源发生变化时,它们都可以获得新的标识符。每次构建它们时,都会使用当前标识符创建一个新的 R.java,以便您的代码获得正确的值。因此,您绝不能将资源标识符保留在可用于不同应用版本的任何地方。

编译资源并分配标识符后,aapt 会为您的源代码生成 R.java 文件和一个名为“resources.arsc”的二进制文件,其中包含所有资源名称、标识符和值(用于来自单独的文件,它们的值是 .apk 中该文件的路径),其格式可以在运行时在设备上轻松映射和解析。

您可以使用命令“aapt dump resources ”获取 apk 中 resources.arsc 文件的摘要。

二进制资源表的格式记录在资源数据结构的头文件中:

https://github.com/android/platform_frameworks_base/blob/master/libs/androidfw/include/androidfw/ResourceTypes.h

设备上读取资源表的完整实现在这里:

https://github.com/android/platform_frameworks_base/blob/master/libs/androidfw/ResourceTypes.cpp

关于android - android资源和资源ID之间的映射是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6517151/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com