AOSP15的SystemServer启动流程源码分析

38 阅读4分钟

在 AOSP 15 中,SystemServer 的启动是 Android 系统从“内核/引导层”向“应用框架层”跨越的核心里程碑。

一、流程图

以下是 SystemServer 从被孵化到完全就绪的完整源码流转分析

二、第一阶段:从 Zygote 中诞生 (Native -> Java)

SystemServer 并非独立启动,而是由 Zygote 进程通过 fork 机制创建。

1. ZygoteInit.forkSystemServer():

  • 在 Zygote 启动脚本中解析到需要启动系统服务。
  • Native 层处理:调用 com_android_internal_os_Zygote.cpp,进行进程分裂。此时会配置 SELinux 标签 (u:r:system_server:s0) 和 Capabilities(如 CAP_NET_ADMIN)。

2. handleSystemServerProcess():

  • 子进程(SystemServer)关闭来自 Zygote 的 Socket。
if (pid == 0) {
    if (hasSecondZygote(abiList)) {
         waitForSecondaryZygote(socketName);
    }
    zygoteServer.closeServerSocket();
    return handleSystemServerProcess(parsedArgs);
}
  • SystemServer是复制Zygote的进程,因此也会包含Zygote的zygoteServer,对于SystemServer没有其他作用,需要先将其关闭;通过调用handleSystemServerProcess:
private static Runnable handleSystemServerProcess(ZygoteArguments parsedArgs) {
        // 省略...
        final String systemServerClasspath = Os.getenv("SYSTEMSERVERCLASSPATH");
      
        if (parsedArgs.mInvokeWith != null) {
            // 省略...
            // 执行system/bin/可知执行文件
            WrapperInit.execApplication(parsedArgs.mInvokeWith,
                    parsedArgs.mNiceName, parsedArgs.mTargetSdkVersion,
                    VMRuntime.getCurrentInstructionSet(), null, args);

        } else {
            // 创建createPathClassLoader(systemServerClasspath, VMRuntime.SDK_VERSION_CUR_DEVELOPMENT)
            ClassLoader cl = getOrCreateSystemServerClassLoader();
            if (cl != null) {
                Thread.currentThread().setContextClassLoader(cl);
            }
            return ZygoteInit.zygoteInit(parsedArgs.mTargetSdkVersion,
                    parsedArgs.mDisabledCompatChanges,
                    parsedArgs.mRemainingArgs, cl);
        }

        /* should never reach here */
}

3. ZygoteInit.zygoteInit():

  • 创建PathClassLoader然后又调用ZygoteInit.zygoteInit
    public static Runnable zygoteInit(int targetSdkVersion, long[] disabledCompatChanges,
            String[] argv, ClassLoader classLoader) {
A        // 省略...
        RuntimeInit.commonInit();
        // 启动一下binder线程池
        ZygoteInit.nativeZygoteInit();
        return RuntimeInit.applicationInit(targetSdkVersion, disabledCompatChanges, argv,
                classLoader);
    }
  • 先调用ZygoteInit.nativeZygoteInit(),是一个native方法,实现在AndroidRuntime里面,最后调到app_main.cpp的onZygoteInit,来启动binder线程池:
    virtual void onZygoteInit()
    {
        sp<ProcessState> proc = ProcessState::self();
        ALOGV("App process: starting thread pool.\n");
        proc->startThreadPool();
    }

4. RuntimeInit.applicationInit():

  • 接下来调用RuntimeInit.applicationInit(targetSdkVersion, argv, classLoader);
    protected static Runnable applicationInit(int targetSdkVersion, long[] disabledCompatChanges,
            String[] argv, ClassLoader classLoader) {
        // 省略...
        // Remaining arguments are passed to the start class's static main
        return findStaticMain(args.startClass, args.startArgs, classLoader);
    }

5. RuntimeInit.findStaticMain():

  • applicationInit主要就是实现寻找startClass中的main方法,然后构造一个Runable,对应的run方法就是调用main方法
    protected static Runnable findStaticMain(String className, String[] argv,
            ClassLoader classLoader) {
        // 省略...    
        Class<?> cl = Class.forName(className, true, classLoader);
       // 省略...
        Method m = cl.getMethod("main", new Class[] { String[].class });
        // 省略...
        return new MethodAndArgsCaller(m, argv);
    }

