牛学习了
通常情况下,我们使用 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" 的含义,这下子我们在读反编译后的代码时就轻松多了。