01. SystemUI 启动流程分析(AndroidO)

本文详细分析了Android O系统中的SystemUI启动流程,从SystemUI概述到启动时机,再到SystemUIService的启动步骤,揭示了SystemUI如何在Android系统启动过程中初始化并创建关键组件。SystemUI作为系统级别的UI组件,其启动与普通应用不同,主要由system_server进程在特定阶段启动。SystemUIService的启动涉及多个服务的初始化,通过SystemUIApplication批量启动子服务,实现系统组件的功能。
摘要由CSDN通过智能技术生成

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
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值