为什么 aapt2 不生成与 aapt 相同的 ID?位于 R.java 内部的 Id 的用途是什么?

2023-12-05

使用等效的命令行,为什么 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(摘自下面提到的幻灯片):

res ID structure 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(使用前将#替换为@)

为什么 aapt2 不生成与 aapt 相同的 ID?位于 R.java 内部的 Id 的用途是什么? 的相关文章

随机推荐