Android系统架构
- Application层:也就是应用层,不仅包括通话短信联系人这种系统级的应用,还包括用户自己安装的一些第三方应用
- FrameWork层:这一层大部分用Java写的,包括系统服务和四大组件,我们最常用的组件和服务都在这一层
- Android Runtime/Library层:这一层大部分都是C/C++写的,主要是虚拟机,还有一些三方库比如SQLite, WebKit,开发者可以通过调用Java API Framework来使用原生库的功能,也可以用Android NDK直接调用原生库。
- 硬件抽象层 (HAL) :提供标准接口,HAL包含多个库模块,其中每个模块都为特定类型的硬件组件实现一组接口,比如WIFI/蓝牙模块,当框架API请求访问设备硬件时,Android系统将为该硬件加载相应的库模块。
- Linux内核层:包含Linux内核和一些驱动,比如说蓝牙驱动,Camera驱动等等,这个Binder驱动也是在这一层
JVM DVM APT对比
Android5.0之后使用的新型虚拟机——ART虚拟机
DVM vs JVM
JVM:(Java Virtual Machine) Java虚拟机
DVM:(Dalvik Virtual Machine) Dalvik虚拟机
共同点:
- 都是解释执行
- 都是每个 OS 进程运行一个 VM,并运行一个单独的程序
- 在较新版本中(Froyo / Sun JDK 1.5)都实现了相当程度的 JIT compiler(即时编译) 用于提速。
JIT(Just In Time,即时编译技术)对于热代码(使用频率高的字节码)直接转换成汇编代码;
不同点:
架构不同
- JVM .Java----->.class----->.jar
运行在内存的 栈(栈是内存当中特殊的数据结构)
JVM:里含有多个.class文件,每个.class文件都包含文件头,这样IO操作效率低。 - DVM .java----->.class------>.dex-----(加上其它资源文件)---->apk
运行在CPU的 寄存器
DVM中,看不到.class文件了,一个都没看到,这是因为dex工具,去掉了app里所有.class文件的冗余信息,再整合到.dex文件中,减少了IO的操作,提高了查找速度。同时你会发现就一个.dex文件,是比较大的。
Dalvik的垃圾回收策略默认是标记擦除回收算法 - dvm速度快!指令数小!
jvm基于栈带来的好处是可以做的足够简单,真正的跨平台,保证在低硬件条件下能够正常运行。而dvm操作平台一般指明是ARM系统,所以采取的策略有所不同。需要注意的是dvm基于寄存器,但是这也是个映射关系,如果硬件没有足够的寄存器,dvm将多出来的寄存器映射到内存中。
ART虚拟机
在Android5.0中,ART取代了Dalvik虚拟机(安卓在4.4中发布了ART)。ART虚拟机直接执行本地机器码;而Dalvik虚拟机运行的是DEX字节码需要通过解释器执行。安卓运行时从Dalvik虚拟机替换成ART虚拟机,并不要求开发者重新将自己的应用直接编译成目标机器码,应用程序仍然是一个包含dex字节码的apk文件,这主要得益于AOT技术,AOT(Ahead Of Time)是相对JIT(Just In Time)而言的;也就是在APK运行之前,就对其包含的Dex字节码进行翻译,得到对应的本地机器指令,于是就可以在运行时直接执行了。ART应用安装的时候把dex中的字节码将被编译成本地机器码,之后每次打开应用,执行的都是本地机器码。去除了运行时的解释执行,效率更高,启动更快。