Android 架构层的理解

1. 了解Java虚拟机

Java究竟为什么需要JVM(Java虚拟机)?

https://blog.csdn.net/qq_41212104/article/details/80723644

      图1 JVM虚拟机结构

 

上面这篇文章说的很好,总结来说就是为了跨平台(操作系统):Windows,Linux,Mac OS.

 

 

为什么不在执行的时候,Java编译成每个系统适配的可执行代码呢?还需要费事情安装虚拟机?

目的就是,虽然虚拟机安装的时候费时间,但是可以保证Java的代码,只需要一次编译,就可以在任何地方执行.

Java编译成了.class文件,在虚拟机执行.

 

 

比较C语言可以发现,虽然C语言也可以称作跨平台,但只是源代码的跨平台(也不一定,有时候不同系统的库不一样,还需要适配呢!).

Windows编译成的可执行的文件并不是可以跨平台执行的.

所以是不是可以推测,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虚拟机.

 

参考链接:https://www.zhihu.com/question/20671865

 


 

还有还有, 谷歌使用虚拟机这个专利产品, 所有的应用都是安装在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的修改更大.

 

参考链接: https://blog.csdn.net/zizidemenghanxiao/article/details/50044447

 

4. Android应用层开发

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

 

 

5. Android 框架层(framework)开发

介绍1: https://blog.csdn.net/qq_39037047/article/details/79927831

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. Android底层(也叫系统运行库与Android实时运行)

Android底层下面就是Linux kernel?Android底层指的是什么?还是说Linux kernel本身就是Android的最底层?

Android底层就是Android runtime + 公共库, 其中Android runtime又包括Google自己开发的库和DVM/AVM,

这才是谷歌最核心的部分,而且由于在Linux Kernel之上,所以不需要公布源代码.

 

7. Linux 核心层

  • Linux Kernel

Android最终是和硬件打交道, 如何打交道?

既然Linux系统的硬件驱动比较丰富,不如直接借用Linux系统作为Android最底层,来负责管理硬件,比如驱动,进程管理,内存管理,网络管理等等.

为了保证Android系统的精简和独特性,不能使用成熟的Linux系统,所以这里只是借用Linux Kernel.

 

  • 硬件抽象层

 

 

Android的硬件抽象层,简单来说就是对Linux内核驱动程序的封装.向上提供接口,屏蔽底层的实现细节.

Android系统中,对硬件的支持分为两层:放在内核空间的硬件驱动层, 放在用户空间的硬件抽象层(HAL).

为什么要分开放?

为了Linux发布开源内核的时候,厂家可以不参与硬件驱动层, 只负责编写硬件抽象层的部分,这样就可以把自己硬件信息隐藏起来.

7 HAL层在Android底层中?!

 

 

 

HAL层不可能放在Linux Kernel,也不会放在framework,所以应该放在Android底层中,由硬件厂商提供.比如相机的HAL.

想要关于HAL,还需要进一步重点学习.


参考链接: https://blog.csdn.net/Luoshengyang/article/details/6567257

 

 

 

 

 

 

 

 

 

 

 

猜你喜欢

转载自www.cnblogs.com/Younger-Zhang/p/10458563.html
今日推荐