温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Android系统架构的演变历程是怎样的

发布时间:2022-01-11 13:54:05 来源:亿速云 阅读:276 作者:柒染 栏目:编程语言

Android系统架构的演变历程是怎样的,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

Android是一种以LinuxJAVA为基础的开放源代码操作系统。Android分为应用层、应用框架层、系统运行库层和Linux内核层。今天大家一起来大致回顾一下Android 系统架构的演变历程。

一、androidlinux内核

 

Android是基于Linux内核的操作系统,但是它与Linux之间还是有很大的差别,比如AndroidLinux内核的基础上添加了自己所特有的驱动程序。Android为什么会选择Linux?

 

1、强大的内存管理和进程管理方案

 

2、基于权限的安全模式

 

3、支持共享库

 

4、经过认证的驱动模型

 

5Linux本身就是开源项目

 

Androidlinux系统的改动主要有

1)它没有glibc支持

 

由于Android最初用于一些便携的移动设备上,所以,可能出于效率等方面的考虑,Android并没有采用glibc作为C库,而是Google自己开发了一套Bionic Libc来代替glibc

 

2)它并不包括一整套标准的Linux使用程序

 

Android并没有完全照搬Liunx系统的内核,除了修正部分LiunxBug之外,还增加了不少内容,比如:它基于ARM构架增加的Gold-Fish平台,以及yaffs2 FLASH文件系统(如果学习了嵌入式的话就会知道yaffs2 FLASH文件系统已经在基于linux的很多嵌入式设备上采用了,技术已经非常成熟)等。它没有本地基于X服务的窗口系统。什么是本地窗口系统呢?本地窗口系统是指GNU/Linux上的X窗口系统,或者Mac OX XQuartz等。不同的操作系统的窗口系统可能不一样,Android并没有使用(也不需要使用)LinuxX窗口系统。

 

3Android专有的驱动程序

 

除了上面这些不同点之外,最重要的是,为了突出android特性,支持android设备,Android还对Linux设备驱动进行了增强,主要如下所示。

 

aAndroid Binder 基于OpenBinder框架的一个驱动,用于提供 Android平台的进程间通信(InterProcessCommunicationIPC)功能。源代码位于drivers/staging/android/binder.c

 

bAndroid电源管理(PM) 一个基于标准Linux电源管理系统的轻量级Android电源管理驱动,针对嵌入式设备做了很多优化。源代码位于:

 

kernel/power/earlysuspend.c

 

kernel/power/consoleearlysuspend.c

 

kernel/power/fbearlysuspend.c

 

kernel/power/wakelock.c

 

kernel/power/userwakelock.c

 

c、低内存管理器(Low Memory Killer) Linux的标准的OOM(Out Of Memory)机制更加灵活,它可以根据需要杀死进程以释放需要的内存。源代码位于 drivers/staging/ android/lowmemorykiller.c

 

d、匿名共享内存(Ashmem) 为进程间提供大块共享内存,同时为内核提供回收和管理这个内存的机制。源代码位于mm/ashmem.c

 

eAndroid PMEM(Physical) PMEM用于向用户空间提供连续的物理内存区域,DSP和某些设备只能工作在连续的物理内存上。源代码位于drivers/misc/pmem.c

 

fAndroid Logger 一个轻量级的日志设备,用于抓取Android系统的各种日志。源代码位于drivers/staging/android/logger.c

 

gAndroid Alarm 提供了一个定时器,用于把设备从睡眠状态唤醒,同时它还提供了一个即使在设备睡眠时也会运行的时钟基准。源代码位于drivers/rtc/alarm.c

 

hUSB Gadget驱动 一个基于标准 Linux USB gadget驱动框架的设备驱动,AndroidUSB驱动是基于gaeget框架的。源代码位于drivers/usb/gadget/

 

iAndroid Ram Console 为了提供调试功能,Android允许将调试日志信息写入一个被称为RAM Console的设备里,它是一个基于RAMBuffer。源代码位于drivers/staging/android / ram_console.c

 

jAndroid timed device 提供了对设备进行定时控制的功能,目前支持vibratorLED设备。源代码位于drivers/staging/android /timed_output.c(timed_gpio.c)

 

kYaffs2 文件系统 Android采用Yaffs2作为MTD nand flash文件系统,源代码位于fs/yaffs2/目录下。Yaffs2是一个快速稳定的应用于NANDNOR Flash的跨平台的嵌入式设备文件系统,同其他Flash文件系统相比,Yaffs2能使用更小的内存来保存其运行状态,因此它占用内存小。Yaffs2的垃圾回收非常简单而且快速,因此能表现出更好的性能。Yaffs2在大容量的NAND Flash上的性能表现尤为突出,非常适合大容量的Flash存储。

 

二、最新的Android系统分为五层六区(域)

 

