在 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 启动,接管桌面。