Android运行机制
一、 Android平台各层
Android平台架构图,如下图:由上到下依次为应用程序、应用程序框架、库、Android运行时、Linux内核。
1、Linux内核:
Android系统基于Linux内核,但是Android不是Linux。没有本地的窗口系统。没有glibc库的支持。不包括完整的标准Linux工具集。标准的Linux 2.6.24内核。内核增强补丁来支持Android。
(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);
5、Applications(应用程序层)
本层所有应用程序都用java编写,一般情况下,很多应用程序都是在同一系列的核心应用程序包中一起发布的。
主要包括:拨号程序、浏览器、音乐播放器、通讯录等等。该层的程序是完全平等的,开发人员可任意将自带应用程序替换为自己的应用程序。
二、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
Android运行机制的更多相关文章
- Android剖析和运行机制
Android剖析和运行机制 大纲: 1. Android剖析 Linux内核本地库(Native Libraries)Android运行时(Android Runtime)应用框架 2. Andro ...
- Android艺术——探究Handler运行机制
我们从开发的角度来说,Handler是Android 的消息机制的上层接口.说到Handler,大家都会说:哦,Handler这个我知道干什么的,更新UI.没错,Handler的确是用于更新UI的,具 ...
- Android广播机制的深入学习
部分内容转载自http://www.cnblogs.com/lwbqqyumidi/p/4168017.html 1.Android广播机制概述 Android广播分为两个方面:广播发送者和广播接收者 ...
- Android签名机制
Android APK 签名比对 发布过Android应用的朋友们应该都知道,Android APK的发布是需要签名的.签名机制在Android应用和框架中有着十分重要的作用. 例如,Android系 ...
- (转)Android消息处理机制(Handler、Looper、MessageQueue与Message)
转自 http://www.cnblogs.com/angeldevil/p/3340644.html Android消息处理机制(Handler.Looper.MessageQueue与Messag ...
- Android消息机制
每一个Android应用在启动的时候都会创建一个线程,这个线程被称为主线程或者UI线程,Android应用的所有操作默认都会运行在这个线程中. 但是当我们想要进行数据请求,图片下载,或者其他耗时操作时 ...
- Android总结篇系列:Android广播机制
1.Android广播机制概述 Android广播分为两个方面:广播发送者和广播接收者,通常情况下,BroadcastReceiver指的就是广播接收者(广播接收器).广播作为Android组件间的通 ...
- PULL解析XML的运行机制详解
PULL解析简单易上手,基本上看一遍,基本上就会解析啦,但总是感觉对PULL解析的运行机制不是很了解,就总结了以下事件驱动到底是怎么执行的.. PULL: Android内置了PULL解析器.PULL ...
- 理解Android安全机制
本文从Android系统架构着手,分析Android的安全机制以SE Android,最后给出一些Android安全现状和常见的安全解决方案. 1.Android系统架构 Android采用分层的系统 ...
随机推荐
- bzoj 1875: [SDOI2009]HH去散步 -- 矩阵乘法
1875: [SDOI2009]HH去散步 Time Limit: 20 Sec Memory Limit: 64 MB Description HH有个一成不变的习惯,喜欢饭后百步走.所谓百步走, ...
- Vue 生命周期方法
一.Vue 生命周期 Vue的生命周期即是实例从创建到销毁的一个过程.之前在学习Vue的时候,看过官网的教程,但是经常用到的是mounted,所以对其他生命周期方法不是很熟悉,这里有空做个总结,也方便 ...
- 最小生成树-普利姆算法eager实现
算法描述 在普利姆算法的lazy实现中,参考:普利姆算法的lazy实现 我们现在来考虑这样一个问题: 我们将所有的边都加入了优先队列,但事实上,我们真的需要所有的边吗? 我们再回到普利姆算法的lazy ...
- oracle中的术语
数据库:数据库是实实在在存在的文件,一个数据库文件体系中大致包含(数据文件DBF.控制文件CTL.日志文件LOG) 数据库实例:每个数据库都会有一个数据库实例与之对应,外界环境要通过与数据库实例的交互 ...
- Material Design(原质化设计)视觉设计语言规范 踏得网镜像
Android 5.0 Lollipop(棒棒糖,也就是之前的代称Android L)全面实践了谷歌最新研发的 Material Design 设计语言规范,只是该设计规范并不是仅针对移动平台. 我们 ...
- 不知道如何处理的Windows Phone异常
后台收到这么一段异常信息,从下文中看是SQL Server Compact database出错了,但怎么出错的,为什么会出错,如何避免? 没有一点办法,如果您fix过这种问题,恳请指点迷津,谢谢! ...
- 新浪行情 vb代码
Sub 新浪行情() Cells.Clear Dim n As Integer, Js As Object Dim i As Integer, j As Integer, m As Integer, ...
- 《Windows核心编程》第3章——handle复制相关实验
先写一个程序,用来查看进程的内核对象,这样我们就能比较子进程是否继承了父进程的某个句柄: #include <windows.h> #include <stdio.h> #de ...
- Lucene TFIDF打分公式
还没读TFIDFSimilarity的代码,读了一下lucene的文档,没有特复杂,感觉还是非常严谨的. 对于查询q和文档d,如果查询为纯token查询,套用向量空间模型(VSM),相似度度量使用余弦 ...
- 简明python教程 --C++程序员的视角(五):面向对象的编程
面向对象的编程 在大多数时候你可以使用过程性编程,但是有些时候当你想要编写大型程序或是寻求一个更加合适的解决方案的时候,你就得使用面向对象的编程技术. 对象可以使用普通的属于对象的变量存储数据.属于一 ...