一、引言
Android系统非常庞大,横跨了多个领域,但整体架构设计清晰。
底层内核空间:以Linux Kernel作为基础。
上层用户空间:由Native系统库、虚拟机运行环境、Framework框架层组成。
通过系统调用(Syscall)连通系统的内核空间与用户空间。对于用户空间主要采用C++和Java代码编写,通过JNI技术打通用户空间的Java层和Native层(C++/C),从而连通整个系统。
为了能让大家整体上大致了解Android系统涉及的知识层面,先来看一张Google官方提供的经典分层架构图,从下往上依次分为Linux内核、HAL、系统Native库和Android运行时环境、Java框架层以及应用层这5层架构,其中每一层都包含大量的子模块或子系统。
二、Android架构
android的本质是一个基于Linux上运行的java虚拟机。
首先为了理解安卓系统是怎么工作的,就先来看一下android的系统架构。
其架构大至可以分为五层:linux内核层、HAL层、系统运行库层、应用框架层和应用层,那就先说说这几层。
1.linux kernel层
Android系统是基于Linux内核的,这一层为Android设备的各种硬件提供了底层的驱动(如显示,音频,照相机,蓝牙,WI-FI,电源管理等等),而linux内核作为一个抽象层存在硬件和软件之间,有强大的内存管理和进程管理,基于权限的安全模式,支持共享库,经过认证的驱动模式等许多优势。
但同时Android对于Linux进行了改动,比如它没有glibc,最初用于一些便携的移动设备并没有采用glibc作为c库,而是goolge自己开发的Bionic Libc来作为代替品,也并没有完全照搬Linux系统的内核还增加了Gold-Fish平台以及yaffs2 Flash文件系统,而且它没有了本地基于x服务的窗口系统即Android并没有使用Linux的x窗口,同时还对驱动程序进行了增强显示驱动、键盘驱动、Flash内存驱动、照相机驱动、音频驱动、蓝牙驱动、WiFi驱动、Binder IPC驱动、Power Management(电源管理),包括硬件时钟,内存分配和共享,低内存管理,kernel调试,日志设备,android IPC机制,电源管理等。
- Binder IPC驱动:基于OpenBinder框架的一个驱动,用于提供 Android平台的进程间通信功能。源代码位于drivers/staging/android/binder.c。
- 电源管理(PM) :一个基于标准Linux电源管理系统的轻量级Android电源管理驱动,针对嵌入式设备做了很多优化,比如电池电量。源代码位于:kernel/power/earlysuspend.c、kernel/power/consoleearlysuspend.c、kernel/power/fbearlysuspend.c、kernel/power/wakelock.c、kernel/power/userwakelock.c
- 低内存管理器:比Linux的标准的OOM机制更加灵活,它可以根据需要杀死进程以释放需要的内存。源代码位于 drivers/staging/ android/lowmemorykiller.c。
- 匿名共享内存: 为进程间提供大块共享内存,同时为内核提供回收和管理这个内存的机制。源代码位于mm/ashmem.c。
- PMEM :用于向用户空间提供连续的物理内存区域,DSP和某些设备只能工作在连续的物理内存上。源代码位于drivers/misc/pmem.c。
- Logger :一个轻量级的日志设备,用于抓取Android系统的各种日志。源代码位于drivers/staging/android/logger.c。
- Alarm :提供了一个定时器,用于把设备从睡眠状态唤醒,同时它还提供了一个即使在设备睡眠时也会 运行的时钟基准。源代码位于drivers/rtc/alarm.c。
- USB Gadget:驱动 一个基于标准 Linux USB gadget驱动框架的设备驱动,Android的USB驱动是基于gaeget框 架的。源代码位于drivers/usb/gadget/。
- Ram Console: 为了提供调试功能,Android允许将调试日志信息写入一个被称为RAM Console的设备里,它是一个基于RAM的Buffer。源代码位于drivers/staging/android / ram_console.c。
- timed device: 提供了对设备进行定时控制的功能,目前支持vibrator和LED设备。源代码位于drivers/staging/android /timed_output.c(timed_gpio.c)。
- Yaffs2 :是文件系统 Android采用Yaffs2作为MTD nand flash文件系统,源代码位于fs/yaffs2/目录下。Yaffs2是一个快速稳定的应用于NAND和NOR Flash的跨平台的嵌入式设备文件系统,同其他Flash文件系统相比,Yaffs2能使用更小的内存来保存其运行状态,因此它占用内存小。Yaffs2的垃圾回收非常简单而且快速,因此能表现出更好的性能。Yaffs2在大容量的NAND Flash上的性能表现尤为突出,非常适合大容量的Flash存储。
2.硬件抽象层 (HAL)
硬件抽象层 (HAL) 提供标准接口,HAL包含多个库模块,其中每个模块都为特定类型的硬件组件实现一组接口,比如WIFI/蓝牙模块,当框架API请求访问设备硬件时,Android系统将为该硬件加载相应的库模块。
3.系统运行库层
- 通过一些c/c++库来为Android提供主要的特性支持,如SQLite提供了数据库的支持
- Android运行时库提供了一些核心库,能够允许开发者使用JAVA语言来编写Android应用
- 包含了虚拟机Dalvik但之后改为了ART运行环境,使每一个Android应用都有自己的进程,并且都有一个自己的Dalvik虚拟机实例,相较于JAVA的虚拟机Dalvik是专门为移动设备定制的,针对内存和CPU性能都有了优化。
所以Android的系统运行库包含两部分,一个是系统库,另一个是运行时库,Android系统的各个组件都在使用c/c++库,这些功能是通过Android应用框架暴露给开发人员的,系统库是应用程序框架的支撑,是连接应用程序框架层与Linux内核层的重要纽带,在程序运行时,执行其运行时库分为核心库和Dalvik虚拟机两部分。
系统库 Native C/C++ Libraries(九个):
- Libc:系统c库,是从BSD继承来的标准C系统函数库,专门为基于EmbeddedLinux的设备定制。
- Media Framework(多媒体库):Android系统多媒体库,基于PacketVideoOpen、CORE。该库支持录放.并且可以录制许多流行的音频视频格式.还有静态映像文件,包括MPEG4、H.264、MP3、AAC、JPG、PNG等。
- Surface Manager:主要负责管理针对显示系统的访问,并且为多个应用程序提供2D和3D图层的无缝融合。
- Webkit:浏览器。一个最新的web浏览器引擎,用来支持Android浏览器和一个可嵌入的Web视图。
- SGL:一个内置的2D图形引擎。
- SSL:位于TCP/IP与各种应用层协议之间为数据通信提供支持。
- OpenGL ES:3D效果的支持。基于OpenGLES 1.0 APIs实现;该库可以使用硬件3D加速或者使用高度优化的3D软加速。
- greeType:提供位图bitmap和向量vector的字体描述与显示。
- SQLite:一个对于所有应用程序可用、功能强劲的轻型关系型数据库引擎
除了之上的主要系统类库之外,还有Android NDK,即Android原生库。NDK为开发者提供了直接使用Android系统资源,并采用C 或C++语言编写程序的接口。因此,第三方应用程序可以不依赖于Dalvik虚拟机进行开发。NDK提供了一系列从C或C++生成原生代码所需要的工具,为开发者快速开发 C 或 C++的动态库提供方便,并能自动将生成的动态库和Java 应用程序一起打包成应用程序包文件,即.apk文件。
注意,使用原生库无法访问应用框架层API,兼容性可能无法保障。而且从安全性角度考虑,Android原生库用非类型安全的程序语言C/C++编写,更容易产生安全漏洞,原生库的缺陷也可能更容易直接影响应用程序的安全性。
Android运行时 Android Runtime:
-
核心库:提供了Java语言API中的大多数功能,同时也包含Android的一些核心API.如android.OS、android.net、android.media等。
-
Dalvik虚拟机:Android程序不同于J2ME程序(是java的一种运行环境),每个Android应用都运行在自己的进程上,享有Dalvik虚拟机为它分配的专有实例,并在该实例中执行。Dalvik虚拟机是一种基于寄存器的Java虚拟机,而不是传统的基于栈的虚拟机,并进行了内存资源使用的优化以及支持多个虚拟机的特点。设计成在一个设备可以高效地运行多个虚拟机。Dalvik虚拟机可执行文件格式是(.dex),dex格式是专为Dalvik设计的一种压缩格式,适合内存和处理器速度有限的系统。 大多数虚拟机包括JVM都是基于栈的,而Dalvik虚拟机则是基于寄存器的,所有的类都经由JAVA编译器编译,然后通过SDK中 的 “dx” 工具转化成.dex格式由虚拟机执行。Java编译器将Java源文件转为class文件,class文件又被内置的dx(具有转化为dex格式文件,该格式文件针对最小内存使用做了优化,这种文件在Dalvik虚拟机上注册并运行)。在一些底层功能方面,例如线程和低内存管理等.Dalvik虚拟机是依赖Linux内核的。
Dalvik虚拟机是基于Apache的Java虚拟机,并被改进以适应低内存、低处理器速度的移动设备环境。Dalvik虚拟机依赖于Linux内核,实现进程隔离与线程调度管理、安全和异常管理、垃圾回收等重要功能。但Dalvik虚拟机并非传统意义上的Java虚拟机(JVM)。Dalvik虚拟机不仅不按照Java虚拟机的规范来实现而且两者不兼容。
4.应用框架层 Java API Ftamework
这一层主要提供了构建应用程序时可能用到的各种API,Android自带的一些核心应用就是使用这些API完成的。那什么是应用程序框架层,可以说是一个应用程序的核心,是一个共同使用和遵守的约定然后在这个约定上共同扩展,但程序保持主体结构的一致,其作用的是让程序保持清晰在满足不同需求的同时又不互相影响。而对于Android来提供给应用开发者的本身就是一个框架,所有的应用开发都必须遵守这个框架的原则,同时在这个基础上进行扩展可以访问核心应用程序所使用的API框架(即要实现某个功能就调用安卓系统自己提供的功能,如果不想调用就可以通过继承实现个性化扩展),安卓的应用框架提供开发Android应用程序所需的一系列类库采用重用机制,开发人员可以进行快速的应用程序开发方便高效的使用安桌平台本身的组件或者替换平台本身的各种应用程序组件
该框架包含:活动管理器、窗口管理器、内容提供者、视图系统、包管理器、电话管理器、资源管理器、位置管理器、通知管理器、XMPP服务。
5.应用层 System Apps
所有安装在手机上的应用程序都是这个层,比如手机自带的程序或者下载的游戏等等。
附加. Syscall && JNI
Native与Kernel之间有一层系统调用(SysCall)层
Java API Ftamework 层与Native(C/C++)层之间的纽带JNI
时间:2020年1月12日 19:31
来源:CSDN
作者:文艺小少年
链接:https://blog.csdn.net/weixin_38019025/article/details/103947480