前言
身为一个Android开发,一定要了解apk编译打包流程;
那么今天我们就来学习下;
apk的编译流程
1、apk文件
- apk是Android Package的缩写;
- 解压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是签名文件夹;
2、打包流程
打包中需要的工具
- 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
2.1打包资源文件,生成R.java文件
使用aapt来打包res资源文件,生成R.java、resources.arsc和res文件(二进制 & 非二进制如res/raw和pic保持原样);
res目录
R.java文件
2.2处理AIDL文件,生成对应的.java文件
2.3编译Java文件,生成对应的.class文件
2.4把.class文件转化成Davik VM支持的.dex文件
2.5打包生成未签名的.apk文件
注意:
res/raw和assets的相同点:
两者目录下的文件在打包后会原封不动的保存在apk包中,不会被编译成二进制;
res/raw和assets的不同点:
2.7对签名后的.apk文件进行对齐处理
Resources res = getResources(); InputStream is = res .openRawResource(R.raw.filename);