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
- 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安装
- 下载: ibotpeaches.github.io/Apktool/ins… 。
- 反编译
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
原文
https://juejin.im/post/5e9525cff265da47b27d948a