我正在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 I已插入指令(我的意思是"插入指令",它是使用烟炱插入到
R.id
类中的(,例如R.id.inserted
,该值已正确分配给小部件(通过调试器检查(,但UiAutomator无法捕获它- 结果:
<node index="2" text="Hello World" resource-id="" class="android.widget.TextView" ...>
- 结果:
我想知道这里少了什么?xml中声明的id是否被编译成不仅仅是R.id
的东西?
好的,看起来id
也包含在resources.arsc
文件中。如果不检测它,UiAutomator就无法找出id。但我很困惑如何做到这一点,有办法做到吗?
经过几次尝试,我终于了解了id是如何工作的。对于其他有同样问题的人,以下是你需要做的:
- 将id插入
resources.arsc
文件(稍后解释( - 将整数(参考,稍后解释(插入
R.id
类
首先,我们来谈谈id系统是如何工作的。编译后的apk有一个类R.id
,它有许多静态int字段。十六进制格式的每个字段的int值可以解释为0xPPTTEEEE
,
- CCD_ 14代表arsc文件中的CCD_
T
是Type
;anim""风格";,当然;id">E
是entry id
,可以理解为Type
中的索引
因此,我们需要首先使用一些工具将新id插入到arsc文件中,然后插入R.id
以指向该条目。
对于插入id,我的解决方案是将arsc文件解析为格式化的结构,并对其进行修改,然后写出它。您可以从ResourceTypes.h中找到有关字节结构的更多信息。如果您愿意,也可以使用我在Rust-arsc中编写的库。
希望这对任何试图破坏arsc文件的人来说都足够清楚。欢迎留下评论和其他答案。