Android 系统启动流程学习笔记

来源:互联网 发布:javascript难学吗 编辑:程序博客网 时间:2024/06/02 04:40

参看地址:http://blog.jobbole.com/67931/
http://blog.csdn.net/maxleng/article/details/5508372

第一步:启动电源以及系统启动

当电源按下,引导芯片代码开始从预定义的地方 Boot ROM 开始执行。加载引导程序到RAM,然后执行。

第二步:引导程序(Boot Loader)启动

Boot Loader 引导程序是在Android操作系统开始运行前的一个小程序。引导程序是运行的第一个程序,引导程序分两个阶段执行。第一个阶段,检测外部的RAM以及加载对第二阶段有用的程序;第二阶段,引导程序设置网络、内存等等。

第三步:内核启动

内核启动时,设置缓存、被保护存储器、计划列表,加载驱动。当内核完成系统设置,它首先在系统文件中寻找”init”文件,然后启动root进程或者系统的第一个进程。在这个阶段可以在设备的屏幕上看到“Android”logo。

第四步:init 进程启动

init是第一个进程,是root进程或者所有进程的父进程。init进程有两个责任,一是挂载目录,比如/sys、/dev、/proc,二是运行init.rc脚本。
init.rc文件 运行了系统所需的各类 Action 和 Services,启动zygote作为应用进程。

第五步:Zygote加载进程

Zygote让Dalvik虚拟机共享代码、低内存占用以及最小的启动时间成为可能。Zygote是一个虚拟器进程。
1.加载ZygoteInit类,源代码:/frameworks/base/core/java/com/android/internal/os/ZygoteInit.java
2.registerZygoteSocket()为zygote命令连接注册一个服务器套接字。
3.preloadClassed “preloaded-classes”是一个简单的包含一系列需要预加载类的文本文件,你可以在/frameworks/base找到“preloaded-classes”文件。
4.preloadResources() preloadResources也意味着本地主题、布局以及android.R文件中包含的所有东西都会用这个方法加载。
在这个阶段,你可以看到启动动画。

第六步:系统服务或进程

运行环境请求Zygote运行系统服务。系统服务同时使用native以及java编写,系统服务可以认为是一个进程。同一个系统服务在Android SDK可以以System Services形式获得。系统服务包含了所有的System Services。

核心服务:

1.启动电源管理器;
2.创建Activity管理器;
3.启动电话注册;
4.启动包管理器;
5.设置Activity管理服务为系统进程;
6.启动上下文管理器;
7.启动系统Context Providers;
8.启动电池服务;
9.启动定时管理器;
10.启动传感服务;
11.启动窗口管理器;
12.启动蓝牙服务;
13.启动挂载服务。

其他服务:

1.启动状态栏服务;
2.启动硬件服务;
3.启动网络状态服务;
4.启动网络连接服务;
5.启动通知管理器;
6.启动设备存储监视服务;
7.启动定位管理器;
8.启动搜索服务;
9.启动剪切板服务;
10.启动登记服务;
11.启动壁纸服务;
12.启动音频服务;
13.启动耳机监听;
14.启动AdbSettingsObserver(处理adb命令)。
初始化建立的Service都是Navtive service.在.rc脚本文件中zygote的描述:

service zygote /system/bin/app_process -Xzygote /system/bin –zygote –start-system-server
(1) main(…)@frameworks/base/cmds/app_main.cpp

建立Java Runtime
runtime.start(“com.android.internal.os.ZygoteInit”, startSystemServer);

(2) runtime.start@AndroidRuntime.cpp

建立虚拟机
运行:com.android.internal.os.ZygoteInit:main函数。

(3)main()@com.android.internal.os.ZygoteInit//正真的Zygote。

registerZygoteSocket();//登记Listen端口
startSystemServer();
进入Zygote服务框架。利用Socket通讯,接收ActivityManangerService的请求,Fork应用程序

第七步:System Server

Android的所有服务循环框架都是建立SystemServer,在init2的实现函数,建立各种服务,并AddService到service Manager。
在system_init()我们看到了循环闭合管理框架。
{
Call “com/android/server/SystemServer”, “init2”
…..
ProcessState::self()->startThreadPool();
IPCThreadState::self()->joinThreadPool();
}
init2() SystemServer.java中建立了Android中所有要用到的服务。

这个init2()建立了一个线程,来New Service和AddService来建立服务。

第八步:Home启动

在ServerThread SystemServer.java后半段,我们可以看到系统在启动完所有的Android服务后,做了这样一些动作:
(1) 使用xxx.systemReady()通知各个服务,系统已经就绪。
(2)特别对于ActivityManagerService.systemReady(回调)
Widget.wallpaper,imm(输入法)等ready通知。
Home就是在ActivityManagerService.systemReady()通知的过程中建立的。下面是ActivityManagerService.systemReady()的伪代码:
ActivityManagerService.java 中的 systemReady()
调用resumeTopActivityLocked();
startHomeActivityLocked();//启动第一个HomeActivity
startActivityLocked();//发送CATEGORY_HOME

原创粉丝点击