Android打包流程

一、Apk组成

关闭Android Instant Run热部署功能,正常打包的情况下,生成的Apk包含以下文件和目录。

《Android打包流程》 Apk组成

1,res目录,存放资源文件,所有文件映射在R类资源id常量中,在代码中通过id直接访问。
2,lib目录,C++库,so文件,根据Cpu架构区分文件夹,如arm-v7,x86,mips,不同目标设备根据当前架构加载对应目录下so文件。
3,classes.dex文件,由class字节码文件通过dx工具转化,Dalvik虚拟机识别的执行文件。
4,assets目录,存放任何文件或文件夹,一般存放WebView相关资源。
和res目录的区别:不会在R类中映射资源id,在代码中通过AssetManager类访问,其他资源,包括raw资源,都会生成资源id。
5,AndroidMainfest文件,应用配置,向Android系统注册该应用信息,四大组件,权限声明。
6,resources.arsc文件,记录资源文件和资源id的映射关系,在代码中通过R类的资源id查找资源,运行时,需要根据id找到资源的路径。
7,META-INF目录,签名和校验,验证Apk文件完整性,打包时,会计算内部所有文件摘要签名,保存在该目录下,安装时,根据该目录的相关文件校验完整性,确保Apk每个文件不被篡改,是官方正版Apk。

二、打包流程

Apk如何出来的?
aapt(Android Asset Packaging Tool),资源打包工具,编译res目录下的资源文件,生成R文件,resources.arsc和res目录,R文件。

《Android打包流程》 屏幕快照 .png

res目录是资源文件,比如layout,anim,drawable,menu,raw,xml目录下的文件,在R文件是静态内部类的静态变量,每个文件对应一个id。

《Android打包流程》 屏幕快照 .png

value目录下的文件,比如attrs,colors,dimens,styles,strings文件,每个文件对应一个静态内部类,文件内的资源item是静态变量,每个项对应一个id。

《Android打包流程》 屏幕快照 .png

资源id是4字节无符号,resources.arsc文件记录应用程序资源目录信息,包括每一个资源名称、类型、值、id以及所配置的维度信息,资源索引表,key是资源id。

《Android打包流程》 屏幕快照 .png

res目录将文本格式的xml转换成二进制xml,文本编辑器打开是乱码的。

《Android打包流程》 屏幕快照 .png

用As的Apk查看工具可以看到里面内容。二进制xml实现了字符串替换,将一些在资源使用id表示,解析更快,占用空间更小。

aidl,处理aidl文件,编译成java文件。
compile,javac工具编译所有java文件,包括R文件,aidl生成的java文件,java源文件和第三方java文件,生成class文件。
dex,通过dex命令,处理class文件,包括第三方class文件,生成Delvik虚拟机可执行的classes.dex文件,在分包情况下生成多个dex文件。对多个class文件合并,重组,优化,可以减小体积,缩短运行时间。
apkbuilder,将resources.arsc,res目录,Androidmanifest文件,dex文件,一些第三方的so文件,assets目录,通过apkbuilder工具生成未签名Apk包。
注意,raw资源和assets直接打包进入Apk,其他资源编译处理,raw被映射到R文件,assets不会映射,需要Assetmanager类访问,raw目录内部不能再有目录结构,assets可以有。
jarsigner,对Apk进行签名,debug使用默认签名。
zipalign,对未压缩的数据,如图片,按4字节边界进行对齐,对齐后可以向读内存一样对普通文件操作,加快资源访问速度。

参考
任重而道远

点赞