AOSP 8.0 系统启动概要

该文详细阐述了Android系统从电源启动到Systemserver运行的完整过程,包括BootLoader加载内核、init进程初始化、Zygote进程创建、ART虚拟机启动以及systemserver管理各种服务。重点讨论了父进程(如init,Zygote)和重要重量级进程(如system_server,mediaserver,servicemanager)的角色和功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

系列专题

一、Android 系统启动流程图

二、系统启动阶段

三、系统重要进程

3.1 父进程

3.2 重量级进程



系列专题

AOSP 8.0 系统启动之一--内核启动​​​​​​​
AOSP 8.0 系统启动之二--init启动(一)​​​​​​​​​​​​​​​​​​​​​

AOSP 8.0 系统启动之二--init启动(二)

​​​​​​​AOSP 8.0 系统启动之二--init启动(三)​​​​​​​

AOSP 8.0 系统启动之三--Zygote启动(一)

AOSP 8.0 系统启动之三--Zygote启动(二)

AOSP 8.0 系统启动之四--ART虚拟机启动(一)

​​​​​​​​​​​​​​AOSP 8.0 系统启动之四--ART虚拟机启动(二)

AOSP 8.0 系统启动之五--systemserver启动(一)

AOSP 8.0 系统启动之五--systemserver启动(二)

AOSP 8.0 系统启动之五--systemserver启动(三)

一、Android 系统启动流程图

备注:(图片引用gityuan)

二、系统启动阶段

  • step1. 启动电源及系统:

        电源按下后,引导芯片开始将固化在ROM中的BootLoader加载至RAM中,并执行该程序;

  • step2. 引导程序BootLoader:

        引导程序BootLoader是在Android操作系统开始运行前,执行的一个小程序,其主要作用是把系统OS拉起来并运行;

  • step3. Linux内核启动:

        内核启动时,设置缓存、被保护存储器、计划列表和加载驱动等,完成设置后,开始加载init.rc文件;

  • step4. init进程启动:

        开始初始化和启动属性服务,创建Zygote进程。    

  • step5. Systemserver启动: 

        初始化各种app 管理的服务,如AMS,WMS,PMS等等。

  • step6. 各种系统APP、三方App 启动:

三、系统重要进程

3.1 父进程

在所有进程中,以父进程的姿态存在的进程,如下:

  • idle进程:是Linux系统第一个进程(pid = 0 ),是init进程和kthreadd进程的父进程
  • kthreadd进程 : 是所有内核进程的父进程
  • init进程  : 是所有用户进程的父进程(或者父父进程)
  • zygote进程 : 是所有上层Java进程的父进程,另外zygote的父进程是init进程。

3.2 重量级进程

在Android进程中,有几个非常重要的进程

  • system_server:​​​​​​​​​​​​​​是由zygote孵化而来的,是zygote的首席大弟子,托起整个Java framework的所有service,比如ActivityManagerService, PowerManagerService等等。
  • mediaserver:是由init孵化而来的,托起整个C++ framework的所有service,比如AudioFlinger, MediaPlayerService等等。
  • servicemanager:是由init孵化而来的,是整个Binder架构(IPC)的大管家,所有大大小小的service都需要先请示servicemanager。