1Linux内核层(Linux Kernel):Android系统基于Linux2.6内核,这一层为Android设备各种硬件提供了底层驱动,如显示驱动、音频驱动、照相机驱动、蓝牙驱动、Wi-Fi驱动、电源管理等;

 

2、硬件抽象层(android hardware abstraction layer):安卓驱动硬件的方式与Linux不尽相同。传统Linux的驱动完全存活于内核空间。Android则在内核外部增加了硬件抽象层(HAL, Hardware Abstraction Layer) ,把一部分驱动功能放到HAL层中。安卓为什么费尽麻烦增加一个HAL呢?为了保护源代码。Linux内核采用了GPL协议,所以硬件生产商想要支持Linux系统,必须遵照GPL协议公开硬件驱动的源代码。但这些源代码中包含有许多硬件的设计信息,牵涉到硬件生产商的核心利益。而增加了HAL层之后,硬件厂商就不需要开放所有的驱动代码了。

 

3、系统运行库层(libraries):这一层通过一些C/C++库(so库)来为Android系统提供了主要的特性支持。如SQLite库提供了数据库支持,OpenGL ES库提供了3D绘图支持,Webkit库提供了浏览器内核支持等;

 

4、应用框架层(application framework):这一层主要提供构建应用程序时可能用到的各种APIAndroid自带的一些核心应用就是使用这些API完成的,开发者也可通过使用API来构建自己的应用程序;应用层(applications):这一层主要用于手机应用的安装,如系统自带联系人、短信等程序,或是第三方应用程序。

 

以上为五层五区,还有一个区域是存在于libraries层的Android运行时库(Android Runtime),它主要提供一些核心库,能够允许开发者使用Java语言来编写Android应用。另外Android运行时库中还包含了Dalvik虚拟机,它使得每一个Android应用都能运行在独立的进程中,且拥有一个自己的Dalvik虚拟机实例。相较于Java虚拟机,Dalvik是专门为移动设备定制的,它针对手机内存、CPU性能有限等情况作了优化处理。 每个Android应用都运行在自己的进程上,享有Dalvik虚拟机为它分配的专有实例。为了支持多个虚拟机在同一设备上高效运行,dalvik被改写过。Dalvik虚拟机执行的是Dalvik格式的可执行文件(.dex-该格式经过优化,以将内存好用降到最低。

 

三、Dalvik虚拟机 和代码编译

 

安卓的应用是由Java编写的,而包括HAL在内的Linux的库都是由C/C++编写的,这个落差由Dalvik虚拟机衔接的。当一个应用运行时,进程空间内将包含一个Dalvik虚拟机。Java程序编译为字节码文件,运行在Dalvik虚拟机中。根据Java代码中的要求,Dalvik通过JNI(Java Native Interface)调用底层的C/C++编写的功能。JNI是从Java中调用C/C++模块的接口。由于上层接口的标准化,字节码可以畅通无阻的跨平台运行。

 

Dalvik虚拟机内部是一个“虚拟”进程空间,有自己的栈和堆,管理代码的运行流程。如果这以“虚拟”进程空间不足,Dalvik内建的垃圾回收(garbage collection)机制会自动清空堆上不再使用的对象。自动的垃圾回收简化了程序员的工作,但速度较慢。手动内存管理效率高,但需要更多的编程,且容易犯错。

 

Android4种文件类型Java,class,dex,apk

 

Class文件------Java编译后的目标文件不像J2sejava编译成class就可以直接运行,android平台上class文件不能直接在android上运行。 由于Google使用了自己的Dalvik来运行应用, 所以这里的class也肯定不能在AndroidDalvikjava环境中运行, androidclass文件实际上只是编译过程中的中间目标文件,需要链接成dex文件后才能在dalvik上运行

 

Dex文件-----Android平台上的可执行文件Android虚拟机Dalvik支持的字节码文件格式Google在新发布的Android平台上使用了自己的Dalvik虚拟机来定义, 这种虚拟机执行的并非Java字节码, 而是另一种字节码: dex格式的字节码。在编译Java代码之后,通过Android平台上的工具可以将Java字节码转换成Dex字节码。虽然GoogleDalvik是为了移动设备定做的,但是业界很多人认为这是为了规避向sun申请Javalicense。这个DalvikVM针对手机程式/CPU做过最佳化,可以同时执行许多VM而不会占用太多Resource

 

Apk文件-------Android上的安装文件ApkAndroid安装包的扩展名,一个Android安装包包含了与某个Android应用程序相关的所有文件。apk文件将AndroidManifest.xml文件、应用程序代码(.dex文件)、资源文件和其他文件打成一个压缩包。一个工程只能打进一个.apk文件。

看完上述内容,你们掌握Android系统架构的演变历程是怎样的的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注亿速云行业资讯频道,感谢各位的阅读!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI