Android为啥要采用虚拟机 安卓为何要用虚拟机

admin2024-05-30  20

1. 了解Java虚拟机

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

 

Android为啥要采用虚拟机 安卓为何要用虚拟机,Android为啥要采用虚拟机 安卓为何要用虚拟机_移动开发,第1张

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虚拟机.

 

参考链接:安卓一开始要引入Dalvik虚拟机机制?

 

还有还有, 谷歌使用虚拟机这个专利产品, 所有的应用都是安装在Android系统的虚拟机,而不是Linux上,

这样谷歌就有了自己的核心东西,而且不必开源.

我是不是可以理解, Android系统的底层就是LInux Kernel + AVM + 相关库?

 

3. Java, Android, Linux Kernel的关系

现在看来,它们三者的关系应该是如图所示:

Android为啥要采用虚拟机 安卓为何要用虚拟机,Android为啥要采用虚拟机 安卓为何要用虚拟机_移动开发_02,第2张

图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: 安卓开发方向分类-应用层,框架层,底层

Android为啥要采用虚拟机 安卓为何要用虚拟机,Android为啥要采用虚拟机 安卓为何要用虚拟机_移动开发_03,第3张

Android为啥要采用虚拟机 安卓为何要用虚拟机,Android为啥要采用虚拟机 安卓为何要用虚拟机_运维_04,第4张

图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发布开源内核的时候,厂家可以不参与硬件驱动层, 只负责编写硬件抽象层的部分,这样就可以把自己硬件信息隐藏起来.

Android为啥要采用虚拟机 安卓为何要用虚拟机,Android为啥要采用虚拟机 安卓为何要用虚拟机_移动开发_05,第5张

图7 HAL层在Android底层中?!

 

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

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

: Android硬件抽象层(HAL)概要介绍和学习计划


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明原文出处。如若内容造成侵权/违法违规/事实不符,请联系SD编程学习网:675289112@qq.com进行投诉反馈,一经查实,立即删除!