Android学习 - 反编译APK文件

  学习最好的方式就是模仿和实践,当我们对Android手机应用程序的开发还不是很熟练的话,借鉴和学习别人的程序成为我们快速掌握知识的最有效途径,当然有条理的进行系统理论、框架及相关的学习也是必要的,而本文着眼于提供一种更直接的方式去学习Android开发,即通过学习别人的APK文件。文中所提供的方式仅仅只是为了学习之便,并无其它意图。

一、准备工作

  在我们正式反编译APK文件之前,有必要做一些简单的说明。APK即Android Application Package,是Android程式的安装程序,就像EXE文件之于Windows一样,APK其实是一个压缩文件,我们可以通过解压缩软件进行解压(当然也可以把.apk改成.zip然后进行解压),解压后的文件目录类似如下:

其中各个部分的说明如下:

  • META-INF\ 一些jar包文件,存放的是签名信息,用来保证apk包的完整性和系统的安全。在eclipse编译生成一个api包时,会对所有要打包的文件做一个校验计算,并把计算结果放在META-INF目录下。平台上安装apk包时,应用管理器会按照同样的算法对包里的文件做校验,如果校验结果与META-INF下的内容不一致,系统就不会安装这个apk。这就保证了apk包里的文件不能被随意替换。比如拿到一个apk包后,如果想要替换里面的一幅图片,一段代码, 或一段版权信息,想直接解压缩、替换再重新打包,基本是不可能的。如此一来就给病毒感染和恶意修改增加了难度,有助于保护系统的安全(摘自网络,由于原文实在找不到,链接就不发了);
  • res\ 存放资源文件的目录,例如图片,我们可以直接使用;
  • AndroidManifest.xml 程序全局配置文件,必须有的,这是一个压缩的xml文件,无法直接打开,需借助第三方工具AXMLPrinter2.jar来打开
  • classes.dex Dalvik字节码,是java文件经过Dalvik虚拟机编译再通过dx工具打包形成,我们稍后就要对此文件进行反编译形成最终的.java文件
  • resources.arsc 编译后的二进制资源文件

二、反编译APK

  要想反编译APK,当然前提是得有APK文件,网上有很多的APK程式,在此不再赘述,各位可根据需要和喜好自行下载,不过本文为了能够对比反编译之后的文件,特以自己写的APK文件(HelloWord)为例(至于怎样搭建Android开发环境,有需要的童鞋请移步我的另一篇文章http://www.cnblogs.com/panchunting/archive/2010/12/13/1903722.html)

1. 解压APK文件

把程式AndroidDemo.apk拷贝到目录D:\Developer\Android\APK,并重名为AndroidDemo.zip,然后解压到当前目录即可。

2.解析xml文件

程序清单文件AndroidManifest.xml和布局文件\res\layout\main.xml文件都是经过压缩的,我们必须借助第三方工具才能解析,工具的下载地址为http://code.google.com/p/android4me/downloads/list,我们选择下载AXMLPrinter2.jar即可

为了方便,我们把下载好的文件也放在当前目录D:\Developer\Android\APK下,,然后打开CMD,并键入如下命令

AndroidManifest.txt为输出结果,如果没有 > AndroidManifest.txt,则xml内容会显示在cmd中,此时我们已得到解析过得xml文件,我们打开并和原始的比较一下

对于main.xml文件亦可同样操作,不再赘述。

3. 解析.dex文件

对于.dex文件的解析我们将分成两步

  • 用dex2jar中的dex2jar.bat生成jar文件

首先我们下载工具dex2jar,地址为http://code.google.com/p/dex2jar/downloads/list,我们选择下载dex2jar-0.0.7.11-SNAPSHOT.zip文件

下载后解压文件至目录D:\Developer\Android\Decompilation\dex2jar-0.0.7.11-SNAPSHOT,为了方便使用,把此目录加入系统环境变量中

然后打开CMD,并键入如下命令,最后得到生成的jar包文件classes_dex2jar.jar

  • 将.class文件反编译成.java文件

第一步我们已经得到了一个jar包文件classes_dex2jar.jar,我们对其进行解压,得到HelloWorld.class,下面将用工具对其进行进一步地解析,在这里我们将使用JAD,下载地址为http://www.varaneckas.com/jad,选择第一个文件Jad 1.5.8g for Windows 9x/NT/2000 on Intel platform,下载完成后同样我们将其放入目录D:\Developer\Android\Decompilation\jad,并进一步地把该目录放入系统环境变量中(同上,不再赘述)

打开CMD,键入如下命令

我们将得到文件HelloWorld.jad,把其重命名为.java文件即可,至此,我们已经得到最终反编译并解析过的java文件,打开并与原始文件比较

三、总结

  通过上面的步骤我们已经能够很好地对APK文件进行反编译了,而且也得到了我们想要的xml信息和java文件,这对于我们想要了解程式创作背后的过程已经足够,也是本文的出发点所在:仅仅基于别人的代码来更好地学习APK程序的设计和制作。

  当然,文中所提到的反编译方式也仅仅是一种,例如对.jar包文件的反编译,我们完全也可以借助网友制作的工具JD-GUI,下载地址就不提供了,这是一个exe程序,打开即可运行

  最后不得不提一下的就是外国人制作的汉化打包工具apktool,下载地址为http://code.google.com/p/android-apktool/downloads/list,至于具体怎么用,网上已有很多关于这方面的介绍,笔者就不在此班门弄斧了。

posted @ 2011-10-25 16:54  舍长  阅读(6818)  评论(0编辑  收藏  举报