Android 系统采用一种被成为“软件叠层(softwareStack)”的方式进行构建,这种软件叠层构建使得层与层之间相互分离,明确各层的分工。这种分工保证了层与层之间的低耦合,当下层的层内或者层下发生改变时,上层应用程序无须改变。
Android系统框架由底层往上分别为:
- Linux内核层 (Linux Kernel)
- 系统运行时库层 (Libraries 和 Android Runtime)
- 应用程序框架层(Application Framework)
- 应用程序(Application)
Linux内核层
Android以Linux操作系统内核为基础,借助Linux内核服务实现硬件设备的驱动,进程和内存管理,网络协议栈,电源管理,无线通信等核心功能。
发展历史:
Android4.0版本之前基于Linux2.6系列内核;
4.0及以后的版本使用更新的Linux3.X内核,并且与两个开源项目有了互通。Linux3.3内核中正式包括了一些Android代码,可以直接导进Android
Linux3.4增添电源管理等更多的功能,以增加与Android硬件的兼容性,使Android在更多设备上得到支持。Android内核对Linux内核进行了增强,增加了一些面向移动计算的特有功能。
例如,低内存管理器LMK(Low Memory Keller),匿名共享内(Ashmem),以及轻量级的进程间通信Binder机制等。这些内核的增强是Android在继承Linux内核安全机制的同时,进一步提成了内存管理,进程间通信等安全性。
下边列举了Android内核的主要驱动模块:
驱动名称 | 说明 |
---|---|
Android电源管理器(Power Management) | 针对嵌入式设备的,基于标准Linux电源管理系统,轻量级的电源管理驱动 |
低内存管理器(Low Memory Keller) | 可以根据需要杀死进程来释放需要的内存,扩展了Linux的OOM机制,形成了独特的LMK机制 |
匿名共享内存(Ashmem) | 为进程之间提供共享内存资源,同时为内核提供回收和管理内存的机制 |
日志(Android Logger) | 一个轻量级的日志设备 |
定时器(Android Alarm) | 提供了一个定时器用于把设备从睡眠状态唤醒 |
物理内存映射管理器(Android PMEN) | DPS及其他设备只能工作在连续的物理内存上,PMEM用于向用户空间提供连续的物理内存区域映射 |
Android定时设备(Android Timed Device) | 可执行对设备的定时控制功能 |
Yaffs2文件系统 | Android采用大容量的NAND闪存作为存储设备,使用Yaff2作为文件系统管理大容量MTD NAND Flash;Yaff2占用内存小,垃圾回收简洁迅速 |
Android Paranoid网络 | 对Linux内核的网络代码进行了改动,增加了网路认证机制。可在IPV4,IPV6和蓝牙中设置,有ANDROID_PARAANOID_NETWORK宏来启用此特性 |
硬件抽象层(Hardware Abstract Layer,HAL)
内核驱动和用户软件之间还存在一层所谓的硬件抽象层(Hardware Abstract
Layer,HAL),它是对硬件设备的具体实现加以抽象。HAL没有在Android的官方架构图中标明,下面标出了硬件抽象层在android系统中的位置。
鉴于许多硬件设备厂商不希望公开其设备驱动的源代码,如果能将android的应用架构与Linux系统内核的设备驱动隔离,使应用程序框架的开发尽量独立于具体的驱动程序,则android将减少对Linux内核的依赖。
HAL由此而生,它使对Linux内核驱动的封装,将硬件抽象化,屏蔽掉底层实现的代码。
HAL规定了一套应用层对硬件层读写和配置的统一接口,本质上就是将硬件的驱动分为用户空间和内核空间两个层面;
Linux内核驱动程序运行于内核空间,硬件抽象层运行于用户空间。
系统运行库层
官网的系统架构图中,位于Linux内核层之上的系统运行库层是应用程序框架的支撑,为Android系统中的各个组件提供服务。
- 系统运行库
- Android运行时
- 系统运行时
系统类库大部分由c/c++编写,所提供的功能通过Android应用程序框架为开发者所使用。主要的系统类库及说明如下表:
系统类库名 | 说明 |
---|---|
Surface Manager | 执行多个应用程序时,管理子系统的显示,另外对2D、3D图形提供支持 |
媒体库Media Framework | 基于PacketVideoOpenCore的多媒体库,支持多种常用的音频和视频格式的录制和回访,所支持的编码格式包括MPEG4,MP3,H264,AAC,ARM |
LibWebCore | 一个最新的Web浏览器引擎,用来支持Android浏览器和一个可嵌入的Web视图 |
SQLite | 本地小型关系数据库,Android提供了一些新的SQLite数据库API,以替代传统的耗费资源的JDBC API |
OpenGL/ES | 基于OpenGL ES 1.0API标准实现的3D跨平台图形库 |
FreeType | 用于显示位图和矢量字体 |
系统C库 Libc(bilnic/ibc) | 继承自BSD的C函数bionic libc,更适合基于嵌入式Linux的移动设备 |
SSL | 安全套接层,是为网络通信提供安全及数据完整性德一种安全协议 |
Android NDK 除上表列举的主要系统类库之外,Android NDK(Native Development
Kit),即Android原生库,也十分重要。NDK为开发者提供了直接使用Android系统资源,并采用c或c++编写程序的接口。因此,第三方应用程序可以不依赖于Dalvik虚拟机进行开发。实际上,*NDK提供了一些了从C或C++生成源代码所需要的工具,为开发者快速开发C或C++的动态库提供方便,能将自动生成的动态库和java应用程序一起打包成应用程序包文件,即.apk文件。*
注意:
使用原生库无法访问应用框架从API,兼容性可能无法保障。而且从安全性角度考虑,Android原生库用非类型安全的程序语言C,C++编写,更容易产生安全漏洞,原生库的缺陷(bug)也可能更容易直接影响应用程序的安全性。
- Android 运行时
Android运行时包括
核心库
Dalvik虚拟机核心库:核心库提供Sun的Java核心函数库以及Android核心函数库的所有功能。
Dalvik虚拟机:Dalvik虚拟机是基于apache的java虚拟机,并改进以适应低内存,低处理器速度的移动设备环境。Dalvik虚拟机依赖于Linux内核,实现进程隔离和线程调试管理,安全和异常管理,垃圾回收等中重要功能。
本质而言,Dalvik虚拟机并非传统意义上的java虚拟机(JVM)。Dalvik虚拟机不仅不按Java虚拟机的规范来实现,而且两者兼容。
Dalvik虚拟机和标准Java虚拟机主要区别:
- Dalvik基于寄存器,而JVM(Java Virtual Macheine)基于栈。
- 一般认为,基于寄存器的实现虽然更多依赖于具体CPU结构,硬件通用性稍差,但其使用等长指令,在效率速度上较传统JVM更具有优势。
- Dalvik虚拟机可以同时运行多个虚拟机实例
- Dalvik虚拟机经过优化,允许在有限的内存中同时高效的运行多个虚拟机实例,并且每个Dalvik虚拟机应用作为一个独立的Linux进程执行,都拥有一个独立的Dalvik虚拟机实例。Android这种基于Linux的进程“沙箱”机制,是整个案情设计的基础之一。
- Dalvik从.dex(Dalvik Executable)文件中读取指令和数据,进行解释和运行。
- 一般编写好的java程序编译后会产生class文件(或称Bytecode),而且由JVM运行;但是Android应用Dalcik VM,所运行的的文件是dex文件,而非class文件。
- 在Dalvik VM运行dex文件之前,必须使用Android开发工具(Android SDK)内的dx工具将class文件转化成为dex文件。然后交给Dalvik VM运行
- dex文件比class文件更精简、运行性能更佳,而且更省电。
应用程序框架层
当我们开发Android应用程序时,就是面向底层的应用程序框架层进行的。从这个意义上来看,Android系统上的应用程序是完全平等的,不管是Android系统提供的程序,还是普通开发者提供的程序,都可以访问Android提供的API框架。
应用程序框架层可作为应用程序开发的基础之外,也是软件复用的重要手段,任何一个应用程序都可以发布他的功能模块——只要遵守了框架的约定,那么其他应用也可以使用这个功能模块。
下表列出应用程序层包括的模块如表:
应用程序框架模块名称 | 功能 |
---|---|
活动管理器(Activity Manager) | 管理各个应用程序生命周期并提供常用的导航回退功能,为所有程序的窗口提供交互的借口 |
窗口管理器(Window Manager) | 对所有开启的程序窗口进行管理 |
内容提供者(Content Provider) | 提供一个应用程序访问另一个应用程序数据的功能,或者实现程序之间的数据共享 |
视图系统(View System) | 创建应用程序的基本组件,包括列表(List),网格(grids),文本框(text boxes),按钮(buttons),还有可嵌入的web浏览器等。 |
通知管理器(Notification Manager) | 使应用程序可以在状态栏中显示自定义的客户提示信息 |
包管理器(Package Manager) | 对应用程序进行管理,提供的功能诸如安装应用程序,卸载应用程序,查询相关权限信息等。 |
资源管理器(Resource Manager) | 提供各种非代码资源供应用程序使用,如本地化字符串,图片,音频等 |
位置管理器(Location Manager) | 提供位置服务 |
XMPP服务 | 是Google在线即时交流软件中一个通用的进程,提供后台推送服务 |
从以上的模块可以看出,应用程序框架层实际上给开发者提供了一系列方便快件的模块框架,开发者利用此应用程序的框架,没有必要重复的复写轮子,例如,在使用button按钮组件的时候不需要考虑button具体的绘制问题,直接拿来用就好了,使得开发更加的方便快捷。
应用层
Android平台的应用层上包括系列的核心应用程序,包括电子邮件客户端、SMS程序、日历、地图、浏览器、联系人等等。或由java语言编写的运行于后台的服务程序。
关于ndk推介阅读链接:点这里
关于api与libraries疑问解答:点这里
An API is the documentation that accompanies a library to explain how to use the library (an example of this is the Android API listed above)