APK 的编译打包流程
打包所需要工具:
包括aapt.exe aapt2.exe aidl.exe dx.bat等工具。
1.打包资源文件
AAPT,全称Android Asset Packaging Tool,所以这个构建工具就是用来打包资源文件的。
资源文件包括:图片,res目录下的xml文件,AndroidManifest.xml文件;
处理资源文件主要包括两步:
1、编译:将资源文件编译为二进制格式。
把所有的Android资源文件进行解析,生成扩展名为.flat的二进制文件。比如是png图片,那么就会被压缩处理,采用.png.flat的扩展名。
2、链接:合并所有已编译的文件并打包到一个软件包中。
首先,这一步会生成辅助文件,比如R.java(R文件),R文件大家应该都比较熟悉,就是一个资源索引文件,我们平时引用也都是通过R.的方式引用资源id。
最后,会将R文件和之前的二进制文件进行打包,打包到一个APK压缩包(没有dex文件、没有签名)。
2.处理.aidl file
.aidl(Android Interface Description Language)文件需要通过 aidl 工具转换成编译器能够处理的 Java 接口文件。
3.编译java文件
用到的工具就是大家熟知的javac,通过它将java文件编译成.class文件。
4.生成dex文件
因为.class 并不是 Android 系统所能识别的格式,所以还需要通过 dex 工具将它们转化为相应的 Dalvik 字节码(包含压缩常量池以及清除冗余信息等工作)。这个过程中还会加入应用所依赖的所有 “第三方库”
再谈谈这三个工具(dx/r8/d8)的区别:
dx是最早的转换工具,用于转换class文件为dex文件。
Android Studio 3.1之后,引入了D8编译器和 R8 工具。
5.生成APK包
这一步就是生成APK文件,将manifest文件、resources文件、dex文件、assets文件等等打包成一个压缩包,也就是apk文件。通过apkbuilder等工具打包成apk文件。
6.签名
在生成APK文件之后,必须对该apk文件进行签名,否则无法被安装。
之前大家比较熟知的签名工具是JDK提供的jarsigner,而apksigner是Google专门为Android提供的签名和签证工具。目前签名类型有V1、V2、V3、V4签名。
问题:
为什么 XML 资源文件要从文本格式编译成二进制格式?
1、空间占用更小:因为所有 XML 元素的标签、属性名称、属性值和内容所涉及到的字符串都会被统一收集到一个字符串资源池中,并且会去重。有了这个字符串资源池,原来使用字符串的地方就会被替换成一个索引到字符串资源池的整数值,从而可以减少文件的大小。
2、解析效率更高:二进制格式的 XML 文件解析速度更快。这是由于二进制格式的 XML 元素里面不再包含有字符串值,因此就避免了进行字符串解析,从而提高了解析效率。
网友评论