APK的编译过程
我们的项目是如何构建成APK
的呢? 在解释这个问题之前,先看一下google
官方的一张流程图
根据上面的图,我们大概可以知道
- 编译器将我们编写的代码和一些第三方的代码编译成
DEX
文件 - 然后将这个
DEX
文件和资源文件组合成APK
- 当然
APK
需要签名
才能正常的发布在手机上
APK的解析过程
我们正常的编译出一个APK
,将APK
安装到手机中,然后运行起来。这个时候就会出现一个这样的问题,什么时候去获取APK
中的DEX
文件呢(可执行文件)?
在回答这个问题之前,我们需要对一些概念进行补充。
## 一些英文单词
JIT = just in time (即时编译)
AOT = ahead of time (提前编译)
Dalvik 和 Android RunTime
那还是很久的时候 (Android 2.2
),Dalvik
担任虚拟机角色。 而 Dalvik
使用了(JIT
)即时编译技术。来编译DEX
为机器码。即时编译技术存在有一些缺陷。
- 每次启动应用都需要重新编译
- 运行时比较耗电,造成电池额外的开销
就这样,我们一直使用者Dalvik
到(Android 5.0
). Google
推出了Android运行时
(ART
)来承担虚拟机的角色从而替换之前的Dalvik
,也更改了之前的编译模式JIT
为AOT
。AOT
通过提前编译DEX
并且缓存编译后的机器码。从而修复了JIT
所存在的问题。会存在有一些其它的问题。
- 应用的安装时间会变长
- 机器码占用的存储空间更大。
一直忍受的安装时间缓慢的问题到(Android 7.0
),Google
又对编译模式进行修改。这次的修改是使用混编的模式。JIT
和AOT
混编。从而解决的单独模式在的问题
- 应用在安装的时候
DEX
不会被编译 - 手机进入空闲的时候,系统进行
AOT
进行编译 -
JIT
编译了一些代码后将这些代码保存到本地
运行 APP
我们点击了桌面上的图标,这个时候system_server
接受到打开新进程的请求,会通知Zygote
fork 新的进程。 为什么是Zygote
来 fork 新的进程呢? 因为Zygote
它的内存空间包含所有应用程序需要的核心库,但它还不包含任何特定于特定应用程序的代码。意味着你的程序启动的更快了!
网友评论