注:以下所有内容为博主参考网上文章和Android源码4.0.3,结合自己的理解。如有错误,请各位不吝赐教。
参考:http://blog.csdn.net/linweig/article/details/5047917
Android的启动过程大致分为四个步骤:init进程启动、native服务启动、SystemServer(Android服务)启动、Home启动。下面逐一介绍。
一 init进程启动:
init进程启动,主要就是执行system/core/init下的init.c文件。这个文件的主要功能是根据init.rc和init.xxx.rc(xxx与硬件平台有关)脚本文件建立基本服务(最重要的是ServiceManager和zygote),将service信息防止在service列表中,启动服务。
1.清零umask。umask用于设置用户创建文件的默认权限(用权限的补码设置)
2.为root fs建立必要的文件夹,并挂载适当的分区。例如mkdir("/dev",0755)等。
3.初始化log系统。
4.解析/init.rc文件,将所有服务和操作信息加入链表。
5.从/proc/cmdline中提取信息内核启动参数,保存至全局变量。从全局变量中获取硬件信息。
6.解析/init.(硬件).rc文件,将相关服务和操作信息加入链表。
7.执行4、6的early-init操作
8.初始化属性服务系统。
9.执行4、6的init操作。
10.开启属性服务
11.创建信号机制
12.执行early-boot和boot
13.执行property action
14.如果支持BOOTCHART,初始化之
15.进入主进程循环
(1)查询action队列,执行action
(2)重启需要重启的服务
(3)轮询时间:signal、property、keychoral等
二 native服务启动:zygote
在上一过程init进程启动中,解析了rc文件。rc文件中有这么一条命令:
service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server
这条命令的意思是:执行/system/bin/app_process命令来启动zygote服务。
zygote服务运行起来,才真正进入了Android的运行空间。zygote从framework/base/cmds/app_process/app_main.cpp的main开始:
1.建立java runtime
2.runtime.start() 运行base/core/java/com/Android/internal/os/ZygoteInit中的main函数,这时候zygote才真正开始:
(1)装载ZygoteInit
(2)注册socket等级listen端口
(3)preload装载资源
(4)startSystemServer()开启服务
-forkSystemServer创建SystemServer.java
三 SystemServer
上一过程的SystemServer.java是在zygote上fork的进程,位置在base/services/java,这个SystemServer是Android的所有服务循环框架。
在SystemServer的main中,执行init1(). init1()在哪里?在base/services/jni/com_android_server_SystemServer.cpp中,将名字init1指向android_server_SystemServer_init1函数,这个函数只执行了一个动作——system_init().
system_init()在哪里?在/base/cmds/system_server/library/system_init.cpp文件中。这个函数发起了一系列服务后,又开启了init2.
init2建立线程。在线程中启动所有的JAVA服务:
-core服务:电源管理、活动服务、电话注册、包管理器...
-其他服务:状态服务、硬件服务...
四 Home启动
在上一过程的最后,线程运行的过程中,add了众多service建立服务。之后使用servicenamexxx.systemReady()通知各个服务,系统已经就绪。特别地,ActivityManagerService.self().systemReady()启动了CATEGORY_HOME,启动第一个activity。ActivityManagerService.self().systemReady()在/services/java/com/android/server/am/ActivityManagerServer.java中。
至此,android home启动。系统启动完毕。