现在的位置: 首页 > 综合 > 正文

Android学习札记44:解读APK反编译后得到的布局文件

2017年12月17日 ⁄ 综合 ⁄ 共 950字 ⁄ 字号 评论关闭

通常情况下,我们使用 dex2jar 工具反编译 Android APK文件之后,会得到如下这些文件:

其中,res 文件夹下都是我们在 Android 工程下常见的资源文件:

如果我们对这个应用犀利美观的布局很感兴趣的话,可以进一步反编译它的布局文件:

可以看到,这些布局文件都是 .xml 文件,默认情况下打开之后都是乱码,下图是用 Notepad++ 打开之后的效果:

这里,我们使用 AXMLPrinter2 工具将 .xml 文件转换为可读的 .txt文件。通过 CMD 进到 AXMLPrinter2 所在目录下,键入以下命令:

java -jar AXMLPrinter2.jar home.xml > home.txt

这样我们就可以得到 home.txt 文件:

打开 home.txt ,现在我们就可以读懂这个布局文件了:

好了,到这一步也许很多人就不必继续下去了。


但是...但是,像我这样的初学者,拿到这个布局文件可能还不够,我还需要进一步了解各个控件的作用和意义,这个时候我们就不得不止步于 "android:id="@7F0A004D" ,我们无法理解这个到底代表了什么。

现在,如果熟悉 Android 工程结构的同学肯定会想到,Android 工程默认情况下都会将各种资源自动映射生成到 R.java 中,因此,这里的 "@7F0A004D" 肯定是 R.java 中的某个字段,我们要做的就是从 R.java 中把它找出来。


回想到文章开始的时候我们用 dex2jar 工具反编译了 APK 文件,现在是时候派它出场了。在这里,我们使用 jd-gui 读取反编译后得到的 classes_dex2jar.jar 文件,如下图:


找到 R.class:

OK,现在我们就可以看到这个文件了:

这个时候,如果你对编程特别敏感的话,你应该立马会想到 "android:id="@7F0A004D" 中的 "7F0A004D" 很可能是 16 进制,而 R.class 中的诸如 "LoadingDialog = 2131230732" 中的值 "2131230732" 应该是 10 进制的,为了验证这个猜想,我们尝试将 "7F0A004D" 转换为 10 进制:

在 R.class 文件中查找 "2131361869",果然:

现在我们终于知道布局文件中的这个控件原来代表着 "home_title" 的含义,这下子我们在读反编译后的代码时就轻松多了。






抱歉!评论已关闭.