Android(一)系统启动过程

内容摘自:一文看明白Android系统启动过程


计算机启动方式

程序执行时首先将程序从硬盘读取到内存,然后加载到CPU

按下开机键之后,BIOS将操作系统加载到内存中

BIOS:Basic Input/Output System

  1. BIOS首先进行硬件自检
  2. 自检完成后,BIOS将控制权交给下一个启动程序,一般会按照启动排序顺序加载,一般就是Boot Sequence界面
  3. 第一存储区被激活,计算机读取第一扇区,即最前面的512个字节(主引导记录,Master boot record,MBR),如果这512个自己最后两个字节是0x55和0xAA,表明设备可以启动
  4. 计算机从MBR中读取前面的446字节的机器码,运行事先安装的启动管理器(Boot Loader),由用户选择启动哪个操作系统
  5. 操作系统的内核被加载入内存。

(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

  1. Bootloader读取ROM,找到操作系统,并将Linux内核加载到RAM中
  2. Linux内核初始化各种软硬件环境,加载驱动程序,挂载根文件系统
  3. Linux内核最后阶段,执行第一个用户空间的init进程

init进程

  • 内核启动后,调用/system/core/init/init.cpp的main()方法

    初始化Kernel log、创建共享内存空间、加载/default.prop文件、解析init.rc文件

init.rc文件

Android系统的配置文件,在/system/core/rootdir/目录下

功能:

  1. 定义了系统启动时需要执行的一系列action
  2. 执行特定动作
  3. 设置环境变量和属性
  4. 执行特定的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框架初始化启动的开始

主要功能:

  1. 将底层功能的JNI函数注册到虚拟机
  2. 预加载Java类和资源
  3. fork并启动system_server核心进程
  4. 作为守护进程监听处理“孵化新进程”的请求

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服务启动完成后

  1. 进入ActivityManagerService.systemReady()
  2. 启动SystemUI、WebViewFactory,Watchdog
  3. 启动桌面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()

完整启动过程

posted @ 2021-03-05 15:12  张小凡I4CU  阅读(320)  评论(0编辑  收藏  举报