您的位置:首页 > 移动开发 > Android开发

Android 系统启动流程学习笔记

2017-09-13 11:42 429 查看
参看地址: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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android