本文主要介绍 Android 系统的启动过程,以 Androidinit 进程之后部分为主,init 之前部
分同标准 Linux 内核启动完全相同。于 Android 启动过程复杂,涉及 C、C++及 java 部分内
容,本文以流程分析为主线旨在让大家在分析 Android 系统时有个清晰的思路。鉴于本人水
平有限,如有阐述不正之处,还请不吝指正,感激不尽!
系统启动大致可分为一下几个阶段:
� bootloader---初始化、从 Flash 读取 Kernel 镜像及一些必须的配置信息,引导
kernel 启动
� linuxkernel 启动 linux 内核
� init 进程启动
� init 进程读取 init.rc 启动必要的 daemon 程序,如:adbd、vold、netd、等
� init 进程启动 servicemanager---随后详细分析其过程
� init 进程启动 zygote ---随后详细分析其过程
� JAVA 部分的 Service 启动
� init 进程启动 mediaserver---多媒体本地服务启动
本文主要分析 android 部分的启动,涉及范围为 servicemanager 启动到 android 系统的
Java 部分的 Service;
1、servicemanager 启动
首先看 init.rc 中的 servicemanager 启动命令如下:
serviceservicemanager /system/bin/servicemanager
其执行源码位于:frameworks/base/cmds/servicemanager
文件:Android.mk bctest.c binder.c binder.h service_manager.c
<span style="font-size:18px;">service_manager.c main 函数:
struct binder_state
{
int fd;
void *mapped;
unsigned mapsize;
};
#define BINDER_SERVICE_MANAGER ((void*) 0)
int main(int argc, char **argv)
{
struct binder_state *bs;
void *svcmgr = BINDER_SERVICE_MANAGER;
bs = binder_open(128*1024);
//打开 binder 设备,执行 binder 相应的初始化,构建一个 binder_state 对象
if (binder_become_context_manager(bs)) {
//将这个 binder_state 设置为 manger,整个系统仅此一个 manger
LOGE("cannot become context manager (%s)", strerror(errno));