Android(一)系统启动过程
内容摘自:一文看明白Android系统启动过程
计算机启动方式
程序执行时首先将程序从硬盘读取到内存,然后加载到CPU
按下开机键之后,BIOS将操作系统加载到内存中
BIOS:Basic Input/Output System
- BIOS首先进行硬件自检
- 自检完成后,BIOS将控制权交给下一个启动程序,一般会按照启动排序顺序加载,一般就是Boot Sequence界面
- 第一存储区被激活,计算机读取第一扇区,即最前面的512个字节(主引导记录,Master boot record,MBR),如果这512个自己最后两个字节是0x55和0xAA,表明设备可以启动
- 计算机从MBR中读取前面的446字节的机器码,运行事先安装的启动管理器(Boot Loader),由用户选择启动哪个操作系统
- 操作系统的内核被加载入内存。
(1) 第1-446字节:调用操作系统的机器码。
(2) 第447-510字节:分区表(Partition table)。
(3) 第511-512字节:主引导记录签名(0x55和0xAA)。
Android 手机启动过程
Android系统主要分区
/boot:存放引导程序,包括内核和内存操作程序
/system:相当于电脑c盘,存放Android系统及系统应用
/recovery:恢复分区,可以进入该分区进行系统恢复
/data:用户数据区,包含了用户的数据 :联系人、短信、设置、用户安装的程序
/cache:安卓系统缓存区,保存系统最常访问的数据和应用程序
/misc:包含一些杂项内容,如系统设置和系统功能启用禁用设置
/sdcard:用户自己的存储区,可以存放照片,音乐,视频等文件
按下开机键之后,首先加载Bootloader
- Bootloader读取ROM,找到操作系统,并将Linux内核加载到RAM中
- Linux内核初始化各种软硬件环境,加载驱动程序,挂载根文件系统
- Linux内核最后阶段,执行第一个用户空间的init进程
init进程
- 内核启动后,调用/system/core/init/init.cpp的main()方法
初始化Kernel log、创建共享内存空间、加载/default.prop文件、解析init.rc文件
init.rc文件
Android系统的配置文件,在/system/core/rootdir/目录下
功能:
- 定义了系统启动时需要执行的一系列action
- 执行特定动作
- 设置环境变量和属性
- 执行特定的Service
init进程通过创建子进程启动init.rc脚本文件中配置的服务,这些Service属于native服务,运行在linux空间,通过socket向上层提供服务,以守护进程的方式运行在后台。
守护进程:
运行在后台,不受任何终端控制的进程。常常在系统引导时启动,仅在系统关闭时停止
通过init.rc脚本启动的服务:
- service_manager:启动 binder IPC,管理所有的 Android 系统服务。(详见笔记《Android(二)Binder 进程间通讯》)
ServiceManager 进程是Bind IPC通信过程中的守护进程,本身也是一个Binder服务。ServiceManager 主要用于启动Binder,提供服务的查询和注册。
- mountd:设备安装 Daemon(守护进程),负责设备安装及状态通知
- debuggerd:启动 debug system,处理调试进程的请求
- rild:启动 radio interface layer daemon 服务,处理电话相关的事件和请求
- media_server:启动 AudioFlinger,MediaPlayerService 和 CameraService,负责多媒体播放相关的功能,包括音视频解码
AudioFlinger 音频服务,CameraService 相机服务。
- surface_flinger:启动 SurfaceFlinger 负责显示输出
SurfaceFlinger 负责图像绘制,是应用UI的核心。SurfaceFlinger 进程主要启动FrameBuffer,初始化显示系统
- zygote:进程孵化器,启动 Android Java VMRuntime 和启动 systemserver,负责 Android 应用进程的孵化工作
Zygote进程
- 孵化了所有的 Android 应用进程,是 Android Framework 的基础。
- 该进程的启动标志着Framework框架初始化启动的开始
主要功能:
- 将底层功能的JNI函数注册到虚拟机
- 预加载Java类和资源
- fork并启动system_server核心进程
- 作为守护进程监听处理“孵化新进程”的请求
Zygote进程启动后:执行frameworks/base/cmds/app_process/App_main.cpp文件的main()方法
App_main.main() //设置进程名,并启动 AppRuntime。
AndroidRuntime::start() //创建 Java 虚拟机,注册 JNI 方法,调用 ZygoteInit.main() 方法。
ZygoteInit.main() //为 Zygote 注册 socket,预加载类和资源,启动 system_server 进程。
system_server进程
system_server进程由Zygote进程fork(派生、分支,创建副本)而来
下面是system_server的启动过程
//首先会调用 ZygoteInit.startSystemServer() 方法。
//fork子进程system_server,并进入该进程
ZygoteInit.startSystemServer()
//设置当前进程名为“system_server”,创建 PathClassLoader 类加载器。
ZygoteInit.handleSystemServerProcess()
//重定向 log 输出,通用的初始化(设置默认异常捕捉方法,时区等)
//初始化 Zygote -> nativeZygoteInit()。
RuntimeInit.zygoteInit()
//方法经过层层调用,会进入 app_main.cpp 中的 onZygoteInit() 方法。
nativeZygoteInit()
// 启动新 Binder 线程。
app_main::onZygoteInit()
//方法经过层层调用,会抛出异常 ZygoteInit.MethodAndArgsCaller(m, argv)
//ZygoteInit.main() 会捕捉该异常。
applicationInit()
//开启 DDMS 功能,preload() 加载资源,预加载 OpenGL,调用 SystemServer.main() 方法。
ZygoteInit.main()
//先初始化 SystemServer 对象,再调用对象的 run() 方法。
SystemServer.main()
//准备主线程 looper,加载 android_servers.so 库,该库包含的源码在 frameworks/base/services/ 目录下。
SystemServer.run()
system_server启动后,将初始化系统上下文,创建SystemServerManager,然后启动各种服务:
//
/** 启动引导服务
* 该方法主要启动服务:
* ActivityManagerService
* PowerManagerService
* LightsService
* DisplayManagerService
* PackageManagerService
* UserManagerService
*/
startBootstrapServices();
//
/** 启动核心服务
* 主要启动服务:
* BatteryService 统计电池电量,前置条件:LightService
* UsageStateService,统计应用使用情况
* WebViewUpdateService
*/
startCoreServices();
/** 启动其他服务
* 主要启动服务:InputManagerService,WindowManagerService,StatusBarManagerService
* 等待ServiceManager,SurfaceFlinger启动完成,显示启动界面
*/
startOtherServices();
所有服务启动完成后会注册到ServiceManager。
ActivityManagerService服务启动完成后
- 进入ActivityManagerService.systemReady()
- 启动SystemUI、WebViewFactory,Watchdog
- 启动桌面Launcher App
ActivityManagerService启动
启动桌面Launcher App需要等待ActivityManagerService启动完成。启动过程如下:
/**
* 创建名为"ActivityManager"的前台线程,并获取mHander
* 通过UiThread类,创建名为"android.ui"的线程
* 创建前台广播和后台广播接收器
* 创建目录 /data/system
* 创建服务 BatterStateService
*/
ActivityManagerService(Context)
//安装所有的系统 Provider。
ActivityManagerService.startOtherServices() -> installSystemProviders()
/**
* 恢复最近任务栏的 task
* 启动 WebView,SystemUI,开启 Watchdog,启动桌面 Launcher App
* 发送系统广播
*/
ActivityManagerService.systemReady()