Android运行机制

1、 Android平台各层html

Android平台架构图,以下图:由上到下依次为应用程序、应用程序框架、库、Android运行时、Linux内核。java

\

 

一、Linux内核:android

 Android系统基于Linux内核,可是Android不是Linux。没有本地的窗口系统。没有glibc库的支持。不包括完整的标准Linux工具集。标准的Linux 2.6.24内核。内核加强补丁来支持Android。git

\


(1) Linux内核具备强大的内核和进程管理。基于权限的安全模型。可靠的驱动模型。支持共享库。已是开源的。 数据库

(2)内核加强: Alarm, Ashmem, Binder, Power Management, Low Memory Killer, Kernel Debugger, Logger 后端

Binder(IPC)驱动介绍浏览器

问题: 应用和服务会运行在各自的进程当中,而进程之间必需要通讯和共享数据。而IPC(进程间通讯)会引入巨大的处理开销和安全漏洞。 安全

解决方法: 使用驱动来协助进程间通讯(IPC)。经过共享内存来得到高性能。对于处理请求,每一个进程一个线程池。引用计数,对象的引用是跨进程映射的。进程之间是同步调用。 服务器

Binder的实现机制以下图所示: 网络

\

Android的接口定义语言(AIDL)见:http://developer.android.com/guide/components/aidl.html

PowerManager介绍

问题: 移动设备是依赖电池供电来运行的,电池只有有限的容量。

解决方法: 基于Linux的功率管理(PM)构建更增强大的功率管理策略经过"wake locks"来进行功率管理支持不一样类型的wake locks。

Android中的PM实现: 以下图中所示

\
Android内核源码能够经过以下http://git.android.com获取

2 、本地库

本地库包括: Bionic Libc,  Function Libraries,  Native Servers,  Hardware Abstraction Libraries

(1)Bionic:定制的libc实现,优化用于嵌入式。

为何选用Bionic? 为何要构建一个定制的libc库呢?

主要从以下方面考虑:

许可证:从用户角度,保持GPL许可。

大小:因为将加载到各个进程,因此须要比较小。

速率:有限的CPU能力意味着咱们须要足够的快。

对于Bionic libc: BSD许可小而快的代码路径很是快和小的定制的pthread实现内置支持重要的特定Androud服务,像

1)系统属性,getprop(my.system.property, buff, default);

2)log能力,LOGI(Logging a message with priority 'Info' );不支持某些POSIX特性。与GNU Libc(glibc)不兼容。因为Native代码必须依赖bionic来进行编译。

(2)功能库(Function Libraries)

[1]WebKit :基于开源的WebKit浏览器:在全视图渲染页彻底支持CSS,Javascript,DOM,AJAX支持单列和自适应的视图渲染 。

[2]Media Framework: 基于PacketVideo公司的OpenCORE平台。支持多种音频、视频、图像文件。

[3]SQLite:轻量级事务性数据存储,是大多数平台的后端数据存储 ,是轻量级关系数据库引擎。

(3)Native Servers 主要有两大类Surface Flinger(Surface Manager)和Audio Flinger (Audio Manager)

[1]Surface Flinger:提供系统范围的外观“组合器”,处理全部的外观渲染到帧buffer设备中。能够结合2D与3D外观和多个应用的外观。Surfaces传递是做为Buffer来经过Binder IPC调用。可使用OpenGL ES和2D硬件加速器做为其组成部分。使用page-flip的双buffer机制。

管理多个应用程序同时执行,各个应用程序之间的显示与存取,而且为多个应用程序提供2D和3D图层的无缝融合。

以下图展现所示

\
[2]Audio Flinger: 管理全部的audio输出设备。处理多个audio流到PCM audio 输出路径。处理audio路由到各个输出。

以下图示意

\

(4)硬件抽象层(Hardware Abstraction Libraries,HAL) ,在Android系统层次结构中的位置,以下图所示。

\

该层具备以下特色: 用户空间C/C++库层。定义了接口,以便让Android请求硬件“驱动”来实现。分离了Android平台逻辑和硬件接口。

那么为何在Android中须要一个用户空间的HAL呢?

主要有以下缘由: 不是全部的组件具备标准的内核驱动接口;内核驱动是GPL的,其将暴露了全部的知识产权;Android对于硬件驱动具备特定的要求。 HAL Header例子:

// must be provided by each Acme hardware implementation
typedef struct {
    int (*foo)( void );
    char (*bar)( void );
    …
} AcmeFunctions;
const AcmeFunctions *Acme_Init(const struct Env *env, int argc, char
**argv);

 库在runtime时按需动态加载

