Android系统的框架及初探Android移植
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Android系统的框架及初探Android移植
安卓是⼀个以Linux为基础的半开放原始码作业系统,以其说android是⼀个系统,更不如说它是⼀个软件堆更为准确。
由于android采⽤软件堆的架构,所以整个安卓系统的架构如下:
从图可知,Android系统架构为四层结构,从上层到下层分别是应⽤程序层、应⽤程序框架层、系统运⾏库层以及Linux内核层。
(1)应⽤层:
android应⽤程序⼀般由java编写。
Android会同⼀系列核⼼应⽤程序包⼀起发布,该应⽤程序包包括email客户端,SMS短消息程序,⽇历,地图,浏览器,联系⼈管理程序等。
(2)应⽤程序框架层(也称为java框架层):
应⽤程序框架层是⽤c/c++编写的,这⼀层是编写Google发布的核⼼应⽤时所使⽤的API框架,开发⼈员可以使⽤这些框架来开发⾃⼰的应⽤。
View System:可以⽤来构建应⽤程序,它包括列表、⽹格、⽂本框、按钮以及可嵌⼊的Web浏览器。
Content Providers:它可以让⼀个应⽤访问另⼀个应⽤的数据,或共享它们⾃⼰的数据。
Resource Manager:提供⾮代码资源的访问,如本地字符串、图形和布局⽂件。
Notification Manager:应⽤可以在状态栏中显⽰⾃定义的提⽰信息。
Activity Manager:⽤来管理应⽤程序⽣命周期并提供常⽤的导航退回功能。
Window Manager:管理所有的窗⼝程序。
Package Manager:android系统内的程序管理。
(3)系统运⾏库层:
系统运⾏库层分为两个部分:
1、程序库(本地代码框架):
Android 包含⼀些C/C++库,这些库能被Android系统中不同的组件使⽤。
它们通过 Android 应⽤程序框架为开发者提供服务。
以下是⼀些核⼼库:
系统 C 库 - ⼀个从 BSD 继承来的标准 C 系统函数库( libc ),它是专门为基于 embedded linux 的设备定制的。
媒体库 - 基于 PacketVideo OpenCORE;该库⽀持多种常⽤的⾳频、视频格式回放和录制,同时⽀持静态图像⽂件。
编码格式包括MPEG4, H.264, MP3, AAC, AMR, JPG, PNG 。
Surface Manager - 对显⽰⼦系统的管理,并且为多个应⽤程序提供了2D和3D图层的⽆缝融合。
LibWebCore - ⼀个最新的web浏览器引擎⽤,⽀持Android浏览器和⼀个可嵌⼊的web视图。
SGL - 底层的2D图形引擎
3D libraries - 基于OpenGL ES 1.0 APIs实现;该库可以使⽤硬件 3D加速(如果可⽤)或者使⽤⾼度优化的3D软加速。
FreeType -位图(bitmap)和⽮量(vector)字体显⽰。
SQLite - ⼀个对于所有应⽤程序可⽤,功能强劲的轻型关系型数据库引擎。
2、Android 运⾏库:
Android 运⾏库包括了⼀个核⼼库,该核⼼库提供了JAVA编程语⾔核⼼库的⼤多数功能和基于寄存器的Dalvik虚拟机组成。
在Android操作系统中,每个Java程序都运⾏在Dalvik虚拟机上,其只能执⾏.dex的可执⾏⽂件,当Java程序通过编译后,最后还需要通过SDK中的dx⼯具转为成.dex格式才能正常在虚拟机上执⾏,Java虚拟机运⾏的是Java字节码,⽽Dalvik虚拟机运⾏的则是其专有的⽂件格式dex(Dalvik Exceutable)的⽂件。
Dalvik虚拟机有如下⼏个主要特征:
1).专有的dex⽂件格式。
2).dex的优化,dex⽂件的结构是紧凑的。
3).基于寄存器。
4).⼀个应⽤,⼀个虚拟机实例,⼀个进程。
每⼀个Android应⽤度运⾏在⼀个Dalvik虚拟机实例中,每⼀个虚拟机实例都是⼀个独⽴的进程空间。
(4)、linux内核层:
Android 的核⼼系统服务依赖于 Linux 内核,如安全性,内存管理,进程管理,⽹络协议栈和驱动模型。
Linux 内核也同时作为硬件和软件栈之间的抽象层。
关于HAL,这篇⽂章讲得很好:
(转⾃:/linuxzhouying/article/details/7004418)
Android的硬件抽象层,简单来说,就是对Linux内核驱动程序的封装,向上提供接⼝,屏蔽低层的实现细节。
也就是说,把对硬件的⽀持分成了两层,⼀层放在⽤户空间(UserSpace),⼀层放在内核空间(KernelSpace),其中,硬件抽象层运⾏在⽤户空间,⽽Linux内核驱动程序运⾏在内核空间。
为什么要这样安排呢?把硬件抽象层和内核驱动整合在⼀起放在内核空间不可⾏吗?从技术实现的⾓度来看,是可以的,然⽽从商业的⾓度来看,把对硬件的⽀持逻辑都放在内核空间,可能会损害⼚家的利益。
我们知道,Linux内核源代码版权遵循GNULicense,⽽Android源代码版权遵
循ApacheLicense,前者在发布产品时,必须公布源代码,⽽后者⽆须发布源代码。
如果把对硬件⽀持的所有代码都放在Linux驱动层,那就意味着发布时要公开驱动程序的源代码,⽽公开源代码就意味着把硬件的相关参数和实现都公开了,在⼿机市场竞争激烈的今天,这对⼚家来说,损害是⾮常⼤的。
因此,Android才会想到把对硬件的⽀持分成硬件抽象层和内核驱动层,内核驱动层只提供简单的访问硬件逻辑,例如读写硬件寄存器的通道,⾄于从硬件中读到了什么值或者写了什么值到硬件中的逻辑,都放在硬件抽象层中去了,这样就可以把商业秘密隐藏起来了。
也正是由于这个分层的原因,Android被踢出了Linux内核主线代码树中。
⼤家想想,Android放在内核空间的驱动程序对硬件的⽀持是不完整的,把Linux内核移植到别的机器上去时,由于缺乏硬件抽象层的⽀持,硬件就完全不能⽤了,这也是为什么说Android是开放系统⽽不是开源系统的原因。