Android剖析和运行机制

大纲:

1.Android剖析

            Linux内核本地库(Native Libraries)

            Android运行时(Android Runtime)

            应用框架

            应用层

2. Android运行机制

            启动流程和层间交互(Layer Interaction)

一、 Android剖析

如下图所示为Android的架构图

1. Linux内核

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

1) 为什么选择Linux内核? 强大的内核和进程管理。基于权限的安全模型。可靠的驱动模型。支持共享库。已经是开源的。

2)内核增强 AlarmAshmemBinderPower ManagementLow Memory KillerKernel DebuggerLoggerBinder介绍问题: 应用和服务会运行在各自的进程当中,而进程之间必须要通信和共享数据。而IPC(进程间通信)会引入巨大的处理开销和安全漏洞

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

Binder的实现机制如下图所示:

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

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

解决方法: 基于Linux的功率管理(PM)构建更加强大的功率管理策略通过“wake locks”来进行功率管理支持不同类型的wake locks Android中的PM实现: 如下图中所示

Android内核源码可以通过如下https://git.android.com获取

2 本地库

本地库包括: Bionic LibcFunction LibrariesNative ServersHardware Abstraction Libraries

什么是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来进行编译。

功能库(Function Libraries) WebKit 基于开源的WebKit浏览器:https://www.webkit.org在全视图渲染页完全支持CSSJavascript,DOM,AJAX支持单列和自适应的视图渲染 Media Framework 基于PacketVideo OpenCORE平台支持标准的video,audio,still-frame格式支持硬件/软件编码器插件

SQLite 轻量级事务性数据存储大多数平台的后端数据存储

Native Servers

主要有两大类Surface Flinger和Audio Flinger 对于Surface Flinger 提供系统范围的外观“组合器”,处理所有的外观渲染到帧buffer设备中。可以结合2D与3D外观和多个应用的外观。Surfaces传递是作为Buffer来通过Binder IPC调用。可以使用OpenGL ES和2D硬件加速器作为其组成部分。使用page-flip的双buffer机制。 如下图展示所示

对于Audio Flinger 管理所有的audio输出设备。处理多个audio流到PCM audio 输出路径。处理audio路由到各个输出。 如下图示意

硬件抽象层(HAL) 硬件抽象层在Android系统层次结构中的位置如下图所示。

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

那么为什么在Android中需要一个用户空间的HAL呢?主要有如下原因: 不是所有的组件具有标准的内核驱动接口;内核驱动是GPL的,其将暴露了所有的知识产权;Android对于硬件驱动具有特定的要求。

HAL Header例子:

?

1

2

3

4

5

6

7

8// must be provided by each Acme hardware implementation

typedef struct {

int(*foo)(void);

char(*bar)(void);

} AcmeFunctions;

constAcmeFunctions *Acme_Init(conststruct Env *env,intargc,char

**argv);

库在runtime时按需动态加载

?

1

2

3

4

5

6dlHandle = dlopen(“/system/lib/libacme.so”, RTLD_NOW);

...

acmeInit = (constAcmeFunctions *(*)(conststruct Env *,

int,char**))dlsym(dlHandle, ”Acme_Init);

...

acmeFuncs = acmeInit(&env, argc, argv);

3.Android Runtime

Dalvik虚拟机是Android中定制的净化实现的虚拟机,由于如下特点: 提供了应用程序的可移植性和运行时的一致性运行优化的文件格式(.dex)和Dalvik字节Java .class/ .jar文件在构建时转换为.dex格式 Dalvik设计用于嵌入式环境 在每个设备上支持多个虚拟机进程;高度优化CPU的字节码解释器;高效的使用runtime内存。

核心库(Core Libraries) Java语言的Core APIs提供了功能强大的,同时简单和熟悉的开发平台。 数据结构(Data Structure)工具(Utilities)文件访问(File Access)网络访问(Network Access)图形(Graphics)...

4. 应用框架(Application Frameworks)

核心平台服务(Core Platform Services),具有如下特性: 对于Android平台来说,服务(Services)是必需的。在幕后 —— 应用不会直接访问它们。 主要有如下的服务: Activity ManagerPackage ManagerWindow ManagerResource ManagerContent ProviderView System

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

?

1

LocationManager lm = (LocationManager)Context.getSystemService(Context.LOCATION_SERVICE);

主要有如下的硬件服务: Telephony ServiceLocation ServiceBluetooth ServiceWIFI ServiceUSB ServiceSensor Service 更多的关于应用框架的信息参考: Google I/O :“Inside the Androoid Application Framework”Online :https://code.google.com/android

二、Android运行机制1. 启动流程所有从init开始...

与大多数的基于Linux系统在启动阶段类似,bootLoader加载Linux内核,然后开始init进程。

init启动Linux守护进程,包括: USB守护进程(usbd)来管理USB连接Android调试桥守护进程(adbd)来管理ADB连接调试器守护进程(debuggerd)来管理调试进程请求(dump memory等等)射频接口层守护进程(rild)来管理与射频的通信

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

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

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

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

System Service启动本地系统服务器,包括: Surface FlingerAudio Flinger

本地system servers注册Servicee Manager作为IPC service目标:

System Service启动Android管理服务:

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

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

System Server加载完所有的services后, 系统准备...

2. 层间交互(Layer Interaction)主要有如下三种类型的交互: App -> Runtime Service -> libApp -> Runtime Service -> Native Service -> libApp -> Runtime Service -> Native Daemon -> lib

Android Runtime Services:

举例:Location Manager

Android Native Services:

举例:

Daemon Connection:

举例:RILD

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,185评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,445评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,684评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,564评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,681评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,874评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,025评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,761评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,217评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,545评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,694评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,351评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,988评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,778评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,007评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,427评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,580评论 2 349

推荐阅读更多精彩内容