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只是适配了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虚拟机.
参考链接: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开发到上层就是提供了一个虚拟机, 而且Android对Linux Kernel的修改更大.
参考链接: https://blog.csdn.net/zizidemenghanxiao/article/details/50044447
4. Android应用层开发
也就是手机应用开发,调用下层framework提供的Android api,以及消息机制,来开发的应用程序, 包括APP和system 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, 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. 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