相关文章
Android系统启动流程(1) —— 解析init进程启动过程
Android系统启动流程(2) —— 解析Zygote进程启动过程
Android系统启动流程(4) —— 解析Launcher启动过程
SystemServer 启动过程
SystemServer 进程主要用于创建系统服务,我们熟知的 AMS、WMS和PMS 都是由它来创建的,因此掌握 SystemServer 进程是如何启动的,它在启动时做了哪些工作是十分必要的,这篇文章主要分析Android8.1系统的SystemServer进程的启动流程。
1. Zygote 处理 SystemServer 进程
在Android系统启动流程(2)中讲到了Zygote进程启动了SystemServer进程,本篇文章来讲解Zygote是如何处理SystemServer进程的。
在ZygoteInit.java的forkSystemServer方法中启动了SystemServer进程,代码如下所示:
frameworks/base/core/java/com/android/internal/os/Zygotelnit.java
private static Runnable forkSystemServer(String abiList, String socketName,
ZygoteServer zygoteServer) {
...
/* For child process */
// 当前运行在SystemServer进程中
if (pid == 0) {
if (hasSecondZygote(abiList)) {
waitForSecondaryZygote(socketName);
}
// 关闭Zygote进程创建的Socket
zygoteServer.closeServerSocket(); // ... 1
return handleSystemServerProcess(parsedArgs); // ... 2
}
return null;
}
SystemServer 进程复制了 Zygote 进程的地址空 间,因此也 得到 Zygote 进程创建的Socket ,这个 Socket 对于 SystemServer进程没有什么 用处, 因此, 要注释1处的代码来关闭 Socket ,接着 在注释2 处调用 handleSystemServerProcess 方法来启动 SystemServer 进程。 handleSystemServerProcess 方法的代码如下所:
frameworks/base/core/java/com/android/internal/os/Zygotelnit.java
/**
* Finish remaining work for the newly forked system server process.
*/
private static Runnable handleSystemServerProcess(ZygoteConnection.Arguments parsedArgs) {
...
if (parsedArgs.invokeWith != null) {
...
} else {
ClassLoader cl = null;
if (systemServerClasspath != null) {
cl = createPathClassLoader(systemServerClasspath, parsedArgs.targetSdkVersion); // ... 1
Thread.currentThread().setContextClassLoader(cl);
}
/*
* Pass the remaining arguments to SystemServer.
*/
return ZygoteInit.zygoteInit(parsedArgs.targetSdkVersion, parsedArgs.remainingArgs, cl); // ... 2
}
/* should never reach here */
}
注释2处调用了 Zygotelnit.zygotelnit 方法,代码如下所示:
frameworks/base/core/java/com/android/internal/os/Zygotelnit.java
public static final Runnable zygoteInit(int targetSdkVersion, String[] argv, ClassLoader classLoader) {
if (RuntimeInit.DEBUG) {
Slog.d(RuntimeInit.TAG, "RuntimeInit: Starting application from zygote");
}
Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "ZygoteInit");
RuntimeInit.redirectLogStreams();
RuntimeInit.commonInit();
// 启动Binder线程池
ZygoteInit.nativeZygoteInit(); // ... 1
// 进入SystemServer的main方法
return RuntimeInit.applicationInit(targetSdkVersion, argv, classLoader); // ... 2
}
在注释1处调用 nativeZygotelnit 方法, 看方法的名称就知道调用的是 Native 层的代码,用来启动 Binder 线程池,这样 SystemServer 进程就可以使用 Binder 与其他进程进行通信了。注释2处是用于进入 SystemServer的main方法,现在分别对注释 1和注释2的内容进行介绍。
1. 启动 Binder 线程池
nativeZygotelnit是一个Native 方法,因此我们先要了解它对应的 JNI 文件,代码如下所示:
frameworks/base/core/jni/AndroidRuntime.cpp
int register_com_android_internal_os_ZygoteInit_nativeZygoteInit(JNIEnv* env)
{
const JNINativeMethod methods[] = {
{ "nativeZygoteInit", "()V",
(void*) com_android_internal_os_ZygoteInit_nativeZygoteInit },
};
return jniRegisterNativeMethods(env, "com/android/internal/os/ZygoteInit",
methods, NELEM(methods));
}
通过 JNI的 gMethods 数组,可以看出 nativeZygotelnit 方法对应的是 JNI 文件 An droidRuntime.cpp的com_ android _ internal_ os _z ygotelnit_ nativeZ ygoteln it 函数:
frameworks/base/core/jni/AndroidRuntime.cpp
static void com_android_internal_os_ZygoteInit_nativeZygoteInit(JNIEnv* env, jobject clazz)
{
gCurRuntime->onZygoteInit();
}
这里 gCurR untime是 AndroidRuntime 类型的指针,具体指向的是 A ndroidRuntime的子类 AppRuntime ,它在 app _ main.cpp 中定义,我们接着来查看 AppRuntime的 onZygotelnit 方法,代码如下所示:
frameworks/base/cmds/app_process/app_main .cpp
virtual void onZygoteInit()
{
sp<ProcessState> proc = ProcessState::self();
ALOGV("App process: starting thread pool.\n");
proc->startThreadPool(); // ... 1
}
注释1 处的代码用来启动一个 Binder 线程池,这样 SystemServer 进程就可以使用 Binder与其他进程进行通了。看到这里我们知道 Runtimelnit.java的 nativeZygotelnit 函数主要是用来启动Binder 线程池的。
2. 进入 SystemServer的main 方法
我们再回到 Runtimelni t.j ava 的代码,在注释2处调 用了 Runtimelnit. applicationlnit 方法,代码如下所示:
frameworks/base/core/java/com/android/internal/os/Runtimelnit.java
protected static Runnable applicationInit(int targetSdkVersion, String[] argv,
ClassLoader classLoader) {
...
final Arguments args = new Arguments(argv);
...
return findStaticMain(args.startClass, args.startArgs, classLoader); // ... 1
}
在注释1处调用了findStaticMain发法,代码如下:
frameworks/base/core/java/com/android/internal/os/Runtimelnit.java
private static Runnable findStaticMain(String className, String[] argv,
ClassLoader classLoader) {
Class<?> cl;
try {
// 通过反射得到SystemServer类
cl = Class.forName(className, true, classLoader); // ... 1
} catch (ClassNotFoundException ex) {
throw new RuntimeException(
"Missing class when invoking static main " + className,
ex);
}
Method m;
try {
// 找到SystemServer的mian方法
m = cl.getMethod("main", new Class[] { String[].class }); // ... 2
} catch (NoSuchMethodException ex) {
throw new RuntimeException(
"Missing static main on " + className, ex);
} catch (SecurityException ex) {
throw new RuntimeException(
"Problem getting static main on " + className, ex);
}
int modifiers = m.getModifiers();
if (! (Modifier.isStatic(modifiers) && Modifier.isPublic(modifiers))) {
throw new RuntimeException(
"Main method is not public and static on " + className);
}
/*
* This throw gets caught in ZygoteInit.main(), which responds
* by invoking the exception's run() method. This arrangement
* clears up all the stack frames that were required in setting
* up the process.
*/
return new MethodAndArgsCaller(m, argv); // ... 3
}
注释1处的 className为 com.android.server.SystemServer ,通过反射返回的 cl 为SystemServer 类。在注释2 处找到 SystemServ er 中的 main 方法。在注释3处将找到的 main 方法传入 MethodAndArgsCaller 类中,MethodAndArgsCaller 实现了Runnable接口,代码如下:
frameworks/base/core/java/com/android/internal/os/Runtimelnit.java
static class MethodAndArgsCaller implements Runnable {
/** method to call */
private final Method mMethod;
/** argument array */
private final String[] mArgs;
public MethodAndArgsCaller(Method method, String[] args) {
mMethod = method;
mArgs = args;
}
public void run() {
try {
// 通过invoke调用SystemServer的main方法
mMethod.invoke(null, new Object[] { mArgs }); // ... 1
} catch (IllegalAccessException ex) {
throw new RuntimeException(ex);
} catch (InvocationTargetException ex) {
Throwable cause = ex.getCause();
if (cause instanceof RuntimeException) {
throw (RuntimeException) cause;
} else if (cause instanceof Error) {
throw (Error) cause;
}
throw new RuntimeException(ex);
}
}
}
}
Runtimelnit中findStaticMain方法会将MethodAndArgsCaller返回给Zygotelnit的zygoteInit方法,Zygotelnit的zygoteInit又将MethodAndArgsCaller返回给Zygotelnit的handleSystemServerProcess方法,Zygotelnit的handleSystemServerProcess方法又将MethodAndArgsCaller返回给Zygotelnit的forkSystemServer方法,最后Zygotelnit的forkSystemServer方法又将MethodAndArgsCaller放回给Zygotelnit的main方法,Zygote的main方法代码如下:
public static void main(String argv[]) {
ZygoteServer zygoteServer = new ZygoteServer();
...
try {
...
if (startSystemServer) {
Runnable r = forkSystemServer(abiList, socketName, zygoteServer); // ... 1
// {@code r == null} in the parent (zygote) process, and {@code r != null} in the
// child (system_server) process.
if (r != null) {
r.run(); // ... 2
return;
}
}
...
} catch (Throwable ex) {
Log.e(TAG, "System zygote died with exception", ex);
throw ex;
} finally {
zygoteServer.closeServerSocket();
}
...
}
在注释1处forkSystemServer方法返回的Runnable对象就是MethodAndArgsCaller对象,然后在注释2处调用r.run()方法实质上调用的就是MethodAndArgsCaller类中的run方法,这样就调用到了SystemServer的main方法了。
2 解析 SystemServer 进程
下面来查看 SystemServer的 main方法 ,代码如下:
frameworks/base/services/java/com/android/server/SystemServer.java
public static void main(String[] args) {
new SystemServer().run();
}
在main方法中,只调用了SystemServer的run方法,代码如下:
frameworks/base/services/java/com/android/server/SystemServer.java
private void run() {
try {
...
// 创建消息Looper
Looper.prepareMainLooper();
// 加载了动态库libandroid_servers.so
// Initialize native services.
System.loadLibrary("android_servers"); // ... 1
// Check whether we failed to shut down last time we tried.
// This call may not return.
performPendingShutdown();
// 创建系统的Context
// Initialize the system context.
createSystemContext();
// Create the system service manager.
mSystemServiceManager = new SystemServiceManager(mSystemContext); // ... 2
mSystemServiceManager.setRuntimeRestarted(mRuntimeRestart);
LocalServices.addService(SystemServiceManager.class, mSystemServiceManager);
// Prepare the thread pool for init tasks that can be parallelized
SystemServerInitThreadPool.get();
} finally {
traceEnd(); // InitBeforeStartServices
}
// Start services.
try {
traceBeginAndSlog("StartServices");
// 启动引导服务
startBootstrapServices(); // ... 3
// 启动核心服务
startCoreServices(); // ... 4
// 启动其他服务
startOtherServices(); // ... 5
SystemServerInitThreadPool.shutdown();
} catch (Throwable ex) {
Slog.e("System", "******************************************");
Slog.e("System", "************ Failure starting system services", ex);
throw ex;
} finally {
traceEnd();
}
...
}
在注释1处加载了动态库libandroid_servers.so 。接下来在注释2处创建SystemServiceManager, 它会对系统服务进行创建、启动和生命周期管理。在注释3处的startBootstrapServices 方法中启动了 ActivityManagerService 、PowerManagerService、PackageManagerService 等服务,在注释4处的 startCoreServices 方法中则启动了 DropBoxManagerService、BatteryService、UsageStatsService和WebViewUpdateService 。 在注释5处的 startOtherServices 方法中启动了 CameraService、AlarmManagerService、VrManagerService 等服务。这些服务的父类均为 SystemService 。从注释3、4 、5的方法中可以看出,Google把系统服务分为了三种类型,分别是引导服务、核心服务和其他服务,其中其他服务是一些非紧要和不需要立即启动的服务。这些系统服务总共有100多个,下表列出部分系统服务及其作用。
部分系统服务及其作用
引导服务 | 作 用 |
Installer | 系统安装 apk 时 的一 个服务类,启动完成 In sta ll er 服务之后才能启动其 他的系统服务 |
ActivityManagerService | 负责四大组件的启动、切换、调度 |
PowerManagerService | 计算系统中和 Power 相关的数据,然后决策系统应该如何反应 |
Ligh tsServ i ce | 管理和显示背光 LED |
DisplayManagerServce | 用来管理所有显示设备 |
UserManagerServ i ce | 多用户模式管理 |
SensorService | 为系统提供各种感应器服务 |
PackageManagerService | 用来对apk 进行安装、解析、删除、卸载等操作 |
...... | ...... |
核心服务 | |
DropBoxManagerService | 用于生成和管理系统运行时的 些日志文件 |
Battery Service | 管理电池相关的服务 |
UsageStatsService | 收集用户使用每一个A pp的 频率、使用 时长 |
Web ViewUpdateService | Web View 更新服务 |
其他服务 | |
CameraService | 摄像头相关服务 |
A l armManagerService | 全局定时器管理服务 |
InputManagerService | 管理输入事件 |
WindowManagerService | 窗口管理服务 |
VrManagerService | VR 模式管理服务 |
B lu etoothService | 蓝牙管理服务 |
No tific at ion Ma n agerService | 通知管理服务 |
DeviceStorageMonitorService | 存储相关管理服务 |
LocationManagerService | 定位管理服务 |
A udi oServ i ce | 音频相关管理服务 |
...... | ...... |
这些系统服务启动逻辑是相似的,这里以启动 PowerManagerService 来进行举例,代码如下所示:
frameworks/base/services/java/com/android/server/SystemServer.java
mPowerManagerService = mSystemServiceManager.startService(PowerManagerService.class);
SystemServiceManager的startService 方法启动了 PowerManagerService,startService 方法如下所示:
frameworks/base/services/core/java/com/android/server/SystemServiceManager.java
public void startService(@NonNull final SystemService service) {
// Register it.
mServices.add(service); // ... 1
// Start it.
long time = SystemClock.elapsedRealtime();
try {
service.onStart(); // ... 2
} catch (RuntimeException ex) {
throw new RuntimeException("Failed to start service " + service.getClass().getName()
+ ": onStart threw an exception", ex);
}
warnIfTooLong(SystemClock.elapsedRealtime() - time, service, "onStart");
}
在注释1处将 Pow erManagerServ ice 添加到 mS ervices 中,其中 mServ ices是一 个存储 SystemService 类型的 Array List ,这样就完成了 PowerManagerService 的注册工作 。在注释2 处调用 PowerManagerServ ice的 onStart 方法 完 成启动 PowerManag erService。
除了用mSystemServiceManager的 startServi ce 方法 来 启动系统 服务之外,也可以通过如下形式来启动系统服务,以 PackageManagerServ ic 为例:
frameworks/base/services/java/com/android/server/SystemServer.java
mPackageManagerService = PackageManagerService.main(mSystemContext, installer,
mFactoryTestMode != FactoryTest.FACTORY_TEST_OFF, mOnlyCore);
直接 调用了 PackageManagerService的 main 方法,代码如下:
public static PackageManagerService main(Context context, Installer installer,
boolean factoryTest, boolean onlyCore) {
// Self-check for initial settings.
PackageManagerServiceCompilerMapping.checkProperties();
PackageManagerService m = new PackageManagerService(context, installer,
factoryTest, onlyCore); // ... 1
m.enableSystemUserPackages();
ServiceManager.addService("package", m); // ... 2
final PackageManagerNative pmn = m.new PackageManagerNative();
ServiceManager.addService("package_native", pmn);
return m;
}
在注释1 处直接创建 PackageManagerService 并在注释2 处将 PackageManagerService 注册到 ServiceManager 中, ServiceManager 用来管理系统中的各种 Service ,用于系统 C/S 架构中的 B inder 通信机制: C li ent 端要使用某个 Service ,则需要先到 ServiceManager 查询 Service 的相关信息,然后根据 Service 的相关信息与 Service 所在的 Serv er 进程建立通信通
路,这样 Client 端就可以使用 Service 了。
3 SystemServer 进程总结
SystemServer 进程被创建后,主要做了如下工作:
(1 )启动 Binder 线程池,这样就可以与其他进程进行通信。
(2 )创建 SystemServiceManager ,用于对系统的服务进行创建、启动和生命周期管理。
(3 )启动各种系统服务。