android的启动过程

注:以下所有内容为博主参考网上文章和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启动。系统启动完毕。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值