1. 了解Java虚拟机linux
图1 JVM虚拟机结构api
上面这篇文章说的很好,总结来讲就是为了跨平台(操做系统):Windows,Linux,Mac OS.安全
为何不在执行的时候,把Java编译成每一个系统适配的可执行代码呢?还须要费事情安装虚拟机?网络
目的就是,虽然虚拟机安装的时候费时间,可是能够保证Java的代码,只须要一次编译,就能够在任何地方执行.架构
Java编译成了.class文件,在虚拟机执行.框架
比较C语言能够发现,虽然C语言也能够称做跨平台,但只是源代码的跨平台(也不必定,有时候不一样系统的库不同,还须要适配呢!).ionic
在Windows编译成的可执行的文件并非能够跨平台执行的.ide
因此是否是能够推测,Java之因此这么麻烦作一个虚拟机,是由于”编译”这件事情,是一个很麻烦的事情!学习
回想一下你们吃饭前编译甚至下班前编译的事情,就解释通了.
2. Android为何不使用JVM?
Android是一个相似Windows的操做系统, 在操做系统上运行的是虚拟机,再往上,程序就是在虚拟机上编译运行的.
Java程序运行须要完整的虚拟机环境,而Android系统自己又是一个开源项目,
因此没法直接使用商用的JVM(假如Android开源,而上层的JVM不开源,那么对于开发者来讲有什么意义呢?).
另外, JVM也不支持不一样的终端,由于JVM只是适配了Windows和Linux的硬件.
Android使用的虚拟机叫Dalvik, 以后备ART取代.
Dalvik采用的是JIT(动态编译)机制,每次运行时都会把字节码转换为机器码,致使应用在运行时效率变慢;
ART采用的是AOT(机制),在应用安装的时候就会把字节码转化为机器码. 他们被称为DVM或者AVM.
DVM和AVM不如JVM有名, 那是由于你们在Windows或者Linux上进行开发的时候, 都须要手动安装对应版本的JVM,
而AVM只须要适配Android,因此不须要程序员手动安装, 知名度不高.
话说回来, 既然在终端上的Java只须要在Android上运行,那么为何还要使用虚拟机呢?
虚拟机不就是为了适配不一样的操做系统的吗?由于Java只能够运行在虚拟机上!
为了照顾到广大Java程序员, 同时让他们快速转到Android开发, 就开发了Java虚拟机.
参考连接:安卓一开始要引入Dalvik虚拟机机制?
还有还有, 谷歌使用虚拟机这个专利产品, 全部的应用都是安装在Android系统的虚拟机,而不是Linux上,
这样谷歌就有了本身的核心东西,并且没必要开源.
我是否是能够理解, Android系统的底层就是LInux Kernel + AVM + 相关库?
3. Java, Android, Linux Kernel的关系
如今看来,它们三者的关系应该是如图所示:
图2 Android 系统的架构(这个图片在网上广为流传了)
也就是说,Android借用了Linux Kernel的一些有用的东西,好比强大的内存管理和进程管理方案,基于权限的安全模式,支持共享库等等...
可是, Android也对Linux作了改进,好比没有采用glibc做为C库,本身开发了一套Bionic Libc做为替代; 对Linux Kernel的设备驱动进行了加强, 对电源管理进行了优化,等等.
因为改动太多, 并且厂商的设备信息都放在HAL层, 并不写在驱动里面,因此不符合Linux社区要求, Android一直不想Ubuntu, Debian, CentOS那样,认为是Linux分支/发行版.
这么看来, Android是和Ubuntu相似,借用Linux Kernel开发出一个系统. 只不过Android开发到上层就是提供了一个虚拟机, 并且Android对Linux Kernel的修改更大.
参考连接: 安卓与Linux的区别与联系
4. Android应用层开发
也就是手机应用开发,调用下层framework提供的Android api,以及消息机制,来开发的应用程序, 包括APP和system APP, 具备表明性的好比QQ的开发.
5. Android 框架层(framework)开发
介绍1: 安卓开发方向分类-应用层,框架层,底层
图5 framework的上下层
理解: 下层,是Android运行时, 包括运行时的核心库, 就是上面提到的谷歌本身使用C/C++开发出来的库, 和Dalvik/ART虚拟机.
这是Android的核心, 谷歌是不会让你动的. 因此framework就是各个手机厂家的舞台.
他们基于谷歌提供的库和虚拟机,或者Linux Kernel封装的核心库(见图2, Android和Linux Kernel封装的库是平行的), 开发出本身的framework, 再在System Apps层开发出一些核心Apps(好比UI, 通信录,等),装在手机上, 就成了本身的手机.
以上并不对! framework也是Google提供给广大Java开发者的, Android 应用都是经过framework与Android或者Linux 封装库进行交互的.
framework提供了可扩展的视图,用来构建应用程序, 好比list, buttons等, 因此说, MIUI和普通的Apps同样,都是在framework上?
UI是的,可是MIUI还对原生Android进行了其余深度修改, 反正大多数只须要安装在本身的硬件上,因此多改点也不要紧.
不少OS都是基于Android的深度定制,有的修改了UI(说明原生Android也是有UI的),有的修改了内核代码.
(只能理解到这里了,欢迎更正)
6. C++本地库和Android底层(也叫系统运行库与Android实时运行)
Android底层下面就是Linux kernel吗?Android底层指的是什么?仍是说Linux kernel自己就是Android的最底层?
Android底层就是Android runtime + 公共库, 其中Android runtime又包括Google本身开发的库和DVM/AVM,
这才是谷歌最核心的部分,并且因为在Linux Kernel之上,因此不须要公布源代码.
C++ 本地库和Android在同一层, APP应用开发者能够直接使用C++ 本地库的接口,来实现官方API未实现的功能???
我不肯定, 应用开发者是否能够直接调用C++ 的本地库?
根据大多数结构体,应该不能够,由于C++上面还有framework封装.
也就是说,即便是C++ 库也被framework封装过了.否则Android结构图就不会像上面这样画了.
7. Linux 核心层
Linux Kernel
Android最终是和硬件打交道, 如何打交道?
既然Linux系统的硬件驱动比较丰富,不如直接借用Linux系统做为Android最底层,来负责管理硬件,好比驱动,进程管理,内存管理,网络管理等等.
为了保证Android系统的精简和独特性,不能使用成熟的Linux系统,因此这里只是借用Linux Kernel.
可是,Android内核和Linux内核并非彻底相同的.
Android内核在文件系统,进程通讯机制以及内存管理等方面作出了优化.
好比内存增长了对YAFFS2的支持,增长了进程间的通讯机制,采用了一宗不一样于Linux内核标准的低内存管理策略...
参考: Android系统四层体系结构详解 (写的很详细,值得一看)
硬件抽象层
Android的硬件抽象层,简单来讲就是对Linux内核驱动程序的封装.向上提供接口,屏蔽底层的实现细节.
Android系统中,对硬件的支持分为两层:放在内核空间的硬件驱动层, 放在用户空间的硬件抽象层(HAL).
为何要分开放?
为了Linux发布开源内核的时候,厂家能够不参与硬件驱动层, 只负责编写硬件抽象层的部分,这样就能够把本身硬件信息隐藏起来.
图7 HAL层在Android底层中?!
HAL层不可能放在Linux Kernel中,也不会放在framework中,因此应该放在Android底层中,由硬件厂商提供.好比相机的HAL层.
想要关于HAL层,还须要进一步重点学习.