• 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,至于具体怎么用,网上已有很多关于这方面的介绍,笔者就不在此班门弄斧了。

  • 相关阅读:
    RadioButton 用法
    输出复选框选中的文件名 checkbox
    dropdownlist select的用法
    货币的值如何按各个不同国家的习惯来输出
    sqlserver 面试题
    更新数据的脚本
    《C++ Primer》读书笔记—第九章 顺序容器
    《C++ Primer》读书笔记—第八章 IO库
    《C++ Primer》读书笔记—第七章 类
    《C++ Primer》读书笔记—第六章 函数
  • 原文地址:https://www.cnblogs.com/panchunting/p/Android_APK.html
Copyright © 2020-2023  润新知