如果想反编译apk文件,首先,我们的熟悉一些概念性的东西,第一什么是apk文件,第二,什么是dex文件,以及,Dalvik虚拟机。
当然以上的概念并不是重点,可是了解这些概念会对反编译apk文件有跟深入的认识。
APK是AndroidPackage的缩写,即Android安装包(apk)。我们大家都知道,在android上层开发应用程序将会使用java语言,但是编译出来的文件并不是我们常见的.jar文件,而是.apk格式。展开.apk格式的应用程序我们可以发现其中存在一个”classes.dex”文件,即dex格式(Dalvik Executable)的文件,它实际上就是Dalvik虚拟机所能执行的一个可执行文件。这个时候读者可能会问,android运行库层中包括虚拟机和核心库两个部分,虚拟机是java运行的基础,既然是运行java库,为什么不用JVM?其实当我看到这时也会想到这个问题,不过篇幅有限,这个不是讨论的重点。因为我们要讲的完全不是Dalvik的故事。
扯远了,回到apk文件的反编译话题上。
用winRAR打开apk文件,发现结构如下:
1. META-INF\ (注:Jar文件中常可以看到);
2. res\ (注:存放资源文件的目录) ;
3. AndroidManifest.xml (注:程序全局配置文件) ;
4. classes.dex (注:Dalvik字节码);
5. resources.arsc (注:编译后的二进制资源文件)。
OK,现在我们开始反编译。为了便于大家理解,现在我以etao的客户端为例。
第一步,获取配置文件(*.xml)以及资源文件(例如图片等等)。虽然我们可以直接用WinRAR获取*.xml文件,但是将项目打包成apk文件的时候,会进行加密,因此,如果直接获取的话只能获取乱码。
所以我们需要使用apktool工具,下载地址:https://code.google.com/p/android-apktool/,下载apktool.tar.bz2和apktool-install-windows-.tar.bz2,文件版本无所谓,没有影响。
解压后要将解压后的文件同要反编译的文件放到一起。
接下来便是我们熟悉的dos环境,首先进到你的apktool文件所在的目录下。
之后命令如下:
apktool d 要编译的文件的路径 编译之后的目的路径
随后到你的目的目录下,便会发现生成的文件。
这个时候我们第一步便over了,接下来是反编译src文件,众所周知,dex文件是android系统的一套dx工具将java的class文件转换的。
因此我们便可以通过另外一个开源工具:dex2jar,下载地址:http://code.google.com/p/dex2jar/。将java文件反编译到class文件。
下载之后,解压,依旧是先到你的dex2jar的目录下。之后执行命令。
dex2jar.bat dex文件的路径
便会得到反编译之后的jar文件
这个时候我们可以通过第三个开源工具jd-gui工具将jar文件反编译成java文件,选择保存所有,它会生成一个压缩文件,所有的源码都在这个压缩文件中,解压了就可以看到详细的代码了。
获得源代码之后,便可以放到你的IDE当中进行分析了。不过据笔者观察此类反编译有一下令人凌乱之处。
1 反编译之后没有代码注释,无论源代码在原文中写了多少注释,翻遍也之后也不会出现(编译原理导致)
2 开发包也成为了反编译的对象。如果一个apk文件当中引用了其他第三方的jar包。这个时候,反编译之后,回将jar包也反编译。
当然,我们反编译apk文件无非是想学习学习人家的设计思路,了解一下,便按照自己的想法进行我们的艺术创作,编译成这个样子已经达到我们的目的了,希望这种方法会让广大的android爱好者在android的学习道路上走的更为顺畅。凌晨1点半,晚安,My World!