SystemServer启动Launcher流程

本文详细解析了Android系统开机后,从SystemServer启动Launcher的流程。通过SystemServer、ActivityManagerService、ActivityStartController等组件,描述了从系统进程到应用进程的过程,涉及Binder通信、AMS的启动及ActivityStackSupervisor的角色。流程包括SystemServer的启动、AMS的systemReady方法、启动HomeActivity等步骤,最后通过时序图直观展示整个启动过程。

了解过Launcher(桌面)的人都知道launcher作为桌面是用户开机解锁后看到的第一个页面,其本质上就是一个Activity。因此,它的启动自然少不了AMS(ActivityMangerService)的参与,对于Service的统一管理,必然少不了SystemServer的参与。本文主要梳理Android系统开机之后,从SystemServer开始启动Launcher的流程。

由SystemServer启动Launcher的简易流程图可知,该过程其实就是系统进程到应用进程的一个过程,他们之间通过Binder进行通信,并且相互作用来完成Launcher的启动。

SystemServer

    public static void main(String[] args) {
        new SystemServer().run();
    }

 zygote进程通过反射启动SystemServer的main方法调用run方法。

private void run() {
        try {
                ...
            // 实例化SystemServiceManager.
            mSystemServiceManager = new SystemServiceManager(mSystemContext);
            mSystemServiceManager.setStartInfo(mRuntimeRestart,
                    mRuntimeStartElapsedTime, mRuntimeStartUptime);
            LocalServices.addService(SystemServiceManager.class, mSystemServiceManager);
            // Prepare the thread pool for init tasks that can be parallelized
            SystemServerInitThreadPool.get();
        } finally {
            traceEnd();  // InitBeforeStartServices
        }
        // 启动关键服务.
        try {
            traceBeginAndSlog("StartServices");
            //启动BootstrapServices
            startBootstrapServices();
            startCoreServices(); //启动一些核心服务
            startOtherServices();
            SystemServerInitThreadPool.shutdown();
        } catch (Throwable ex) {
            Slog.e("System", "******************************************");
            Slog.e("System", "************ Failure starting system services", ex);
            throw ex;
        } finally {
            traceEnd();
        }
        ....

        //启动系统Looper开始消息循环.
        Looper.loop();
        throw new RuntimeException("Main thread loop unexpectedly exited");
    }

SystemServer里面加载android_servers的动态库 设置系统一些属性如时区、语言等 启动系统的服务如AMS、PMS、WMS等。

具体启动服务的代码调用在下面三个方法中。

startBootstrapServices();
startCoreServices();
startOtherServices();

关于启动ams和系统UI方面主要在startOtherServices中

mActivityManagerService.systemReady(() -> {
            Slog.i(TAG, "Making services ready");traceBeginAndSlog("StartActivityManagerReadyPhase");
           ....
            traceBeginAndSlog("StartSystemUI");
            try {
            //启动SystemUI的关键代码
                startSystemUi(context, windowManagerF);
            } catch (Throwable e) {
                reportWtf("starting System UI", e);
            }
           ....
        }, BOOT_TIMINGS_TRACE_LOG);

在SystemServer中调用ams的systemReady方法。

ActivityManagerService

systemReady关键代码如下

public void systemReady(final Runnable goingCallback, TimingsTraceLog traceLog) {
        ...            
        //回调SystemServer的方法启动SystemUI
        if (goingCallback != null) goingCallback.run();
        ...
        //启动activity
            startHomeActivityLocked(currentUserId, "systemReady");

    ...
            mStackSupervisor.resumeFocusedStackTopActivityLocked();
    ....
        }
    }

startHomeActivityLocked方法获取Launcher应用程序的intent并且通过系列方法启动。

