前言
这篇文章我们来分析一波Apk
的生成流程,原先我只知道在Studio
中去build Apk
去生成Apk
文件,但是至于这个Apk
具体是如何生成的,我并不太了解,但是通过解压Apk
我们可以了解到Apk
文件中包括哪些文件。
-
META-INF
文件夹,该文件夹中包含该Apk
的签名信息以及该Apk
中所有文件的哈希值的计算结果 -
res
文件夹,存放的是资源文件,例如动画、颜色、图片和布局等资源 -
dex
文件,该文件是适用于Dalvik
虚拟机的字节码文件 -
resources.arsc
,它是一个资源索引表,是由aapt
根据res
资源文件生成的二进制文件 -
AndroidManifest.xml
清单文件,配置了各种权限以及注册Activity
,Service
等组件
打包流程
首先我们来分析一波上图的大致的流程:
- 通过
aapt
工具将我们res
目录下面的资源文件生成R.java
文件和resources.arsc
文件 - 通过
aidl
工具将我们项目中的aidl
接口文件转化为java
类 - 通过
Java Compiler
编译器将我们的java
类编译成class
文件 - 通过
dx.bat
工具将所有的class
文件转化成为我们android
虚拟机Dalvik
可以识别的dex
文件 - 通过
apkbuilder
工具将我们所有的资源文件和上面生成的dex
文件打包生成一个Apk
文件 - 通过
Jarsigner
包给我们的Apk
进行签名 - 使用
Zipalign
对我们签名后的Apk
进行对齐优化,使我们的Apk
更加减少内存,最终生成我们可以运行的Apk
文件。
关于资源打包
-
assets
和res
下的raw
资源被原装不动地打包进APK
之外,其它的资源文件都会被编译(xml
文件会被编译为二进制的xml
)。 - 除了
assets
资源之外,其它的资源都会被赋予一个资源ID
。 - 打包工具负责编译和打包资源,编译完成之后,会生成一个
resources.arsc
文件和一个R.java
,前者保存的是一个资源索引表,后者定义了各个资源ID
常量,供在代码中索引资源。 - 应用程序配置文件
AndroidManifest.xml
同样会被编译成二进制的XML
文件,然后再打包到APK
里面去。 - 应用程序在运行时最终是通过
AssetManager
来访问资源,或通过资源ID
来访问,或通过文件名来访问。
Dalvik(Android虚拟机)
Dalvik
是Google
公司自己设计用于Android
平台的Java
虚拟机,它是Android
平台的重要组成部分,支持dex
格式的Java
应用程序的运行。dex
格式是专门为Dalvik
设计的一种压缩格式,适合内存和处理器速度有限的系统。Google
对其进行了特定的优化,使得Dalvik
具有高效、简洁、节省资源的特点。从Android
系统架构图知,Dalvik
虚拟机运行在Android
的运行时库层。
JVM
和Dalvik
虚拟机的区别
-
Java
虚拟机运行的是Java
字节码,文件是以.class
结尾,Dalvik
运行的是Dalvik
字节码,其dex
文件是由dx.bat
工具编译class
文件而来。 -
Dalvik
可执行文件比JVM
更小,dex
文件对常量池进行了压缩,使得相同字符串、常量在DEX
文件中只出现一次。 -
Java
虚拟机与Daivik
虚拟机架构不同,Java
虚拟机基于栈结构,资源开销大,Dalvik
虚拟机基于寄存器结构,数据由寄存器直接传递,这样的方式比基于栈结构的方式快得多。
网友评论