如何通过检测将id正确插入apk



我正在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是如何工作的。对于其他有同样问题的人,以下是你需要做的:

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

首先,我们来谈谈id系统是如何工作的。编译后的apk有一个类R.id,它有许多静态int字段。十六进制格式的每个字段的int值可以解释为0xPPTTEEEE

  • CCD_ 14代表arsc文件中的CCD_
  • TType;anim""风格";,当然;id">
  • Eentry id,可以理解为Type中的索引

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

对于插入id,我的解决方案是将arsc文件解析为格式化的结构,并对其进行修改,然后写出它。您可以从ResourceTypes.h中找到有关字节结构的更多信息。如果您愿意,也可以使用我在Rust-arsc中编写的库。

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

相关内容

  • 没有找到相关文章

最新更新