結合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
發佈了8 篇原創文章 · 獲贊 7 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章