Android系统启动流程

移动开发 创建于:2022-01-15

文章目录

目录

前言

一、引导程序BootLoader

二、Linux内核启动

三、init进程启动

四、Zygote进程启动

五、Android桌面启动

总结


前言

Android系统是怎么启动的?用过手机的都知道长按电源键就可以了,过程可以说很简单,一台手机从按下电源键到显示品牌logo,再到进入系统桌面,整个启动流程就完成了,但这只是我们看到的现象,其背后到底经历了什么呢?本文就来分析下这看似简单的启动流程。


一、引导程序BootLoader

当电源键按下时引导代码会从预定义的ROM里开始执行,加载引导程序BootLoader到RAM里并执行。

BootLoader是系统内核启动之前运行的一小段程序,相当于windows系统的BIOS,用来引导操作系统启动,主要是检查RAM、初始化参数、跳转到内核等。

二、Linux内核启动

BootLoader会启动安卓的第一个进程idle进程(pid=0),也称为swapper进程,用来初始化进程管理、内存管理、加载Display,Camera Driver,Binder Driver等相关工作;

idle会通过fork创建kthreadd进程(pid=2)和init进程(pid=1),kthreadd进程是Linux的内核进程,会创建内核工作线程kworkder,软中断线程ksoftirqd,thermal等内核守护进程,kthreadd进程是所有内核进程的鼻祖。 

三、init进程启动

init进程是由idle通过fork创建的,它是Android系统中用户空间的第一个进程,是Linux系统的守护进程,是所有用户空间进程的鼻祖

init进程会fork出ueventd、logd、healthd、installd、adbd、lm这里写代码片kd等用户守护进程;
init进程还会启动ServiceManager(Binder服务管家)、bootanim(开机动画)等重要服务。
init进程fork出Zygote进程,Zygote进程是Android系统第一个Java进程(虚拟机进程),Zygote进程是所有Java进程的父进程

init处理的重要事情:
1.挂载文件
2.设置selinux -- 安全策略
3.开启属性服务,注册到epoll中
4.解析init.rc 
5.循环处理脚本 -- 启动zygote
6.循环等待

四、Zygote进程启动

Zygote进程是由init进程通过解析init.rc文件后fork生成的,解析 init.rc 源码流程--> parser.ParseConfig("/system/etc/init/hw/init.rc") --> ParseConfigDir --> ParseConfigFile --> ParseConfigFile --> ParseData --> 解析init文件(二进制)

Zygote进程主要作用包含:

1.加载ZygoteInit类,注册Zygote Socket服务端套接字
2.加载虚拟机
3.提前加载类preloadClasses
4.提前加载资源preloadResouces 
5.SystemServer进程,是由Zygote进程fork而来,SystemServer是Zygote孵化的第一个进程,SystemServer负责启动和管理整个Java framework,包含ActivityManager,WindowManager,PackageManager,PowerManager等服务(共90多个服务)。
6.MediaServer进程,是由init进程fork而来,负责启动和管理整个C++ framework,包含AudioFlinger,Camera Service等服务。

五、Android桌面启动

Android系统桌面其实就是Launcher进程,Launcher也是一个APP,它会将已安装的APP显示到界面上。点击APP图标时,SystemServer 会通知Zygote创建APP进程并启动。

总体流程如下图


总结

Android系统启动看似简单,分析过后才发现里面有各种复杂的流程。本文章只是一个启动概览,没有深入分析源码,如有不对的地方欢迎评论交流,共同进步。

原文地址:https://blog.csdn.net/baidu_33321081/article/details/122368991

免责声明:本文来源于互联网,版权归合法拥有者所有,如有侵权请公众号联系管理员

* 本站提供的一些文章、资料是供学习研究之用,如用于商业用途,请购买正版。

永琪-