Android开机启动流程
16lz
2021-01-23
Android是一个基于Linux内核的操作系统,了解Android开机流程有助于理解Linux系统的开机过程。Android系统开机流程图如下所示:
Fig. Android Booting Process
开始加载 Android系统VM以及核心服务。 上述脚本通过
Fig. Android Booting Process
1 - Boot ROM
按下开机键后,跳至硬件编码的BOOT ROM指定地址:加载Bootloader到内存中,开始执行Bootloader代码
2 - Bootloader
Bootloader 执行分为两个阶段:
- 检测外部RAM
- 初始化网络、内存等,为启动kernel做准备
Bootloader的核心代码在init.S.
3 - Kernel
Android的Kernel启动跟Linux Kernel启动过程很相似,在这个过程中主要是初始化cache, 内存保护,进程调度,驱动以及挂载root文件系统。初始化完成之后,开始加载 Android的第一个进程 init
4 - Init
init进程是Android所有进程的父进程,其主要有两个作用:
- 挂载系统目录:/sys, /dev/, /proc
- 执行初始化脚本init.rc
此阶段init进程会启动系统的必须的守护进程,如RILD,netd,vold,meadiaserver,installd,adbd等,然后通过 脚本命令:
service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server
开始加载 Android系统VM以及核心服务。 上述脚本通过
/android/frameworks/base/cmds/app_process/app_main.cpp
解析后,启动 zygote
进程和system server核心服务。- 有关 init.rc 的语法可以参看 AOSP 代码目录:
/android/system/core/init/readme.txt
- init 进程代码可以参看AOSP目录:
/android/system/core/init/
- init.rc 可参看 AOSP目录:
/android/system/core/rootdir/init.rc
5 - Zygote/Dalvik
在Java中,不同的应用有不同的Virtual Machine(VM)实例,Android考虑到APP的加载速度,防止内存消耗过大,通过创建一个zygote
进程,从而实现不同Dalvik VM之间的代码、数据共享。 zygote
进程主要用于预加载并初始化Android的核心库类。
一旦init初始化完Android Runtime,zygote
开始创建 第一个Dalvik VM实例,由此 zygote
进程开始加载system server进程。 zygote
的执行主要有几个关键步骤:
- 加载并执行
ZygoteInit
类 registerZygoteSocket()
: 注册用于zygote命令链接的socketpreloadClasses(); preloadResources()
: 预加载常用类以及系统资源(themes,layouts等)
至此,系统会有开机画面显示
6 - System Server/services
Zygote启动一个新的system server进程用于启动系统服务,需要启动的服务主要有两类:(1) core services; (2) other services:
core services
- Power Manager
- Activity Manager
- Telephony Registry
- Package Manager
- Alarm Manager
- Sensor Service
- Window Manager
- Mount Service
- Context Manager
Other Service
- Status bar service
- hardware service
- connectivity service
- notification manager
- location manager
- wallpaper service
7 - 启动HOME Activity
ActivityManager 初始化完成后,会发送一个 CATEGORY_HOME 的Intent,从而启动HOME Screen,至此可以看到手机开机完成后的IDLE界面,Android系统启动完成。更多相关文章
- Android 图片加载图片_OOM异常解决
- IPC进程间通信
- [置顶] Android进程间通信AIDL的使用分析
- 求助: Android 加载 webview, 点击webview 中网页时间, 如何触发
- android后台进程隐藏手段
- android kernel 初始化 1