系统启动篇

概述:

如上图所示:

Android 的启动流程如下:

Step1: 

boot rom 主要作用当电源按下时引导芯片代码开始从预定义的地方(固化在ROM)开始执行。加载引导程序Bootloader到RAM,然后执行。

Step2:

boot loader 分2步执行,Bootloader是引导程序BootLoader是在Android操作系统开始运行前的一个小程序,它的主要作用是把系统OS拉起来并运行。设备制造商要么使用流行的引导加载程序,如redboot,uboot, qi引导加载程序,要么开发自己的引导加载程序,这不是Android操作系统的一部分。bootloader是原始设备制造商和芯片原厂设置锁和限制的地方。

Bootloader的执行分为两个阶段,第一个阶段是检测外部RAM,第二个阶段是帮助加载程序,在第二个阶段Bootloader在运行内核的时候设置网络、内存等,Bootloader可以指定内核的配置参数或输入。

源码:<Android Source>\bootable/bootloader

Step3:

android Kernel启动过程与标准linux类似,完成内存子系统、保护模式、任务调度系统、驱动子系统、设备系统、文件系统等的初始化,最后运行第一个应用程序init. 与标准系统有所不同的是,android的内核增加了部分驱动及补丁。当内核完成系统设置,它首先在系统文件中寻找”init”文件。

Step4:

init是第一个进程,我们可以说它是root进程或者所有进程的父进程。init进程有两个责任,一是挂载目录,比如/sys、/dev、/proc,二是运行init.rc脚本。

init进程可以在/system/core/init找到。

init.rc文件可以在/system/core/rootdir/init.rc找到。

readme.txt可以在/system/core/init/readme.txt找到。

对于init.rc文件,Android中有特定的格式以及规则。在Android中,我们叫做Android初始化语言。Android初始化语言由四大类型的声明组成,即Actions(动作)、Commands(命令)、Services(服务)、以及Options(选项)。

Action(动作):动作是以命令流程命名的,有一个触发器决定动作是否发生。

Service(服务):服务是init进程启动的程序、当服务退出时init进程会视情况重启服务。

Options(选项):选项是对服务的描述。它们影响init进程如何以及何时启动服务。

在这个阶段你可以在设备的屏幕上看到“Android”logo了。

详细了解链接:https://mp.csdn.net/console/editor/html/104925406

Step5:

在Java中,我们知道不同的虚拟机实例会为不同的应用分配不同的内存。假如Android应用应该尽可能快地启动,但如果Android系统为每一个应用启动不同的Dalvik虚拟机实例,就会消耗大量的内存以及时间。因此,为了克服这个问题,Android系统创造了”Zygote”。Zygote是一个虚拟机进程,正如我们在前一个步骤所说的在系统引导的时候启动。Zygote预加载以及初始化核心库类。通常,这些核心类一般是只读的,也是Android SDK或者核心框架的一部分。

Android所有的应用程序包括system系统进程 都是zygote进程负责创建,因此zygote进程也被称为进程孵化器,它创建进程是通过复制自身来创建应用进程,Zygote让Dalvik虚拟机共享代码、低内存占用以及最小的启动时间成为可能,它在启动过程中会在内部创建一个虚拟机实例,所以通过复制zygote进程而得到的应用进程和系统服务进程都可以快速地在内部的获得一个虚拟机实例拷贝。

    创建JVM并注册JNI,创建服务端的socket,通过socket通信,启动systemServer。

Zygote加载进程

加载ZygoteInit类,源代码:/frameworks/base/core/java/com/android/internal/os/ZygoteInit.java

1.创建AppRuntime并调用其start方法,启动Zygote进程。

2.创建JavaVM并为JavaVM注册JNI.

3.通过JNI调用ZygoteInit的main函数进入Zygote的Java框架层。

4.通过registerZygoteSocket函数创建服务端Socket,并通过runSelectLoop函数等待ActivityManagerService的请求。

5.启动SystemServer进程。

在这个阶段,你可以看到启动动画。

详细讲解链接:https://mp.csdn.net/console/editor/html/104966884

Step6:

完成了上面几步之后,运行环境请求Zygote运行System Server。启动Binder线程池和SystemServiceManager,systemServiceManger主要是对系统服务进行创建、启动和生命周期管理,就会启动各种系统服务,系统服务可以认为是一个进程。同一个系统服务在Android SDK可以以System Services形式获得。系统服务包含了所有的System Services。

Zygote创建新的进程去启动系统服务。你可以在ZygoteInit类的”startSystemServer”方法中找到源代码。

核心服务:

启动电源管理器;创建Activity管理器;启动电话注册;启动包管理器;设置Activity管理服务为系统进程;启动上下文管理器;启动系统Context Providers;启动电池服务;启动定时管理器;启动传感服务;启动窗口管理器;启动蓝牙服务;启动挂载服务。

其他服务:

启动状态栏服务;启动硬件服务;启动网络状态服务;启动网络连接服务;启动通知管理器;启动设备存储监视服务;启动定位管理器;启动搜索服务;启动剪切板服务;启动登记服务;启动壁纸服务;启动音频服务;启动耳机监听;启动AdbSettingsObserver(处理adb命令)。

详细讲解链接:https://mp.csdn.net/console/editor/html/105087436

Step7:

Launcher组件是由之前启动的systemServer所启动的ActivityManagerService启动,

这也是andorid系统启动的最后一步,launcher是andorid系统home程序,主要是用来显示系统中已安装的应用程序。    launcher应用程序的启动会通过请求packageManagerService返回系统中已经安装的应用信息,并将这些应用信息通过封装处理成快捷列表显示在系统屏幕上,这样咱们就可以单击启动它们。
被SystemServer进程启动的ActivityManagerService会启动Launcher,Launcher启动后会将已安装应用的快捷图标显示到界面上。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值