SystemUI 启动流程分析(AndroidO)
1 SystemUI 概述
“SystemUI 是 Android 为用户提供系统级别的信息显示与交互的一套UI组件”。SystemUI 源码位于 frameworks\base\packages\SystemUI 目录下,它以独立的 APK 形式运行在于系统中,像 Android 手机系统常见的原生状态栏、导航栏、通知栏、最近任务列表、音量/亮度调节、截屏等这些功能组件,都属于 SystemUI 的范畴。SystemUI 对比普通的系统应用程序,最大的差别可能就是 SystemUI 中组件的大部分通信和操作请求都来自于系统级别的服务。
2 SystemUI 的启动
像亮度/音量调节、截图这种功能组件,和普通的 Activity/Service 差别不大,可以按需启动,而像状态栏、导航栏这种组件就有点特殊,它们是类似运行在 SystemUIService 的一个子服务中, 伴随着 SystemUI 的启动而初始化创建完成。
2.1 启动时机
在 Android 系统启动流程中(BootLoader->kernel->init->zygote->system_server->launcher),system_server 进程创建后会按不同类别启动系统服务,启动入口就是在 SystemServer.main() 方法中。
系统服务按类别 Bootstrap->Core->Other 的顺序先后启动,而 SystemUI 就是在 Other 阶段之后,startOtherServices() 方法中启动的。
// frameworks\base\services\java\com\android\server\SystemServer.java
public final class SystemServer {
public static void main(String[] args) {
new SystemServer().run();
}
private void run() {
...
try {
startBootstrapServices(); // 启动引导服务 (AMS、PackageManagerService...)
startCoreServices(); // 启动核心服务 (BatteryService、UsageStatsService...)
startOtherServices(); // 启动其它服务 (StatusBarManagerService、SystemUI...)
SystemServerInitThreadPool.shutdown();
} catch (Throwable ex) {
...
}
}
...
}
在 startOtherServices() 方法中,通过 AMS.systemReady() 方法来通知 AMS 准备就绪,告诉 ActivityManager 可以运行第三方代码。startSystemUi() 作为 Runnable 类型参数 goingCallback 中的回调代码块,一旦到达了可以真正运行第三方代码的状态,Runnable 代码块将会被回调,以便完成剩下一些服务的初始化工作。
private void startOtherServices() {
// 启动Other服务
...
// 这里差不多已经启动完了所有的系统服务
// systemReady(final Runnable goingCallback, BootTimingsTraceLog traceLog)
mActivityManagerService.systemReady(() -> {
//
// 当到达这个阶段时,为至今已启动的所有系统服务进行相关回调(回调各个服务重写的onBootPhase 方法)
mSystemServiceManager.startBootPhase(SystemService.PHASE_ACTIVITY_MANAGER_READY);
...
traceBeginAndSlog