使用等效的命令行,为什么 aapt.exe 输出的 id 与 aapt2.exe 不同? r.java 到底是如何工作的?我使用 aapt 和 aapt2 来生成 r.java,如下所示:
"aapt.exe" package -f -m -M "AndroidManifest.xml" -I "android.jar" -S "\res" -J "\RJava" --auto-add-overlay
但我仍然不明白为什么 R.java 中生成的 ids 的值很重要?这些 id 到底是如何工作的
生成的 ID 在R.java
不仅会在运行之间有所不同aapt
与运行aapt2
,但也可能在连续运行之间aapt
resp. aapt2
他们自己。
资源 ID 的用途
的一代R.java
文件为每个资源分配一个 ID,以便在应用程序运行时引用它。正如所写B.Burd 和 J.P.Mueller (2020),Android 应用程序开发一体化傻瓜书,第三版,Wiley,第 87 页:
a 中的十六进制值R.java
文件是 Android 资源管理机制的起点。 Android 使用这些数字来快速轻松地加载您存储在 res 分支中的内容。
资源ID的结构
资源ID的结构如下所示Fig.1(摘自下面提到的幻灯片):
Fig.1: Structure of a resource ID
-
Package类型:大部分
0x7f
(应用),而且0x01
(Android框架)和0x00
(共享资源库)很常见。
-
Resourcetype:类型和值之间没有固定的映射(仅通过查看 ID 值无法判断正在处理的是字符串还是整数),但在同一个包中,同一类型的所有资源都会具有相同的类型标识符。
-
Entry:这只是一个流水号。
因为田地Resource and EntryID分配总是有可能发生变化aapt
在编译时,甚至在连续运行中。在应用程序的运行时,ID 将是静态的。
更多信息
有关更多详细信息,请参阅 Android 开发文档访问您的应用程序资源还有这些有趣的slides作者:M.Kongstad 和 Z.Jovanovic,来自他们关于 SonyXperiaDev 2018 的演讲。有关文档说明的详细说明
注意:您不应该手动修改 R.java 文件 - 它是在编译项目时由 aapt 工具生成的。下次编译时任何更改都会被覆盖。
您还可以查看相关的 Stackoverflow 线程如何手动生成R.java。简而言之——如果手动编辑R.java
很可能会破坏资源引用并最晚在运行时出现错误(有史以来最讨厌的错误类型)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)