Android 的开机流程
1. 系统引导 bootloader
1) 源码:bootable/bootloader/*
2) 说明:加电后,CPU 将先执行 bootloader 程序,此处有三种选择
a) 开机按 Camera+Power 启动到 fastboot,即命令或 SD 卡烧写模式,不加载内核及文
件系统,此处可以进行工厂模式的烧写
b) 开机按 Home+Power 启动到 recovery 模式,加载 recovery.img,recovery.img 包
含内核,基本的文件系统,用于工程模式的烧写
c) 开机按 Power,正常启动系统,加载 boot.img,boot.img 包含内核,基本文件系统,
用于正常启动手机(以下只分析正常启动的情况)
2. 内核 kernel
1) 源码:kernel/*
2) 说明:kernel 由 bootloader 加载
3. 文件系统及应用 init
1) 源码:system/core/init/*
2) 配置文件:system/rootdir/init.rc,
3) 说明:init 是一个由内核启动的用户级进程,它按照 init.rc 中的设置执行:启动服务(这里的
服务指 linux 底层服务,如 adbd 提供 adb 支持,vold 提供 SD 卡挂载等),执行命令和按其
中的配置语句执行相应功能
4. 重要的后台程序 zygote
1) 源码:frameworks/base/cmds/app_main.cpp 等
2) 说明:zygote 是一个在 init.rc 中被指定启动的服务,该服务对应的命令
是/system/bin/app_process
a) 建立 Java Runtime,建立虚拟机
b) 建立 Socket 接收 ActivityManangerService 的请求,用于 Fork 应用程序
c) 启动 System Server
5. 系统服务 system server
1) 源码:frameworks/base/services/java/com/android/server/SystemServer.java
2) 说明:被 zygote 启动,通过 System Manager 管理 android 的服务(这里的服务指
frameworks/base/services 下的服务,如卫星定位服务,剪切板服务等)
6. 桌面 launcher
1) 源码:ActivityManagerService.java 为入口,packages/apps/launcher*实现
2) 说明:系统启动成功后 SystemServer 使用 xxx.systemReady()通知各个服务,系统已经
就绪,桌面程序 Home 就是在 ActivityManagerService.systemReady()通知的过程中建立
的,最终调用 ()启 launcher
7. 解锁
1) 源码:
frameworks/policies/base/phone/com/android/internal/policy/impl/*lock*
2) 说明:系统启动成功后 SystemServer 调用 wm.systemReady()通知
WindowManagerService,进而调用 PhoneWindowManager,最终通过
LockPatternKeyguardView 显示解锁界面,跟踪代码可以看到解锁界面并不是一个
Activity,这是只是向特定层上绘图,其代码了存放在特殊的位置