<think>我们正在分析AOSP系统启动时序,特别是`systemReady`方法和动阶段。根据引用[1]和[2],我们知道在`SystemServer`的`run()`方法中,会动各种服务,并在`startOtherServices()`中注册AMS的`systemReady`回调,然后在该回调中动其他服务(如SystemUI)和执行一些系统就绪后的操作。下面我们将详细分析`systemReady`的动时序:###一、`SystemServer`动阶段划分1.**引导服务(BootstrapServices)**:如`Installer`、`ActivityManagerService`等。2.**核心服务(CoreServices)**:如`BatteryService`、`UsageStatsService`等。3.**其他服务(OtherServices)**:如`WindowManagerService`、`PackageManagerService`等。在动其他服务(OtherServices)阶段,会调用`ActivityManagerService.systemReady()`来通知系统进入就绪状态。###二、`systemReady`触发流程关键代码位于`SystemServer.java`的`startOtherServices()`方法中:```java//文件路径:frameworks/base/services/core/java/com/android/server/SystemServer.javaprivatevoidstartOtherServices(){//...动其他服务//动WindowManagerService(引用[3])wm=WindowManagerService.main(...);//将WindowManagerService添加到ServiceManagerServiceManager.addService(Context.WINDOW_SERVICE,wm);//...其他服务动//通知ActivityManagerService系统服务已动mActivityManagerService.systemReady(()->{//当AMS准备就绪后,会执行此回调Slog.i(TAG,"正在执行systemReady回调");//动SystemUI(引用[2])startSystemUi(context);//其他就绪后操作},BOOT_TIMINGS_TRACE_LOG);}```###三、`ActivityManagerService.systemReady()`内部流程在`ActivityManagerService`中,`systemReady()`方法会执行以下关键步骤:1.**系统状态更新**:将系统状态设置为`BOOTING`(动中)或`READY`(就绪)。2.**动系统用户界面**:如SystemUI(状态栏、导航栏等)[^2]。3.**发送`BOOT_COMPLETED`广播**:通知所有应用系统启动完成。4.**动首个Activity**:动桌面(Launcher)应用。###四、时序图以下是简化的动时序:```mermaidsequenceDiagramparticipantSystemServerparticipantAMSparticipantWMSparticipantSystemUISystemServer->>AMS:动AMSSystemServer->>WMS:动WMS(引用[3])SystemServer->>其他服务:动其他服务SystemServer->>AMS:调用systemReady()AMS->>AMS:内部状态设置为READYAMS->>SystemUI:动SystemUI(通过回调)AMS->>广播:发送BOOT_COMPLETEDAMS->>Launcher:动桌面```###五、关键点解析1.**`systemReady`回调的执行时机**在`ActivityManagerService`完成自身初始化,并且所有关键服务(如WMS、PMS等)都已动后,才会执行`systemReady`回调。2.**SystemUI的动**如引用[2]所述,SystemUI是在AMS的`systemReady`回调中动的,具体通过`SystemUIService`实现。3.**权限与系统API**在系统服务创建过程中,可能需要处理隐藏API的问题(引用[4]),例如通过修改`Android.bp`文件添加白名单。###六、常见问题1.**为什么在`systemReady`回调中执行网络设置?**因为此时Telephony服务已初始化完成,且SIM卡状态稳定。2.**如何确保服务动顺序?**`SystemServer`严格按照引导服务、核心服务、其他服务的顺序动,并通过`SystemServiceManager`管理依赖关系。§§相关问题§§1.`SystemServer`中服务动顺序的详细列表是怎样的?2.`ActivityManagerService.systemReady()`内部状态转换的具体过程?3.如何添加自定义系统服务并确保在`systemReady`前初始化?4.系统启动过程中`BOOT_COMPLETED`广播的发送机制?5.在`systemReady`回调中执行耗时操作会有什么影响?</think>## AOSP系统启动时序分析:`systemReady`方法核心机制 ### 一、`SystemServer`动流程概览 ```mermaid sequenceDiagram participant Zygote participant SystemServer participant AMS participant WMS participant SystemUI Zygote->>SystemServer: fork()创建进程 SystemServer->>SystemServer: main()入口 SystemServer->>SystemServer: run()方法执行 SystemServer->>SystemServer: createSystemContext()初始化系统上下文 SystemServer->>AMS: 动ActivityManagerService SystemServer->>WMS: 动WindowManagerService SystemServer->>其他服务: 动其他核心服务 SystemServer->>AMS: 调用systemReady() AMS-->>SystemServer: 执行回调函数 SystemServer->>SystemUI: 动SystemUI服务 ``` ### 二、`systemReady`关键时序解析 #### 1. 前置准备阶段 ```java // SystemServer.java public void run() { // 1. 创建系统级Context createSystemContext(); // 初始化SystemContext和SystemUiContext [^1] // 2. 动引导服务 startBootstrapServices(); // 包含AMS初始化 // 3. 动核心服务 startCoreServices(); // 4. 动其他服务 startOtherServices(); // 此处触发systemReady } ``` #### 2. `systemReady`触发点 ```java // SystemServer.java private void startOtherServices() { // 动WMS等关键服务 [^3] wm = WindowManagerService.main(...); ServiceManager.addService(Context.WINDOW_SERVICE, wm); // ✅ 关键调用点 mActivityManagerService.systemReady(() -> { Slog.i(TAG, "执行systemReady回调"); // 动SystemUI [^2] startSystemUi(context); // 执行自定义初始化逻辑 }, traceLog); } ``` #### 3. `ActivityManagerService`中的处理 ```java // ActivityManagerService.java public void systemReady(final Runnable goingCallback, TimingsTraceLog traceLog) { synchronized (this) { // 1. 完成AMS自身初始化 mSystemReady = true; // 2. 动关键系统组件 startSystemUi(context); // 动SystemUI [^2] startPersistentApps(); // 动持久化应用 // 3. 执行传入的回调函数 if (goingCallback != null) goingCallback.run(); // 4. 发送系统就绪广播 broadcastIntent(...ACTION_BOOT_COMPLETED...); } } ``` ### 三、时序关键点分析 1. **依赖关系** `systemReady`必须在以下服务就绪后调用: - `WindowManagerService` (WMS) [^3] - `PackageManagerService` (PMS) - `PowerManagerService` (PMS) 2. **回调执行时机** 回调函数在以下操作**之后**执行: - 核心服务初始化完成 - 系统上下文完全建立 [^1] - AMS内部状态设置为`mSystemReady=true` 3. **线程模型** 整个流程在`SystemServer`的主线程执行,回调函数**同步执行**,阻塞后续动流程: $$ \text{执行时间} < 200\text{ms} \quad (\text{Android性能要求}) $$ ### 四、典型应用场景 1. **系统UI动** ```java // SystemServer回调中 startSystemUi(context); // 动状态栏/导航栏等 [^2] ``` 2. **网络设置** ```java mActivityManagerService.systemReady(() -> { TelephonyManager tm = context.getSystemService(TelephonyManager.class); tm.setPreferredNetworkType(...); }, trace); ``` 3. **策略服务初始化** ```java mActivityManagerService.systemReady(() -> { DevicePolicyManagerService dpms = new DevicePolicyManagerService(context); ServiceManager.addService(Context.DEVICE_POLICY_SERVICE, dpms); }, trace); ``` ### 五、调试与问题定位 1. **动超时检测** ```bash adb logcat | grep "SystemServer" # 关注"SystemServer boot timings"日志段 ``` 2. **回调阻塞分析** 在回调函数首尾添加追踪: ```java mActivityManagerService.systemReady(() -> { Slog.i(TAG, "回调开始: " + SystemClock.uptimeMillis()); // ... 业务逻辑 ... Slog.i(TAG, "回调结束: " + SystemClock.uptimeMillis()); }, trace); ``` 3. **服务依赖验证** 通过`dumpsys`检查服务状态: ```bash adb shell dumpsys activity services | grep "mSystemReady" ``` ### 六、最佳实践 1. **轻量化回调** 避免在回调中执行超过100ms的操作 2. **异步化处理** 耗时操作应移交工作线程: ```java mActivityManagerService.systemReady(() -> { new Thread(() -> { // 耗时初始化操作 }).start(); }, trace); ``` 3. **依赖检查** 关键服务存在性验证: ```java if (ServiceManager.getService("window") != null) { // 安全执行WMS相关操作 } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值