Android 架构层的理解

1. 了解Java虚拟机linux

Java究竟为何须要JVM(Java虚拟机)?程序员

 

      图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只是适配了WindowsLinux的硬件.

 

Android使用的虚拟机叫Dalvik, 以后备ART取代.

Dalvik采用的是JIT(动态编译)机制,每次运行时都会把字节码转换为机器码,致使应用在运行时效率变慢;

ART采用的是AOT(机制),在应用安装的时候就会把字节码转化为机器码. 他们被称为DVM或者AVM.

DVMAVM不如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开发到上层就是提供了一个虚拟机, 并且AndroidLinux Kernel的修改更大.

 

参考连接: 安卓与Linux的区别与联系

 

 

4. Android应用层开发

也就是手机应用开发,调用下层framework提供的Android api,以及消息机制,来开发的应用程序, 包括APPsystem APP, 具备表明性的好比QQ的开发.

 

 

5. Android 框架层(framework)开发

介绍1: 安卓开发方向分类-应用层,框架层,底层

5 framework的上下层

 

理解: 下层,Android运行时, 包括运行时的核心库, 就是上面提到的谷歌本身使用C/C++开发出来的库, Dalvik/ART虚拟机.

这是Android的核心, 谷歌是不会让你动的. 因此framework就是各个手机厂家的舞台.

他们基于谷歌提供的库和虚拟机,或者Linux Kernel封装的核心库(见图2, AndroidLinux Kernel封装的库是平行的), 开发出本身的framework, 再在System Apps层开发出一些核心Apps(好比UI, 通信录,),装在手机上, 就成了本身的手机.

 

以上并不对! framework也是Google提供给广大Java开发者的, Android 应用都是经过frameworkAndroid或者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,还须要进一步重点学习.


参考连接Android硬件抽象层(HAL)概要介绍和学习计划

相关文章
相关标签/搜索