Android APK文件(二、解压和反编译)

13,063 阅读2分钟

APK全称:Android application package(Android应用程序包),Android应用程序包,其后缀都是.apk。

直接解压

直接解压apk文件,可以查看assets、res等信息。

以解压美图xx的APK实例:

  • assets
    • 资源文件,如声音、字体等等。
    • 代码中使用AssetsManager获取Assets文件夹的资源。
  • lib
    • 存放用C/C++编写的,用NDK编译生成的so文件,供java/kotlin端调用。
  • META-INF
    • 存放apk签名信息,用来保证包的完整性和系统的安全。
    • 在IDE编译生成一个apk包时,会对里面所有的文件做一个校验计算,并把计算结果存放在META-INF文件夹内,apk在安装的时候,系统会按照同样的算法对apk包里面的文件做校验,如果结果与META-INF里面的值不一样,系统就不会安装这个apk,这就保证了apk包里的文件不能被随意替换。比如拿到一个apk包后,如果想要替换里面的一幅图片,一段代码, 或一段版权信息,想直接解压缩、替换再重新打包,基本是不可能的。如此一来就给病毒感染和恶意修改增加了难度,有助于保护系统的安全。
  • res
    • 存放资源文件,包括icon,xml文件
  • AndroidManifest.xml
    • 应用配置文件,每个应用都必须定义和包含,它描述了应用的名字、版本、权限、引用的库等。
  • classes.dex
    • 可以直接在Dalvik虚拟机上加载运行的文件,由java/kotlin文件经过IDE编译生成。
    • Dalvik虚拟机的指令码不是标准的Jvm指令码,而是使用了自己独有的一套指令集(类似汇编语言)。
    • dex文件中共用了很多类名称,常量字符串,使它的体积更小,运行效率更高。
  • resources.arsc
    • 二进制资源文件,包括字符串等。

反编译

通过反编译,就可以查看AndroidManifest.xml、res、smali等文件,及源码。

工具

  • apktool
    • 编译和反编译apk,从apk中提取图片和布局资源
  • dex2jar
    • 将可运行文件classes.dex反编译为jar源码文件
  • jd-gui
    • 查看jar源码文件

步骤

1. apktool安装

apktool.bat d -o <output_dir> test.apk

其中<output_dir>指定输出目录,默认为apk.out

  • 编译
apktool.bat b -o <output.apk> <input_dir>

其中<input_dir>就是上面反编译输出的目录,<ouput.apk>是编译的输出结果,默认为dist/.apk

2. dex2jar

d2j-dex2jar.bat classes.dex

得到classes-dex2jar.jar

3. jd-gui

  • 下载:jd.benow.ca/
  • 使用jd-gui打开classes-dex2jar.jar,查看源码。
  • 一般的APK都会经过混淆处理。

结尾

Android APK文件(一、编译打包过程)

Android APK文件(二、解压和反编译)

Android APK文件(三、AAPT2工具使用)

Android APK文件(四、Smali语法)