dlHandle = dlopen(“/system/lib/libacme.so”, RTLD_NOW);
...
acmeInit = (const AcmeFunctions *(*)(const struct Env *, 
int, char **))dlsym(dlHandle, ”Acme_Init);
...
acmeFuncs = acmeInit(&env, argc, argv);

3.Android Runtime(Android运行时)

(1)  核心库(Core Libraries):包括Java语言所须要的基本函数以及Android的核心库。与标准Java不同的是,系统为每一个应用程序提供单独的Dalvik虚拟机执行,即每一个应用程序拥有本身单独的线程。Java语言的Core APIs提供了功能强大的,而且简单和熟悉的开发平台。数据结构(Data Structure)工具(Utilities)文件访问(File Access)网络访问(Network Access)图形(Graphics)...

(2)Dalvik虚拟机: 是Android中定制的净化实现的虚拟机。大多数虚拟机(包括JVM)都是基于栈的,Dalvik虚拟机是基于寄存器的。

因为以下特色:

[1]提供了应用程序的可移植性和运行时的一致性;

[2]运行优化的文件格式(.dex)和Dalvik字节;

[3]Java .class/ .jar文件在构建时转换为.dex格式 ;

[4]Dalvik设计用于嵌入式环境;

[5]在每一个设备上支持多个虚拟机进程;

[6]高度优化CPU的字节码解释器;

[7]高效的使用runtime内存。

4. 应用框架(Application Frameworks)

对于开发人员来说,接触最多的便是该层。

(1)核心平台服务(Core Platform Services)

具备以下特性: 对于Android平台来讲,服务(Services)是必需的。在后台 —— 应用不会直接访问它们。

主要平台服务: Activity Manager,Package Manager,Window Manager,Resource Manager,Content Providers,View System

(2)硬件服务(Hardware Services) 提供访问底层的硬件APIs。典型地经过局部的Manager对象来访问。

例如:LocationManager lm = (LocationManager)Context.getSystemService(Context.LOCATION_SERVICE);

主要硬件服务: Telephony Service,Location Service,Bluetooth Service,WIFI Service,USB Service,Sensor Service
更多的关于应用框架的信息参考: Google I/O :“Inside the Androoid Application Framework”Online :http://code.google.com/android

五、Applications(应用程序层)

本层全部应用程序都用java编写,通常状况下,不少应用程序都是在同一系列的核心应用程序包中一块儿发布的。

主要包括:拨号程序、浏览器、音乐播放器、通信录等等。该层的程序是彻底平等的,开发人员可任意将自带应用程序替换为本身的应用程序。

2、Android运行机制

1. 启动流程 全部从"init"开始... 与大多数的基于Linux系统在启动阶段相似,bootLoader加载"Linux内核",而后开始"init"进程。 \
(1)init启动Linux守护进程,包括:

[1]USB守护进程(usbd):来管理USB链接Android调试桥守护进程;

[2]adbd:来管理ADB链接调试器守护进程;

[3]debuggerd:来管理调试进程请求(dump memory等等);

[4]射频接口层守护进程(rild):来管理与射频的通讯。

\

(2)Init进程启动zygote进程: 一个新生的进程初始化一个Dalvik VM(虚拟机)实例加载类,并监听socket端口用于请求建立VMs实例Forks请求建立VM实例用于管理进程写时复制(Copy-on-write)来最大化重用和最小化覆盖

\

(3)init进程启动runtime进程: 初始化Service Manager——上下文管理器用于binder来处理service注册和查询注册Service Manager做为缺省的上下文管理用于Binder

\

(4)Runtime进程发送请求给Zygote来启动System Service

\

(5)接着Zygote进程fork一个新的VM实例用于System Service进程,而后启动该service。

\

(6)System Service启动本地系统服务器,包括: Surface Flinger,Audio Flinger

\

(7)本地system servers注册Servicee Manager做为IPC service目标:

\

(8)System Service启动Android管理服务:

\

(9)Android管理服务注册到Service Manager中:

\

(10)到此,整个Android系统的启动后:

\

(11)System Server加载完全部的services后, 系统准备...

\
\
\
\

2. 层间交互(Layer Interaction)

主要有以下三种类型的交互:

App -> Runtime Service -> lib;

App -> Runtime Service -> Native Service -> lib;

App -> Runtime Service -> Native Daemon -> lib 。

Android Runtime Services:

\

举例:Location Manager

\

Android Native Services:

\

举例:

\
\
\

Daemon Connection:

\

举例:RILD

\

相关文章
相关标签/搜索