结合HierarchyViewer和APK文件反编译获得APP元素id值

背景:
最近在使用Robotium进行Android自动化测试。遇到了一个问题:我需要获得一个View的id(int型数值)。此前我在 http://maider.blog.sohu.com/255448342.html  http://maider.blog.sohu.com/255485243.html  两篇文章中讲述了如何打开手机上的View Server来使用HierarchyViewer。HierarchyViewer对查看UI组件固然有帮助,但要想获取一个元素的id还是不行的。请看下图:
我在HierarchyViewer中查看“发布”这个View,HierarchyViewer显示了一个 @414a54c8id/flipper_head_action注意:@后加一串16进制数并不是这个view的id,而只是一个对我们人类没有任何意义的指针值。

但是我们有这个元素的id名 flipper_head_action 。我们需要按图索骥,按这个id名找到对应的数值。

解决步骤:
1.下载反编译器 dex2jar,和一个java源代码查看器 jd-gui
下载地址:
2.解压第一步下载的东西,放在适当文件夹。
3.将要反编译的apk文件后缀改为zip并解压,得到其中的classes.dex,它就是java文件编译再通过dx工具打包而成的,将classes.dex复制到第2步解压得到的 dex2jar.bat所在文件夹。
4.将命令行定位到 dex2jar.bat 所在文件夹,运行命令:
dex2jar.bat classes.dex
在同文件夹下生成:
classes_dex2jar.jar
5.打开第二步解压得到的 jd-gui.exe,File-》Open File打开第四步生成的 classes_dex2jar.jar
6.现在在jd-gui中的左侧导航中,定位到APP所在的包吧!(这个包名,你在HierarchyViewer里能看得到)。例图:


7.滚动jd-gui的左侧导航栏至较下方,可以看到反编译出的R文件。而其中有一个R$id就是我们要找的文件。

8.现在,在R$id文件中,搜索本文开始得到的元素id名字吧( flipper_head_action),我们得到了这个元素的id的int值为2131427472。大功告成!


本篇文章参考了:


2013.4.13更新:

在Robotium的Google Group里看到有人说了,不用那么麻烦地反编译源代码, 在你的继承ActivityInstrumentationTestCase2的测试类中的测试方法中,这么写就好:

Context currContext = getInstrumentation().getTargetContext();
String packageName = currContext.getPackageName();
int viewId = currContext.getResources().getIdentifier(" whatYouSeeInHierarhicViewer","id", packageName);
View foundView = solo.getView(viewId)
solo.clickOnView(foundView,false)

当然也可以参考我的另一篇博文第五点: http://maider.blog.sohu.com/260998798.html
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值