dex
- 关于dex先说几点,我们知道java生成的是class文件,jvm也是基于栈的虚拟机,而Dalvik和ART都是基于寄存器的虚拟机,所以在build的时候,不仅仅是简单合并和去除重复,还要转变指令和数据结构
apk
- apk实质上就是一个zip文件,只是改了后缀名而已,apk里面放着dex文件、native代码文件(.so)、资源文件、Manifest.xml
apk的安装过程
- 当通过SD卡上的APK安装时,会先把apk复制到/data/app下,然后执行下面的操作
- 安装过程其实就是一个解压过程,对于Dalvik和ART两种虚拟机对dex文件有不同的优化处理,这个过程叫做optdex,生成的优化后的文件就会放在/data/dalvik-cache下面,同时optdex过程还会验证字节码,同时向Android系统中注册这个app,即Android会解析Android Manifest并向它自己的package.xml写入对应的注册信息
- 对于Dalvik,会把dex从apk文件内提取出来放到某个文件夹下,这样每次启动的时候就减少了一个从apk提取dex文件的动作
- 对于ART(6.0),不会生成odex文件,取而代之的是oat文件,我们知道ART(6.0)在安装的时候会花费更多的时间,这个时间是干嘛用的呢?其实就是用来从apk里面提取出来dex之后,把dex转化成机器码,这样得以让设备直接执行,也就是说不再执行字节码了
- 那是不是意味着ART就没用了?都可以直接执行机器吗了,还用啥虚拟机?
- 其实ART主要的作用就是用来创建对象和GC,就相当于ART充当了操作系统进程里堆的管理者,实现了一种垃圾收集机制和堆内存管理机制(包括分配内存、整理内存碎片)
- 对于ART(7.0),不会把dex直接变成oat文件了,即不采用AOT的方法,也不是单纯的JIT,而是说把OAT和JIT结合起来,当执行了JIT后,会把它产生的机器码保存下来,这样既保证了安装速度,又让app越用越快
- aot文件里面不仅仅包含可执行文件,还包含了原来的dex文件和资源文件等文件,所以占用的空间更大,aot同样也是放在某个缓存文件夹下面的,在启动某一个Android进程时都是去相应的文件夹下去load对应的odex / oat文件