Android系统框架
16lz
2021-01-23
首先看系统架构框架图如下:
android的系统架构和其操作系统一样,采用了分层的架构。从架构图看,android分为四个层,从高层到低层分别是应用程序层、应用程序框架层、系统运行库层(包含系统库和Android运行库)和linux核心层。
Android的中间件可以再细分出两层,底层是函数库(Library)和虚拟机(Virtual Machine; VM),上层为应用程序框架(Application Framework)。上面架构图中蓝色部分为Java语言开发,绿色部分为C/C++开发,红色的Kernel层为C开发,黄色部分为Dalvik VM部分。 以下分别介绍每一层的作用
System C library �C 一个从 BSD 继承来的标准 C 系统函数库( libc ), 它是专门为基于 embedded linux 的设备定制的。 Media Libraries �C 基于 PacketVideo OpenCORE;该库支持多种常用的音频、视频格式回放和录制,同时支持静态图像文件。编码格式包括MPEG4, H.264, MP3, AAC, AMR, JPG, PNG 。 Surface Manager �C 对显示子系统的管理,并且为多个应用程序提 供了2D和3D图层的无缝融合。 LibWebCore �C 一个最新的web浏览器引擎用,支持Android浏览器和一个可嵌入的web视图。 SGL -底层的2D图形引擎。 3D Libraries -基于OpenGL ES 1.0 APIs实现;该库可以使用硬件 3D加速(如果可用)或者使用高度优化的3D软加速。 Free Type - 位图(bitmap)和矢量(vector)字体显示。 SQLite �C SQLite是一套开放源码的关系数据库,一个对于所有应用程序可用,功能强劲的轻型关系型数据库引擎。 SSL �C Secure Socket Layer用于保护网页通讯的协议。
Binder (IPC):提供有效率的程序间沟通管道(Inter-Process Communication)。Android 系统中有很多服务,而上层的应用程序经常要取用这些服务,一般的 Linux 系统已经提供了不少 IPC 的方式,不过 Android 还是搞了套自己的。虽说文件中解释原因为「一般 IPC 会造成额外资源花费,以及安全问题」,但其实这些都是可以基于原有架构在 kernel 外头解决的,为何要改在 kernel 里头,笔者对此存疑,也只能等找时间去研究程序代码才知了。
Power Management:与桌上型计算机或笔记型计算机不同,手持装置的电源一向相当有限,必须无所不用其极的去想办法省电,但又不损及顺畅的使用经验。Android 在此采取了颇为积极的作法:「没有人说要用,就关掉」。例如某程序在放 MP3 音乐,于是此程序会需要 CPU 的计算能力,那就得开口要。如果与此同时没其它程序在执行,那么 LCD 显示器就可能被关掉,藉以省电。另一特别处,是在于 Linux kernel 一般考虑的都是在计算机上的作法,所以多半只有进入暂停、休眠等等的选择,而不会如此细致的去控制到各个小装置的电源供应。
系统函式库
这里说的系统函式库是指 “native libraries”,是跑在系统里头的函式库,采用的语言不是 Java,提供一些基础建设。里头有几个值得一提的组件:
Bionic:这是 Android 版的 libc。libc 是 GNU/Linux 以及其它类似 Unix 系统上最基础的函式库,一般最常用的是 glibc,就是 GNU 做的 libc。不然在比较小型的装置上也可以用 uclibc。不论是 glibc or uclibc,版权都是LGPL (GPL 的略为弱化版)。看到这大概可以猜到了吧,又是 Copyleft 问题。官方的说法是,除了版权问题以外,还考虑必须轻量以及快速,所以才做了自己的 libc。不过轻量、快速,本来就是小型装置用的 uclibc 一开始的目标,因此,最主要的恐怕还是版权问题。
Webkit:鼎鼎大名的 Apple Safari 浏览器背后的引擎就是 Webkit,Android 也包含进去了。离线使用的 html 配上 html 5 的一些新发展,产生了各种有趣的可能,这部分值得另文介绍,这里就不再赘述。
Surface Flinger:提供把各种”surface”组合在一起的能力。在这里 surface 解释为程序想要显示在屏幕的东西,可能同一屏幕上有来自不同程序的内容,而这些内容有可能是 2D 显示或是 3D 显示等等之类。Surface flinger 就是把这些东西结合起来,一起送到屏幕上。目前程序代码还没公布,不过 2D 跟 3D 的混合显示一直都是问题,根本原因是我们通常告诉 3D 显示卡的东西都是一些「我要在哪里哪里画上什么形状,贴上某某材质然后旋转多少度」之类的事情,也就是说,我们并不知道最后显示出来会长什么样子,那是显示卡上头的 GPU 去算出来的。一般这些东西是显示在一个有装饰的窗口里头,这装饰通常是 2D 效果。接下来假定我们想要旋转这整个窗口,而且里头的东西还要继续动,那等于要随时把握 3D 窗口里的东西长什么样子,然后把它跟 2D 的窗口框框结合,然后再开始转动。目前在一般 GNU/Linux 上这件事情还没有处理的非常好,Android 怎么做,值得在程序代码公布之后注意。
硬件抽象层 (Hardware Abstraction Libraries):这就是前文所述的 userspace 驱动程序,如果想要将 Android 在某硬件平台上执行,基本上完成这些驱动程序就行了。其内定义了 Android 对各硬件装置例如显示芯片、声音、数字相机、GPS、GSM 等等的需求。
android的系统架构和其操作系统一样,采用了分层的架构。从架构图看,android分为四个层,从高层到低层分别是应用程序层、应用程序框架层、系统运行库层(包含系统库和Android运行库)和linux核心层。
- Applications
- Application Framework
- Libraries
- Android Runtime
- Linux Kernel
Android的中间件可以再细分出两层,底层是函数库(Library)和虚拟机(Virtual Machine; VM),上层为应用程序框架(Application Framework)。上面架构图中蓝色部分为Java语言开发,绿色部分为C/C++开发,红色的Kernel层为C开发,黄色部分为Dalvik VM部分。 以下分别介绍每一层的作用
- 应用程序层(Applications)
- 应用程序框架层(Application Framework)
- 函数库层(Libraries)
System C library �C 一个从 BSD 继承来的标准 C 系统函数库( libc ), 它是专门为基于 embedded linux 的设备定制的。 Media Libraries �C 基于 PacketVideo OpenCORE;该库支持多种常用的音频、视频格式回放和录制,同时支持静态图像文件。编码格式包括MPEG4, H.264, MP3, AAC, AMR, JPG, PNG 。 Surface Manager �C 对显示子系统的管理,并且为多个应用程序提 供了2D和3D图层的无缝融合。 LibWebCore �C 一个最新的web浏览器引擎用,支持Android浏览器和一个可嵌入的web视图。 SGL -底层的2D图形引擎。 3D Libraries -基于OpenGL ES 1.0 APIs实现;该库可以使用硬件 3D加速(如果可用)或者使用高度优化的3D软加速。 Free Type - 位图(bitmap)和矢量(vector)字体显示。 SQLite �C SQLite是一套开放源码的关系数据库,一个对于所有应用程序可用,功能强劲的轻型关系型数据库引擎。 SSL �C Secure Socket Layer用于保护网页通讯的协议。
- Android运行时库层(Android Runtime)
- 操作系统层(Linux Kernel)
Binder (IPC):提供有效率的程序间沟通管道(Inter-Process Communication)。Android 系统中有很多服务,而上层的应用程序经常要取用这些服务,一般的 Linux 系统已经提供了不少 IPC 的方式,不过 Android 还是搞了套自己的。虽说文件中解释原因为「一般 IPC 会造成额外资源花费,以及安全问题」,但其实这些都是可以基于原有架构在 kernel 外头解决的,为何要改在 kernel 里头,笔者对此存疑,也只能等找时间去研究程序代码才知了。
Power Management:与桌上型计算机或笔记型计算机不同,手持装置的电源一向相当有限,必须无所不用其极的去想办法省电,但又不损及顺畅的使用经验。Android 在此采取了颇为积极的作法:「没有人说要用,就关掉」。例如某程序在放 MP3 音乐,于是此程序会需要 CPU 的计算能力,那就得开口要。如果与此同时没其它程序在执行,那么 LCD 显示器就可能被关掉,藉以省电。另一特别处,是在于 Linux kernel 一般考虑的都是在计算机上的作法,所以多半只有进入暂停、休眠等等的选择,而不会如此细致的去控制到各个小装置的电源供应。
系统函式库
这里说的系统函式库是指 “native libraries”,是跑在系统里头的函式库,采用的语言不是 Java,提供一些基础建设。里头有几个值得一提的组件:
Bionic:这是 Android 版的 libc。libc 是 GNU/Linux 以及其它类似 Unix 系统上最基础的函式库,一般最常用的是 glibc,就是 GNU 做的 libc。不然在比较小型的装置上也可以用 uclibc。不论是 glibc or uclibc,版权都是LGPL (GPL 的略为弱化版)。看到这大概可以猜到了吧,又是 Copyleft 问题。官方的说法是,除了版权问题以外,还考虑必须轻量以及快速,所以才做了自己的 libc。不过轻量、快速,本来就是小型装置用的 uclibc 一开始的目标,因此,最主要的恐怕还是版权问题。
Webkit:鼎鼎大名的 Apple Safari 浏览器背后的引擎就是 Webkit,Android 也包含进去了。离线使用的 html 配上 html 5 的一些新发展,产生了各种有趣的可能,这部分值得另文介绍,这里就不再赘述。
Surface Flinger:提供把各种”surface”组合在一起的能力。在这里 surface 解释为程序想要显示在屏幕的东西,可能同一屏幕上有来自不同程序的内容,而这些内容有可能是 2D 显示或是 3D 显示等等之类。Surface flinger 就是把这些东西结合起来,一起送到屏幕上。目前程序代码还没公布,不过 2D 跟 3D 的混合显示一直都是问题,根本原因是我们通常告诉 3D 显示卡的东西都是一些「我要在哪里哪里画上什么形状,贴上某某材质然后旋转多少度」之类的事情,也就是说,我们并不知道最后显示出来会长什么样子,那是显示卡上头的 GPU 去算出来的。一般这些东西是显示在一个有装饰的窗口里头,这装饰通常是 2D 效果。接下来假定我们想要旋转这整个窗口,而且里头的东西还要继续动,那等于要随时把握 3D 窗口里的东西长什么样子,然后把它跟 2D 的窗口框框结合,然后再开始转动。目前在一般 GNU/Linux 上这件事情还没有处理的非常好,Android 怎么做,值得在程序代码公布之后注意。
硬件抽象层 (Hardware Abstraction Libraries):这就是前文所述的 userspace 驱动程序,如果想要将 Android 在某硬件平台上执行,基本上完成这些驱动程序就行了。其内定义了 Android 对各硬件装置例如显示芯片、声音、数字相机、GPS、GSM 等等的需求。
更多相关文章
- android基础知识15:获得android系统信息01—info类
- Android平板电脑上的APP应用程序设计须知
- android获取系统标准时区的时间
- Android 系统framework 概述
- 深入理解 Android消息处理系统的原理
- 使用html,javascript,css,phonegap创建开发android应用程序
- android系统定制从听说到入门二
- 最封闭的开源系统:Android
- Android主题和系统样式篇(下)