一、APK文件结构
- 解压apk文件后包含AndroidManifest.xml、assets目录、classes.dex(还可能有 classes2.dex,classes3.dex...classesN.dex)、lib目录、META-INF目录、res目录和resources.arsc;
- classes.dex 是.dex文件;
- resources.arsc是resources resources文件;
- AndroidManifest.xml是AndroidManifest.xml文件;
- res是uncompiled resources;
- META-INF是签名文件夹;
二、打包流程
Android编译打包过程主要分为如下7个步骤:
1. aapt过程
使用文件aapt/aapt2打包res目录资源文件, 生成R.java、resources.arsc和res目录。
2、aidl生成Java文件
AIDL是Android Interface Definition Language的简称, 是Android跨进程通讯的一种方式。
检索工程里所有的aidl文件,并转换为对应的Java文件。
3、 Javac编译
使用JDK里的javac编译R.java、aidl生成的Java文件、Java源文件, 并生成.class文件。
4、 生成dex文件
- 转换所有的class文件,生成classes.dex文件。处理文件就是上一步生成的 .class 文件;
- 使用dx工具将java字节码转换为dalvik字节码、压缩常量池、消除冗余信息等;
- 通过dex命令,将.class文件和第三方库中的.class文件处理生成classes.dex;
5、 生成apk文件
使用ApkBuilder将resources.arsc、res目录、AndroidManifest.xml、assets目录、dex文件打包成apk, 具体逻辑是在com.android.sdklib.build.ApkBuilder中实现的。
6、签名apk文件
使用apksigner为安装包添加签名信息。
7、 zipalign优化签名包
使用zipalign工具对签名包进行内存对齐操作, 即优化安装包的结构。
综上所述, Android SDK中build-tools目录提供了各种程序, 都是独立可运行的,可以认为Android Studio编译打包过程是对这些工具的封装。
打包中需要的工具
- aapt:Android资源打包工具,${ANDROID_SDK_HOME}/platform-tools/appt
- aidl:Android接口描述语言转化为.java文件的工具,${ANDROID_SDK_HOME}/platform-tools/aidl
- javac:Java Compiler,${JDK_HOME}/javac或/usr/bin/javac
- dex:转化.class文件为Davik VM能识别的.dex文件,${ANDROID_SDK_HOME}/platform-tools/dx
- apkbuilder:生成apk包,${ANDROID_SDK_HOME}/tools/opkbuilder
- jarsigner:.jar文件的签名工具,${JDK_HOME}/jarsigner或/usr/bin/jarsigner
- zipalign:字节码对齐工具,${ANDROID_SDK_HOME}/tools/zipalign