APK的编译流程
APK的目录接口
编译流程简化图
Android打包流程
aapt阶段
aapt工具编译res资源文件,将大部分xml文件编译生成二进制文件(图片文件除外),同时生成R.java文件和resources.arsc文件,resources.arsc中里面保存了资源的ID和在APK中的路径。
aidl阶段
如果项目中有使用AIDL,那么就会把.aidl文件编译成.java文件。
javaCompiler阶段
将所有.java文件(包括R文件和AIDL生成的.java文件),通过javac工具生成class文件。
dex阶段
将生成的.class文件和第三方库的.class文件通过dx工具生成classes.dex文件(如果有分包,那么可能有多个)。
apkBuilder阶段
aapt阶段中的资源文件、dex文件和第三方的非java资源包(.so),通过apkbuilder工具生成未签名的apk包。
jarSigner阶段
签名,jarsigner工具,如果是debug模式用默认签名,release模式用开发者的签名。
zipAligin阶段
对齐,通过zipalign工具对apk中的未压缩资源(图片、视频)进行“对齐操作”,让资源按4字节的边界进行对齐,使得资源访问速度更快。
各详细阶段的编译过程。
aapt阶段
aapt.exe工具
aapt.exe工具(The Android Asset Packaing Tool),位于android-sdk/platform-tools目录下。
概念
- 使用aapt来打包res资源文件,生成 R.java、resources.arsc和 res文件,res文件分为 二进制 和 非二进制 文件,典型的非二进制文件如:res/raw和图片,它们保持原样,不被编译。
- res目录有9种目录,如下:
- animator :这类资源以XML文件保存在res/animator目录下,用来描述属性动画。
- anim:这类资源以XML文件保存在res/anim目录下,用来描述补间动画。
- color:这类资源以XML文件保存在res/color目录下,用描述对象颜色状态选择。
- drawable:这类资源以XML或者Bitmap文件保存在res/drawable目录下,用来描述可绘制对象。例如,我们可以在里面放置一些图片(.png, .9.png, .jpg, .gif),来作为程序界面视图的背景图。注意,保存在这个目录中的Bitmap文件在打包的过程中,可能会被优化的。例如,一个不需要多于256色的真彩色PNG文件可能会被转换成一个只有8位调色板的PNG面板,这样就可以无损地压缩图片,以减少图片所占用的内存资源。
- layout:这类资源以XML文件保存在res/layout目录下,用来描述应用程序界面布局。
- menu:这类资源以XML文件保存在res/menu目录下,用来描述应用程序菜单。
- raw:这类资源以任意格式的文件保存在res/raw目录下,它们和assets类资源一样,都是原装不动地打包在apk文件中的,不过它们会被赋予资源ID,这样我们就可以在程序中通过ID来访问它们。例如,假设在res/raw目录下有一个名称为filename的文件,并且它在编译的过程,被赋予的资源ID为R.raw.filename,那么就可以使用以下代码来访问它:Resources res = getResources(); InputStream is = res .openRawResource(R.raw.filename);
- values:这类资源以XML文件保存在res/values目录下,用来描述一些简单值,例如,数组、颜色、尺寸、字符串和样式值等,一般来说,这六种不同的值分别保存在名称为arrays.xml、colors.xml、dimens.xml、strings.xml和styles.xml文件中。
- xml:这类资源以XML文件保存在res/xml目录下,一般就是用来描述应用程序的配置信息。
R.java 文件
R.java 文件是自动生成的,如下:
aapt2指令
1.res目录如下:
2、使用aapt2生成R.java时,需要先删除public.xml。
3.aapt2指令如下
aapt2 compile --dir .\res\ -o .\aapt\ --no-crunch --legacy