6. RuntimeInit.MethodAndArgsCaller():

  • applicationInit主要就是实现寻找startClass中的main方法,然后构造一个Runable,对应的run方法就是调用main方法
    static class MethodAndArgsCaller implements Runnable {

        private final Method mMethod;

        private final String[] mArgs;

        public MethodAndArgsCaller(Method method, String[] args) {
            mMethod = method;
            mArgs = args;
        }

        public void run() {
            mMethod.invoke(null, new Object[] { mArgs });
        }
    }

7. args.startClass

所以这里就是关键确定startClass是谁这里又得回到开始ZygoteInit类的forkSystemServer: 有如下参数:

    String[] args = {
        "--setuid=1000",
        "--setgid=1000",
        "--setgroups=1001,1002,1003,1004,1005,1006,1007,1008,1009,1010,1018,1021,1023,"
                 + "1024,1032,1065,3001,3002,3003,3005,3006,3007,3009,3010,3011,3012",
        "--capabilities=" + capabilities + "," + capabilities,
        "--nice-name=system_server",
        "--runtime-args",
        "--target-sdk-version=" + VMRuntime.SDK_VERSION_CUR_DEVELOPMENT,
        "com.android.server.SystemServer",
    };

8. new SystemServer().run()

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

三、 第二阶段:SystemServer.run() 环境初始化

进入 SystemServer.java 后,核心逻辑集中在 run() 方法中:

private void run() {
        	//创建Looper对象
            Looper.prepareMainLooper();
            // 加载系统android_servers的库
            System.loadLibrary("android_servers");
            //创建系统的Context
            createSystemContext()
			mSystemServiceManager = new SystemServiceManager(mSystemContext);
            mSystemServiceManager.setRuntimeRestarted(mRuntimeRestart);
            LocalServices.addService(SystemServiceManager.class, mSystemServiceManager);
	 		//省略。。
            //启动引导服务
            startBootstrapServices();
            //启动核心服务
            startCoreServices();
            //启动其他服务
            startOtherServices();
           //省略。。
           Looper.loop();     
}

1. Looper.prepareMainLooper();

主要目的就是创建好Looper对象,因为system server的主线程和普通app主线程一样是一个Loop管理的消息循环

2. createSystemContext();

表示创建一个systemContext,Context不仅仅在普通app中非常重要,在system server中也一样,需要通过Context这个纽带来,获取一些进程的信息环境

3. mSystemServiceManager

mSystemServiceManager = new SystemServiceManager(mSystemContext);这里创建了一个SystemServiceManager的类对象,而且放入了LocalServices中,其实这里的SystemServiceManager和常见binder中的ServiceManager还是不一样的,SystemServiceManager只是System Server中一个普通的类,他负责保存了各个SystemService的全局变量角色,本身不涉及跨进程,而ServiceManager可以与binder跨进除等是强关联

4. 重点服务启动

A. startBootstrapServices()->引导服务 (Bootstrap Services)

这些服务是系统运行的基石,必须最早启动,无依赖。

  • Watchdog:监控 SystemServer 是否死锁。
  • ActivityManagerService (AMS):管理所有 Activity 生命周期。
  • PowerManagerService:管理屏幕状态、亮度。
  • PackageManagerService (PMS):扫描系统中安装的所有 APK。
  • DisplayManagerService:获取物理屏幕信息。

B. startCoreServices()->核心服务 (Core Services)

不直接依赖 UI,但属于系统核心逻辑。

  • BatteryService:监控电池电量。
  • UsageStatsService:记录应用使用时长。
  • WebViewUpdateService:确保 WebView 组件可用。

C. startOtherServices()->其他服务 (Other Services)

通常涉及 UI 交互、网络和外设。

  • WindowManagerService (WMS):负责窗口布局。
  • InputManagerService:处理触摸屏和按键事件。
  • startSystemUi():启动 SystemUI 进程(状态栏、锁屏)。
  • ConnectivityService:管理 Wi-Fi 和移动网络。

第三阶段:UI 移交与 Direct Boot 逻辑

在所有服务完成 onStart() 后,SystemServer 开始引导用户界面。

1. systemReady: 只列出了简单几个systemReady方法

①. WMS.systemReady():

  • WMS 开始计算初始屏幕布局。

②. AMS.systemReady():

  • 这是关键点。AMS 会尝试启动“Home” Activity。

2. Direct Boot 决策:

  • 如果设备未解锁 (FBE 状态):
    • PackageManager 只允许标记了 android:directBootAware="true" 的应用运行。
    • FallbackHome 被选中启动,显示“Android 正在启动”或锁屏界面。
  • 如果设备已解锁:
    • Launcher3 启动,接管桌面。