boolean startHomeActivityLocked(int userId, String reason) {
        if (mFactoryTest == FactoryTest.FACTORY_TEST_LOW_LEVEL
                && mTopAction == null) {
            return false;
        }
        //获取Launcher的Intent
        Intent intent = getHomeIntent();
        ActivityInfo aInfo = resolveActivityInfo(intent, STOCK_PM_FLAGS, userId);
        if (aInfo != null) {
            in
<think>嗯……用户这次想详细了解Android13Launcher启动流程。之前用户似乎尝试过参考站内引用,但那些引用可能不太相关。需要特别注意用户明确要求的是“详解”,说明ta需要深度技术细节。用户可能是Android系统开发者或Framework工程师,正在排查Launcher启动性能问题。从ta精准提出“AN13”这个缩写看,具备一定专业基础。不过要注意避免堆砌代码,需要用中文清晰解释机制。回顾自己上次回答的结构:从SystemServer启动Launcher开始,逐步说明进程创建、Application初始化、Activity启动三阶段,还列出了关键类名。这次需要更突出AN13的特性,比如:1.新增的LauncherEffects类在启动时的作用2.资源预加载机制的改进点3.与Treble架构的交互细节但要注意用户没问优化方向,重点还是流程本身。最需要讲清楚的是跨进程通信部分——ActivityTaskManagerService如何绑定到Launcher进程,这往往是性能瓶颈所在。可以补充个时序图说明,但用户没要求就暂不提供。发现用户提到“尽可能参考上次回答”,说明ta认可之前的叙述逻辑。这次继续沿用四阶段划分法(系统准备/进程启动/组件初始化/界面渲染),但要把AN13的变更点穿插进去,比如SystemServer初始化阶段就预加载图标资源的新策略。</think> 以下是Android 13 Launcher启动流程的详细解析,结合关键系统组件逐步展开: --- ### **一、系统启动阶段** 1. **init进程启动** - Linux内核加载后启动`/system/bin/init`进程 - 解析`init.rc`文件,启动`Zygote`和服务管理器`ServiceManager` 2. **Zygote初始化** - 加载核心类库和资源 ```java // frameworks/base/core/java/com/android/internal/os/ZygoteInit.java preloadClasses(); // 预加载2000+系统类 preloadResources(); // 加载系统资源 ``` - 启动`system_server`进程(系统服务核心) --- ### **二、系统服务启动** 3. **SystemServer启动** - 启动核心服务: - `ActivityManagerService` (AMS) - `PackageManagerService` (PMS) - `WindowManagerService` (WMS) - PMS扫描APK时识别Launcher组件的`<intent-filter>`: ```xml <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.HOME" /> </intent-filter> ``` --- ### **三、Launcher进程启动** 4. **AMS触发启动** - 当系统服务就绪后,AMS通过**Binder IPC**调用: ```java // frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java startHomeActivityLocked(userId, "systemReady"); ``` - 查询具有`CATEGORY_HOME`的Activity,优先启动默认Launcher 5. **进程创建流程** - AMS请求Zygote孵化新进程 ```shell zygote_socket --> fork()新进程 --> 执行ActivityThread.main() ``` - Launcher进程初始化: ```java // frameworks/base/core/java/android/app/ActivityThread.java attach(false); // 绑定应用进程到AMS Application.onCreate(); // 创建Launcher应用实例 ``` --- ### **四、组件初始化** 6. **LauncherApplication创建** - 初始化核心对象: ```java // packages/apps/Launcher3/src/com/android/launcher3/LauncherApp.java super.onCreate(); mIconCache = new IconCache(this); // 图标缓存 mModel = new LauncherModel(this); // 数据模型 ``` - 注册广播接收器(应用安装/卸载事件) 7. **主Activity启动** - `Launcher` Activity启动流程: ```java onCreate() → loadWorkspace() // 加载桌面布局 → bindWorkspace() // 绑定图标和小部件 ``` - 关键视图创建: ```java mDragLayer = (DragLayer) findViewById(R.id.drag_layer); mWorkspace = (Workspace) findViewById(R.id.workspace); ``` --- ### **五、界面渲染流程** 8. **数据加载与绑定** - `LauncherModel`异步加载数据: ```java LoaderTask.run() → loadAllApps() // 加载所有应用 → bindItems() // 通知主线程更新UI ``` - 使用`Handler`消息机制同步UI更新 9. **窗口系统连接** - 通过`WindowSession`与WMS通信 - 完成DecorView的添加: ```java // ViewRootImpl建立 mWindow = addView(decorView, layoutParams); ``` - SurfaceFlinger合成最终界面 --- ### **AN13特有变化** 1. **壁纸深度集成** - 新增`WallpaperEffects`渲染管道 - 启动阶段预加载壁纸着色器 2. **资源预编译优化** - 系统编译时生成`assets/compiled_icons` - 减少启动时资源解析耗时 --- ### **流程图解** ```mermaid graph TD A[Linux Kernel] --> B(init进程) B --> C[Zygote] C --> D[SystemServer] D --> E[ActivityManagerService] E --> F{查询CATEGORY_HOME组件} F --> G[启动Launcher进程] G --> H[创建LauncherApplication] H --> I[初始化数据模型] I --> J[加载工作区] J --> K[绑定UI元素] ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值