如何通过检测正确地将 ids 插入 apk?
How to correctly insert ids to an apk through instrumentation?
我正在对 apk 进行检测以添加更多 ID(如 R.id.name
)并为特定小部件设置 ID,但我注意到一些有趣的事情:
- 如果我为小部件设置一个现有 ID(“现有”是指它在
ids.xml
编译前声明),UiAutomator 可以在我转储视图时捕获该信息
- 结果:
<node index="2" text="Hello World" resource-id="com.example.example:id/testId" class="android.widget.TextView" ...>
- 对于我检测的 id(“检测”我的意思是,它使用 soot 插入
R.id
class),例如 R.id.inserted
,该值被正确分配给小部件(通过调试器检查),但 UiAutomator 无法捕获它
- 结果:
<node index="2" text="Hello World" resource-id="" class="android.widget.TextView" ...>
我想知道这里缺少什么? xmls 中声明的 id 是否被编译成不仅仅是 R.id
的东西?
好的,id
似乎也包含在 resources.arsc
文件中。如果不对它进行检测,UiAutomator 无法找出 id。但是我很困惑如何做到这一点,有没有办法做到这一点?
经过多次尝试,我终于明白了ids是如何工作的。对于遇到同样问题的任何其他人,您需要执行以下操作:
- 将 id 插入
resources.arsc
文件(稍后解释)
- 将整数(参考,稍后解释)转化为
R.id
class
首先,让我们谈谈身份系统的工作原理。已编译的 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 文件的人来说足够清楚。欢迎留下评论和其他答案。
我正在对 apk 进行检测以添加更多 ID(如 R.id.name
)并为特定小部件设置 ID,但我注意到一些有趣的事情:
- 如果我为小部件设置一个现有 ID(“现有”是指它在
ids.xml
编译前声明),UiAutomator 可以在我转储视图时捕获该信息- 结果:
<node index="2" text="Hello World" resource-id="com.example.example:id/testId" class="android.widget.TextView" ...>
- 结果:
- 对于我检测的 id(“检测”我的意思是,它使用 soot 插入
R.id
class),例如R.id.inserted
,该值被正确分配给小部件(通过调试器检查),但 UiAutomator 无法捕获它- 结果:
<node index="2" text="Hello World" resource-id="" class="android.widget.TextView" ...>
- 结果:
我想知道这里缺少什么? xmls 中声明的 id 是否被编译成不仅仅是 R.id
的东西?
好的,id
似乎也包含在 resources.arsc
文件中。如果不对它进行检测,UiAutomator 无法找出 id。但是我很困惑如何做到这一点,有没有办法做到这一点?
经过多次尝试,我终于明白了ids是如何工作的。对于遇到同样问题的任何其他人,您需要执行以下操作:
- 将 id 插入
resources.arsc
文件(稍后解释) - 将整数(参考,稍后解释)转化为
R.id
class
首先,让我们谈谈身份系统的工作原理。已编译的 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 文件的人来说足够清楚。欢迎留下评论和其他答案。