7 启动流程分析
7.1 系统引导bootloader
7.2 Linux 内核
7.3 文件系统及init进程
7.4 重要的后台运行程序zygote
7.5 系统服务SystemService
7.6 桌面Launcher
7.7 屏幕解锁
7.1 系统引导bootloader
源码:bootable/bootoader/ 上电后,CPU IROM的程序会将bootloader装载到
内存执行
启动模式
Camera + Power 启动到Fastboot,工厂模式,SD卡烧写模式(USB
, 网络) Home + Power启动recovery模式
按Power,正常开机模式
7.2 Linux 内核
源码:kernel/
Bootloader在启动结束时,将CPU执行权交与
kernel
Kernel 自解压,初始化内核,所有需要启动的驱
动后,启动文件系统的init进程
7.3 文件系统及init进程
源码:system/core/init/init.c
建立系统目录并挂载(格式:源 目的 类型) sysfs /sys sysfs
tmpfs /dev tmpfs
proc /proc proc
devpts /dev/pts devpts
初始化控制台
Log系统初始化
解析并执行init.rc
初始化环境变量
创建挂载点并挂载
创建一些android需要用到的文件或者目录并设置相应的权限
启动服务(adbd, console, vold, servicemanager, zygote…)
监听系统服务(后台程序)
7.4 重要的后台运行程序zygote
源码:frameworks/base/cmds/app_process/app_main.c
建立java runtime, 建立虚拟机, 注册JNI 函数,
runtime.start(“com.android.internal.os.ZygoteInit”,
startSystemServer);
运行:com.android.internal.os.ZygoteInit:main函数
registerZygoteSocket();//登记Listen端口
startSystemServer();
进入zygote服务框架: runForkMode, accept-and-fork模式,即通过
socket接收到Framework的请求,然后fork一个进程进行处理。
7.5 系统服务SystemService
源码:frameworks/base/services/java/com/android/server/SystemServer.java
int1:加载android_servers,执行其中的,system_init()
源码路径:frameworks/base/cmds/system_server/library/system_init.cpp
启动C/C++服务:SurfaceFlinger, AudioFlinger, MediaPlayerService, CameraService, AudioPolicyService
Init2(由system_init在最后时期通过JNI反调用): SystemServer启动各种java系统服务, 如 PowerManagerService
ActivityManagerService
AudioService
PackageManagerService
BatteryService
FsLedService
各种systemReady()通知各个服务,系统已经就绪
7.6 桌面Launcher/home
源码:packages/apps/Launcher/*
Android系统启动的第一个应用,在
ActivityManagerService.systemReady()发送消息,
通知home启动
为什么Launcher第一个启动:Launcer的
AmdroidManifest.xml中intent-filter 定义了
7.7 屏幕解锁
源码目录:
frameworks/policies/base/phone/com/android/internal/
policy/impl/lock
系统启动后,一般会将系统锁住,此时必须解锁
才可以正常使用设备
锁可以自定义,以保护各人隐私