APK全称:Android application package(Android应用程序包),Android应用程序包,其后缀都是.apk。java
直接解压
直接解压apk文件,能够查看assets、res等信息。git
以解压美图xx的APK实例: github
- 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
- AndroidManifest.xml
- 应用配置文件,每一个应用都必须定义和包含,它描述了应用的名字、版本、权限、引用的库等。
- classes.dex
- 能够直接在Dalvik虚拟机上加载运行的文件,由java/kotlin文件通过IDE编译生成。
- Dalvik虚拟机的指令码不是标准的Jvm指令码,而是使用了本身独有的一套指令集(相似汇编语言)。
- dex文件中共用了不少类名称,常量字符串,使它的体积更小,运行效率更高。
- resources.arsc
反编译
经过反编译,就能够查看AndroidManifest.xml、res、smali等文件,及源码。算法
工具
- apktool
- dex2jar
- 将可运行文件classes.dex反编译为jar源码文件
- jd-gui
步骤
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/.apkbash
2. dex2jar
d2j-dex2jar.bat classes.dex
复制代码
获得classes-dex2jar.jarapp
3. jd-gui
- 下载:jd.benow.ca/。
- 使用jd-gui打开classes-dex2jar.jar,查看源码。
- 通常的APK都会通过混淆处理。
结尾
Android APK文件(1、编译打包过程)工具
Android APK文件(2、解压和反编译)布局
Android APK文件(3、AAPT2工具使用)post
Android APK文件(4、Smali语法)