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 Flinger
Audio Flinger
本地system servers注册Service Manager作为IPC service目标:
System Service启动Android管理服务(framework层各种service和manager):
Android管理服务注册到Service Manager中:
到此,整个Android系统的启动后:
System Server加载完所有的services后, 系统准备 过程如下…
zygote生产出home的dalvik vm:
底层出现libc:
zygote逐个生产出dalvik vm:
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:
举例:MediaPlayer
增加ALSA?
丢弃了kernel driver?
Daemon Connection:
native service 被替换为 daemon, binder IPC 被替换为sockets方式,如下:
举例:RILD
Telephony Manager
(完)