Android安装包组成
关闭Android instant run热部署功能,正常打包Apk的情况下,打包出来的Apk包含以下文件。
Apk安装包内容
res目录
lib目录
class.dex文件(可能多个)
assets目录
AndroidMainfest.xml文件
resources.arsc文件
META-INF目录
assets目录,可以存放任何文件或文件夹,和res目录不同,该目录内容不会生成资源id,通过AssetManager类获取,一般放WebView相关资源。
lib目录,C++库,so文件,根据cpu架构分文件夹,如arm-v7,x86,mips。不同的目标设备根据当前架构加载对应目录下so。
res目录,资源文件,所有文件映射在R文件,资源id直接访问。
META-INF目录,签名信息,验证apk文件完整性,打包时,会计算内部所有文件完整性,将其保存在该目录下。安装时,根据该目录校验完整性,确保每个文件不被篡改。
AndroidMainfest.xml文件,应用配置文件,向Android系统注册该应用配置信息,四大组件,权限声明。
class.dex文件,字节码class文件转化的,Dalvik虚拟机识别的执行文件,dx工具转换。
resources.arsc文件,资源文件和资源id映射关系,根据资源id查找资源,在代码中通过R文件的资源id资源,在运行时,需要根据id找到资源的路径,arsc文件会记录id和路径的对应关系。
打包流程
aapt(Android Asset Packaging Tool)
资源打包工具,编译res目录下的资源文件,生成R文件,resources.arsc和res目录。R文件。
屏幕快照 .pngres目录是资源文件,比如layout,anim,drawable,menu,raw,xml目录下的文件,在R文件是静态内部类的静态变量,每个文件对应一个id。
屏幕快照 .pngvalue目录下的文件,比如attrs,colors,dimens,styles,strings文件,每个文件对应一个静态内部类,文件内的资源item是静态变量,每个项对应一个id。
屏幕快照 .png资源id是4字节无符号,resources.arsc文件记录应用程序资源目录信息,包括每一个资源名称、类型、值、id以及所配置的维度信息,资源索引表,key是资源id。
屏幕快照 .pngres目录中是将文本格式的xml转换成二进制xml,文本编辑器打开是乱码的,
屏幕快照 .png用As的apk查看工具可以看到里面内容。二进制xml实现了字符串替换,解析更快,占用空间更小。
aidl
处理aidl文件,编译成java文件。
compile
编译所有java文件,包括R文件,aidl生成的java文件,java源文件和第三方java文件,javac工具生成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字节边界进行对齐,对齐后可以向读内存一样对普通文件操作,加快资源访问速度。
META-INF,签名文件夹。
CERT.RSA,签名和公钥证书。
CERT.SF,对MANIFEST.MF文件的每个项的三行在做一次sha1 hash
MANIFEST.MF,版本号和每个文件的hash值,base64,包括资源文件,对每个文件整体进行sha1 hash。
总结
aapt
aidl
compile
dex
apkbuilder
jarsigner
zipalign
参考
任重而道远
网友评论