aosp启动时序
时间: 2025-06-30 11:15:53 浏览: 7
<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相关操作
}
```
阅读全文
相关推荐


