Android 启动流程:
1. linux OS
Bootloader -> Linux kernel
2. Android/Init Runtime
Init Process -> Services -> Zygote/VM -> System Server
3. Framework HomeScreen
Server Manager -> Home Luncher
如下图:
Android 启动流程:
1). 源码 bootable/bootloader
2). 上电后,CPU将先执行bootloader 程序,此时有三种情况:
a. fastboot 模式即命令或SD卡烧写模式,不加载内核及文件系统,此处可以进行工厂模式的烧写
b. recovery 模式,加载recovery.img, 它包含有内核及基本的文件系统,用于工程模式烧写
c. 正常启动,加载boot.img, 它包含内核及基本的文件系统,用于正常启动手机。
bootloader(汇编语言)进行底层初始化,并加载内核代码,最终跳转到内核的boot程序。
简单地说,BootLoader是在操作系统运行之前运行的一段程序,它可以将系统的软硬件环境带到一个合适状态,为运行操作系统做好准备。这样描述是比较抽象的,但是它的任务确实不多,终极目标就是把OS拉起来运行。
2. 内核Kernel
1)kernel核心初始化(内存初始化,打开中断,初始化进程表等等);
2)驱动初始化;
3)启动内核后台(daemons)线程
4)安装根(root)文件系统
2)驱动初始化;
3)启动内核后台(daemons)线程
4)安装根(root)文件系统
5) 启动第一个用户级进程init
kernel 就由bootloader 加载的,源码:kernel
3. Init
1) 源码:system/core/init/*
2) 配置文件:system/rootdir/init.rc
init进程的程序在system/core/init/init.c里,它是android系统特定的初始化程序, 是一个由内核启动的用户级进程,最终它会以后台进程(daemon)的形式一直存在。该进程主要有如下功能:
3)创建/安装设备文件/进程文件/系统文件节点;
4)解析启动/init.rc和/init.<machine_name>.rc;5)显示Logo画面;
6)打开Device Socket,Property Socket, child进程通信Socket;
7)执行脚本中指定的命令或动作,启动指定服务;如最基本的servicemanamger 及Zygote
8)进入死循环:检查是否有action需要执行;是否需要restart某服务;监听特定事件(child进程退出,Device相关事件,Property事件,新服务启动)
4. Native 服务启动 --servicemanager
Servicemanager属于NativeService。在执行init.rc时就会启动,与Zygote一样。在init.rc脚本中Servicemanager的描述:serviceservicemanager/system/bin/servicemanager
源码:frameworks/native/cmds/servicemanager/service_manager.c
源码:frameworks/native/cmds/servicemanager/service_manager.c
根据system/core/rootdir/init.rc, init进程通过open_keychord()从service_list(之前从.rc中解析出来的)中把所有service信息写入特定文件,handle_keychord()逐个读出然后调用service_start()创建(先fork()然后在子进程中调用execve()来执行相应的服务程序)指定的service进程。这里创建的service都属于native服务,运行在Linux空间,通过socket向上层提供特定的服务。例如:
console: shell console服务.servicemanager: Binder服务管理器,管理所有Android系统服务
vold: volume Daemon,支持存储外设的热插拔
adbd: Android Debug Bridge Daemon,提供adb相关功能
mountd: 设备安装Daemon,负责设备安装及状态通知
debuggerd: Debug Daemon,处理调试进程的请求
rild: 无线接口层(radio interface layer)Daemon.
zygote: 启动Android Dalvik Runtime并负责进程孵化服务.
mediaserver: 启动AudioFlinger, MediaPlayerService and CameraService.负责多媒体播放相关的功能,包括音视频解码、显示输出等。
installd: 包安装Daemon,提供包安装/删除/dex处理等底层功能
5. Zygote
重要的后台程序zygote
1) 源码:frameworks/base/cmds/app_process/app_main.cpp等
2) 说明:zygote是一个在init.rc中被指定启动的服务,该服务对应的命令是/system/bin/app_process
a) 建立Java Runtime,建立虚拟机
b) 建立Socket接收ActivityManangerService的请求,用于Fork应用程序
c) 启动System Server
2) 说明:zygote是一个在init.rc中被指定启动的服务,该服务对应的命令是/system/bin/app_process
a) 建立Java Runtime,建立虚拟机
b) 建立Socket接收ActivityManangerService的请求,用于Fork应用程序
c) 启动System Server
6. 系统服务system server
1) 源码:frameworks/base/services/java/com/android/server/SystemServer.java
2) 说明:被zygote启动,通过System Manager管理android的服务(这里的服务指frameworks/base/services下的服务,如卫星定位服务,剪切板服务等)
1) 源码:frameworks/base/services/java/com/android/server/SystemServer.java
2) 说明:被zygote启动,通过System Manager管理android的服务(这里的服务指frameworks/base/services下的服务,如卫星定位服务,剪切板服务等)
System Server作为Zygote的第1个子进程,是Android Framework的核心,它主要负责Android系统初始化并启动其他服务。其它的Android服务都由SystemServer启动并运行在该进程空间
7. 桌面 launcher
1) 源码:ActivityManagerService.java为入口,packages/apps/launcher*实现
2) 说明:系统启动成功后SystemServer使用xxx.systemReady()通知各个服务,系统已经就绪,桌面程序Home就是在ActivityManagerService.systemReady()通知的过程中建立的,最终调用 ()启launcher
Android 端启动过程详解
1. init 进程启动
a. system/core/rootdir/init.rc
b. system/core/init/init.c ,init_parser.c
c. init 通过init.c 里的main ->init_parse_config_file("/init.rc")->parse_config->parse_new_section->parse_service-> 最终将所有service 加入到service_list
Ref: