如何通过检测正确地将 ids 插入 apk?

How to correctly insert ids to an apk through instrumentation?

我正在对 apk 进行检测以添加更多 ID(如 R.id.name)并为特定小部件设置 ID,但我注意到一些有趣的事情:

我想知道这里缺少什么? xmls 中声明的 id 是否被编译成不仅仅是 R.id 的东西?

好的,id 似乎也包含在 resources.arsc 文件中。如果不对它进行检测,UiAutomator 无法找出 id。但是我很困惑如何做到这一点,有没有办法做到这一点?

经过多次尝试,我终于明白了ids是如何工作的。对于遇到同样问题的任何其他人,您需要执行以下操作:

  1. 将 id 插入 resources.arsc 文件(稍后解释)
  2. 将整数(参考,稍后解释)转化为R.idclass

首先,让我们谈谈身份系统的工作原理。已编译的 apk 有一个 class R.id,其中有许多静态 int 字段。十六进制格式的每个字段的int值可以解释为0xPPTTEEEE,

  • P代表arsc文件中的Package
  • T就是Type,比如“anim”,“style”,当然还有“id”
  • E就是entry id,可以理解为Type
  • 中的索引

因此,我们需要先使用一些工具将新 ID 插入到 arsc 文件中,然后使用工具 R.id 指向条目。

对于插入id,我的解决方案是将arsc文件解析成格式化结构,修改,然后写出来。您可以从 ResourceTypes.h. Or if you want, you can use the library I wrote in Rust arsc.

中找到有关字节结构的更多信息

希望这对任何试图弄乱 arsc 文件的人来说足够清楚。欢迎留下评论和其他答案。