一.APK的打包过程
了解apk的逆向过程首先需要了解apk包是怎么来的,都包括哪些内容,所以我会从apk的打包过程讲起。下面可以看到Android官网给出的一张apk打包的基本流程图:(蓝色格子是本人添加的)
从中可以梳理出apk打包的基本流程有如下7步:
1. 打包资源文件
对象:Resource文件(res目录中的文件)、 Assets文件(assets目录中的文件)、 AndroidManifest.xml文件
工具:aapt(Android Asset Package Tool)工具,负责编译和打包资源
产物:项目中的AndroidManifest.xml文件和布局文件XML都会编译,然后生成相应的R.java,另外AndroidManifest.xml会被aapt编译成二进制,除了assets和res中的raw资源被原封不动地打包进APK之外,其它的资源都会被编译或者处理,会生成一个resources.arsc文件和一个R.java,前者保存的是一个资源索引表,后者定义了各个资源ID常量
2. 处理AIDL文件
对象:aidl文件
工具:aidl(Android Interface Definition Language)工具,即Android接口描述语言工具
产物:生成相应的Java文件供程序调用,若项目中没有使用到aidl文件,则跳过这步
3. 编译项目源代码
对象:R.java、Java接口文件以及工程源代码
工具:Java编译器(javac)
产物:生成多个.class文件(字节码文件)
4. 转换所有.class文件
对象:.class文件和第三方库的jar包
工具:dx工具
产物:生成classes.dex文件(Dalvik字节码)
5. 打包生成apk
对象:classes.dex文件、resources.arsc和其他的资源(没有编译的资源,如assets目录下资源、/res/raw目录下的资源)
工具:apkbuilder
产物:未签名的apk文件