zoukankan      html  css  js  c++  java
  • 从源码角度看Android系统SystemServer进程启动过程

    copy frome :https://blog.csdn.net/salmon_zhang/article/details/93208135

    SystemServer进程是由Zygote进程fork生成,进程名为system_server,主要用于创建系统服务。

    备注:本文将结合Android8.0的源码看SystemServer进程的启动过程以及SystemServer进程做了哪些重要工作。

    1. SystemServer进程启动的起点
    从《从源码角度看Android系统Zygote进程启动过程》一文中可知:Zygote进程启动过程中会调用startSystemServer方法,而startSystemServer函数是system_server进程启动流程的起点。

    代码路径:frameworks/base/core/java/com/android/internal/os/ZygoteInit.java

    深入到startSystemServer函数中:

    private static boolean startSystemServer(String abiList, String socketName, ZygoteServer zygoteServer)
    throws Zygote.MethodAndArgsCaller, RuntimeException {

    ...省略...

    //参数准备,args数组中保存启动SystemServer的启动参数
    String args[] = { //注释1
    "--setuid=1000",
    "--setgid=1000",
    "--setgroups=1001,1002,1003,1004,1005,1006,1007,1008,1009,1010,1018,1021,1023,1032,3001,3002,3003,3006,3007,3009,3010",
    "--capabilities=" + capabilities + "," + capabilities,
    "--nice-name=system_server",
    "--runtime-args",
    "com.android.server.SystemServer",
    };
    ZygoteConnection.Arguments parsedArgs = null;
    int pid;
    try {
    //用于解析参数,生成目标格式
    parsedArgs = new ZygoteConnection.Arguments(args); //注释2
    ZygoteConnection.applyDebuggerSystemProperty(parsedArgs);
    ZygoteConnection.applyInvokeWithSystemProperty(parsedArgs);

    //fork子进程,也是创建SystemServer进程
    pid = Zygote.forkSystemServer( //注释3
    parsedArgs.uid, parsedArgs.gid,
    parsedArgs.gids,
    parsedArgs.debugFlags,
    null,
    parsedArgs.permittedCapabilities,
    parsedArgs.effectiveCapabilities);
    } catch (IllegalArgumentException ex) {
    throw new RuntimeException(ex);
    }

    //运行在子进程中
    if (pid == 0) {
    if (hasSecondZygote(abiList)) {
    waitForSecondaryZygote(socketName);
    }
    //关闭zygote原有的socket
    zygoteServer.closeServerSocket();
    //处理SystemServer进程
    handleSystemServerProcess(parsedArgs); //注释4
    }
    return true;
    }
    注释解析:

    注释1创建args数组,主要用来保存启动SystemServer的启动参数。
    其中:

    可以看出SystemServer进程的的用户id和用户组id都被设置为了1000,并且拥有用户组1001-1010、1018、1021、1032、3001-3010的权限。

    进程名为:system_server

    启动的类名为:com.android.server.SystemServer

    注释2处将args数组封装成Arguments对象,并给注释3处的forkSystemServer函数调用

    注释3处调用Zygote的forkSystemServer方法,其内部会调用nativeForkSystemServer这个Native方法,nativeForkSystemServer会通过fork函数在当前进程创建一个子进程,即SystemServer进程。

    注释4处理SystemServer进程

    2. 创建SystemServer进程
    2.1 forkSystemServer
    通过上面的注释3可知:是调用Zygote的forkSystemServer方法去创建SystemServer进程。

    代码路径:frameworks/base/core/java/com/android/internal/os/Zygote.java

    深入到函数forkSystemServer中:

    public static int forkSystemServer(int uid, int gid, int[] gids, int debugFlags,
    int[][] rlimits, long permittedCapabilities, long effectiveCapabilities) {
    VM_HOOKS.preFork();
    // Resets nice priority for zygote process.
    resetNicePriority();
    //调用natvie方法fork system_server进程
    int pid = nativeForkSystemServer(
    uid, gid, gids, debugFlags, rlimits, permittedCapabilities, effectiveCapabilities);
    if (pid == 0) {
    Trace.setTracingEnabled(true);
    }
    VM_HOOKS.postForkCommon();
    return pid;
    }

    备注:这里继续往下看,需要懂一点JNI原理,这里不做介绍,后续会单独写一篇《JNI学习总结》。

    nativeForkSystemServer()方法是在AndroidRuntime.cpp中注册的,通过com_android_internal_os_Zygote.cpp中的register_com_android_internal_os_Zygote()方法建立native方法的映射关系的。

    2.2 nativeForkSystemServer
    进入到com_android_internal_os_Zygote.cpp中:

    代码路径:frameworks/base/core/jni/com_android_internal_os_Zygote.cpp

    nativeForkSystemServer方法在JNI层对应的方法是:com_android_internal_os_Zygote_nativeForkSystemServer

    深入到函数com_android_internal_os_Zygote_nativeForkSystemServer中:

    static jint com_android_internal_os_Zygote_nativeForkSystemServer(
    JNIEnv* env, jclass, uid_t uid, gid_t gid, jintArray gids,
    jint debug_flags, jobjectArray rlimits, jlong permittedCapabilities,
    jlong effectiveCapabilities) {
    //fork 子进程
    pid_t pid = ForkAndSpecializeCommon(env, uid, gid, gids,
    debug_flags, rlimits,
    permittedCapabilities, effectiveCapabilities,
    MOUNT_EXTERNAL_DEFAULT, NULL, NULL, true, NULL,
    NULL, NULL, NULL);
    if (pid > 0) {
    // zygote进程检测system_server进程是否创建
    gSystemServerPid = pid;
    int status;
    if (waitpid(pid, &status, WNOHANG) == pid) {
    ALOGE("System server process %d has died. Restarting Zygote!", pid);
    // 当system_server进程死亡后,重启zygote进程
    RuntimeAbort(env, __LINE__, "System server process has died. Restarting Zygote!");
    }
    }
    return pid;
    }
    从上面可知:

    1: 调用ForkAndSpecializeCommon()方法fork子进程

    2: 当system_server进程死亡后,会重启zygote进程

    扩展知识:

    在Android5.0以上时,会有两个zygote进程,分别是zygote和zygote64。一般在64位系统中system_server的父进程是zygote64。

    在64位系统中,kill system_server、zygote、zygote64三个进程是否重启的关系图如下:


    继续深入到ForkAndSpecializeCommon()方法中。

    2.3 ForkAndSpecializeCommon
    代码路径:frameworks/base/core/jni/com_android_internal_os_Zygote.cpp

    深入到ForkAndSpecializeCommon方法中:

    static pid_t ForkAndSpecializeCommon(JNIEnv* env, uid_t uid, gid_t gid, jintArray javaGids,
    jint debug_flags, jobjectArray javaRlimits,
    jlong permittedCapabilities, jlong effectiveCapabilities,
    jint mount_external,
    jstring java_se_info, jstring java_se_name,
    bool is_system_server, jintArray fdsToClose,
    jintArray fdsToIgnore,
    jstring instructionSet, jstring dataDir) {

    //设置子进程的signal信号处理
    SetSigChldHandler();

    ...省略...
    //fork 子进程
    pid_t pid = fork();
    // 进入子进程
    if (pid == 0) {

    ...省略...

    //关闭并清除文件描述符
    DetachDescriptors(env, fdsToClose);

    ...省略...

    if (!is_system_server) {//如果是非system_server子进程,则创建进程组
    int rc = createProcessGroup(uid, getpid());
    if (rc != 0) {
    if (rc == -EROFS) {
    ALOGW("createProcessGroup failed, kernel missing CONFIG_CGROUP_CPUACCT?");
    } else {
    ALOGE("createProcessGroup(%d, %d) failed: %s", uid, pid, strerror(-rc));
    }
    }
    }
    //设置group
    SetGids(env, javaGids);
    //设置资源limit
    SetRLimits(env, javaRlimits);

    ...省略...
    //selinux上下文
    rc = selinux_android_setcontext(uid, is_system_server, se_info_c_str, se_name_c_str);
    if (rc == -1) {
    ALOGE("selinux_android_setcontext(%d, %d, "%s", "%s") failed", uid,
    is_system_server, se_info_c_str, se_name_c_str);
    RuntimeAbort(env, __LINE__, "selinux_android_setcontext failed");
    }
    if (se_info_c_str == NULL && is_system_server) {
    se_name_c_str = "system_server";
    }
    if (se_info_c_str != NULL) {
    //设置线程名为system_server
    SetThreadName(se_name_c_str);
    }

    delete se_info;
    delete se_name;
    //设置子进程的signal信号处理函数为默认函数
    UnsetSigChldHandler();
    //等价于调用zygote.callPostForkChildHooks()
    env->CallStaticVoidMethod(gZygoteClass, gCallPostForkChildHooks, debug_flags,
    is_system_server, instructionSet);
    if (env->ExceptionCheck()) {
    RuntimeAbort(env, __LINE__, "Error calling post fork hooks.");
    }
    } else if (pid > 0) {
    //进入父进程(zygote进程)
    if (sigprocmask(SIG_UNBLOCK, &sigchld, nullptr) == -1) {
    ALOGE("sigprocmask(SIG_SETMASK, { SIGCHLD }) failed: %s", strerror(errno));
    RuntimeAbort(env, __LINE__, "Call to sigprocmask(SIG_UNBLOCK, { SIGCHLD }) failed.");
    }
    }
    return pid;
    }
    }

    到这里system_server进程就已经创建成功了。接下来就是system_server进程开始真正工作了。

    从前面的startSystemServer()方法中可知:zygote进程在执行forkSystemServer()方法后,即system_server进程创建后,就调用handleSystemServerProcess()方法处理system_server进程真正的工作。

    3. SystemServer进程启动后的准备工作
    3.1 handleSystemServerProcess
    代码路径:frameworks/base/core/java/com/android/internal/os/ZygoteInit.java

    深入到handleSystemServerProcess函数中:

    private static void handleSystemServerProcess(
    ZygoteConnection.Arguments parsedArgs)
    throws Zygote.MethodAndArgsCaller {

    //设置当前进程名为"system_server"
    if (parsedArgs.niceName != null) {
    Process.setArgV0(parsedArgs.niceName);
    }

    final String systemServerClasspath = Os.getenv("SYSTEMSERVERCLASSPATH");
    if (systemServerClasspath != null) {
    //执行dex优化操作
    performSystemServerDexOpt(systemServerClasspath); //注释1

    ...省略...
    }

    if (parsedArgs.invokeWith != null) {
    String[] args = parsedArgs.remainingArgs;
    if (systemServerClasspath != null) {
    String[] amendedArgs = new String[args.length + 2];
    amendedArgs[0] = "-cp";
    amendedArgs[1] = systemServerClasspath;
    System.arraycopy(args, 0, amendedArgs, 2, args.length);
    args = amendedArgs;
    }
    //启动应用进程
    WrapperInit.execApplication(parsedArgs.invokeWith,
    parsedArgs.niceName, parsedArgs.targetSdkVersion,
    VMRuntime.getCurrentInstructionSet(), null, args);
    } else {
    ClassLoader cl = null;
    if (systemServerClasspath != null) {
    cl = createPathClassLoader(systemServerClasspath, parsedArgs.targetSdkVersion); //注释2
    Thread.currentThread().setContextClassLoader(cl);
    }
    ZygoteInit.zygoteInit(parsedArgs.targetSdkVersion, parsedArgs.remainingArgs, cl); //注释3
    }

    /* should never reach here */
    }

    注释解析:

    注释1处执行dex优化操作

    注释2处创建类加载器,并赋予给当前线程

    注释3处调用 ZygoteInit的zygoteInit的方法

    3.2 performSystemServerDexOpt
    深入跟踪执行dex优化操作的逻辑。

    代码路径:frameworks/base/core/java/com/android/internal/os/ZygoteInit.java

    深入到performSystemServerDexOpt函数中:

    private static void performSystemServerDexOpt(String classPath) {
    final String[] classPathElements = classPath.split(":");
    //通过AIDL与installd建立连接
    final IInstalld installd = IInstalld.Stub
    .asInterface(ServiceManager.getService("installd"));
    final String instructionSet = VMRuntime.getRuntime().vmInstructionSet();

    String sharedLibraries = "";
    for (String classPathElement : classPathElements) {

    ...省略...

    if (dexoptNeeded != DexFile.NO_DEXOPT_NEEDED) {

    ...省略...

    try {
    //执行dex文件
    installd.dexopt(classPathElement, Process.SYSTEM_UID, packageName,
    instructionSet, dexoptNeeded, outputPath, dexFlags, compilerFilter,
    uuid, sharedLibraries, seInfo);
    } catch (RemoteException | ServiceSpecificException e) {
    Log.w(TAG, "Failed compiling classpath element for system server: "
    + classPathElement, e);
    }
    }

    if (!sharedLibraries.isEmpty()) {
    sharedLibraries += ":";
    }
    sharedLibraries += classPathElement;
    }
    }

    上面主要的操作就是将classPath字符串中的apk分别进行dex优化。而真正执行优化的工作是通过AIDL通信将命令参数传给installd来完成。

    3.3 zygoteInit
    深入跟踪上面3.1中注释3处的zygoteInit方法

    代码路径:frameworks/base/core/java/com/android/internal/os/ZygoteInit.java

    深入到zygoteInit函数中:

    public static final void zygoteInit(int targetSdkVersion, String[] argv,
    ClassLoader classLoader) throws Zygote.MethodAndArgsCaller {
    if (RuntimeInit.DEBUG) {
    Slog.d(RuntimeInit.TAG, "RuntimeInit: Starting application from zygote");
    }

    Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "ZygoteInit");
    //重定向log输出
    RuntimeInit.redirectLogStreams();
    //初始化通用信息
    RuntimeInit.commonInit();
    //zygote初始化
    ZygoteInit.nativeZygoteInit(); //注释1
    //进入SystemServer的main方法
    RuntimeInit.applicationInit(targetSdkVersion, argv, classLoader); //注释2
    }
    注释解析:

    注释1处调用Native层的代码,主要用来启动Binder线程池,从而SystemServer进程就可以使用Binder与其它进程进行通信。

    注释2处是用于进入SystemServer的main方法

    下面继续跟踪注释1和注释2的源码。

    3.4 nativeZygoteInit
    nativeZygoteInit是一个Native方法,在AndroidRuntime.cpp中,进行了jni映射。

    代码路径:frameworks/base/core/jni/AndroidRuntime.cpp

    int register_com_android_internal_os_ZygoteInit(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));
    }

    从上面可知:nativeZygoteInit()方法对应的是JNI文件AndroidRuntime.cpp中的com_android_internal_os_ZygoteInit_nativeZygoteInit函数:

    static void com_android_internal_os_ZygoteInit_nativeZygoteInit(JNIEnv* env, jobject clazz)
    {
    gCurRuntime->onZygoteInit();
    }

    其中:gCurRuntime是AndroidRuntime类型的指针,具体指向的是AndroidRuntime的子类AppRuntime,而AppRuntime又是定义在app_main.cpp中的内部类。

    故深入到app_main.cpp的内部类AppRuntime的onZygoteInit方法:

    virtual void onZygoteInit()
    {
    sp<ProcessState> proc = ProcessState::self();
    ALOGV("App process: starting thread pool. ");
    proc->startThreadPool(); //注释1
    }

    注释解析:

    注释1处启动了一个Binder线程池,这样SystemServer进程就可以使用Binder与其它进程进行通信了。
    3.5 applicationInit
    代码路径:frameworks/base/core/java/com/android/internal/os/RuntimeInit.java

    深入到applicationInit函数中:

    protected static void applicationInit(int targetSdkVersion, String[] argv, ClassLoader classLoader)
    throws Zygote.MethodAndArgsCaller {

    //true代表应用程序退出时不调用AppRuntime.onExit(),否则会在退出前调用
    nativeSetExitWithoutCleanup(true);

    //设置虚拟机的内存利用率参数值为0.75
    VMRuntime.getRuntime().setTargetHeapUtilization(0.75f);
    VMRuntime.getRuntime().setTargetSdkVersion(targetSdkVersion);

    final Arguments args;
    try {
    //解析参数
    args = new Arguments(argv);
    } catch (IllegalArgumentException ex) {
    Slog.e(TAG, ex.getMessage());
    return;
    }

    Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);

    //继续调用invokeStaticMain方法
    invokeStaticMain(args.startClass, args.startArgs, classLoader);
    }

    继续深入到invokeStaticMain方法中。

    3.6 invokeStaticMain
    代码路径:frameworks/base/core/java/com/android/internal/os/RuntimeInit.java

    深入到invokeStaticMain函数中:

    private static void invokeStaticMain(String className, String[] argv, ClassLoader classLoader)
    throws Zygote.MethodAndArgsCaller {
    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的main方法
    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);
    }
    //通过抛出异常,回到ZygoteInit.main()。这样做好处是能清空栈帧,提高栈帧利用率
    throw new Zygote.MethodAndArgsCaller(m, argv); //注释3
    }

    注释解析:

    注释1处的className为com.android.server.SystemServer,通过反射机制可以得到SystemServer类

    注释2处找到SystemServer中的main方法

    注释3处将找到的main方法传入到MethodAndArgsCaller异常中并抛出该异常,而捕获MethodAndArgsCaller异常的代码在ZygoteInit.java的main方法中,而这个方法又会调用SystemServer的main方法。

    疑问:为什么不在invokeStaticMain中直接调用SystemServer的main方法呢?

    因为:

    这种抛出异常的处理会清除所有的设置过程需要的堆栈帧,提高了栈帧利用率。

    让SystemServer的main方法看起来像是SystemServer进程的入口方法。

    备注:其实在Zygote启动了SystemServer进程后,在调用SystemServer的main方法之前,已经做了很多准备工作,从而使得SystemServer的main方法不像是SystemServer进程的入口方法,而通过抛出异常交由ZygoteInit.java的main方法来处理,会让SystemServer的main方法看起来像是SystemServer进程的入口方法。

    下面继续看ZygoteInit.java的main方法是如何捕获MethodAndArgsCaller异常:

    3.7 ZygoteInit.java中捕获MethodAndArgsCaller异常
    代码路径:frameworks/base/core/java/com/android/internal/os/ZygoteInit.java

    深入到捕获MethodAndArgsCaller异常的地方:

    public static void main(String argv[]) {

    ...省略...

    zygoteServer.closeServerSocket();
    } catch (Zygote.MethodAndArgsCaller caller) { // 捕获MethodAndArgsCaller异常
    caller.run();
    } catch (Throwable ex) {
    Log.e(TAG, "System zygote died with exception", ex);
    zygoteServer.closeServerSocket();
    throw ex;
    }
    }

    从捕获MethodAndArgsCaller异常的地方可知,当捕获到MethodAndArgsCaller异常时,会调用Zygote.java中的静态内部类MethodAndArgsCaller

    3.8 Zygote.java中的静态内部类MethodAndArgsCaller
    代码路径:frameworks/base/core/java/com/android/internal/os/Zygote.java

    深入到静态内部类MethodAndArgsCaller中:

    public static class MethodAndArgsCaller extends Exception
    implements Runnable {
    private final Method mMethod;

    private final String[] mArgs;

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

    public void run() {
    try {
    //根据传递过来的参数,可知此处通过反射机制调用的是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);
    }
    }
    }

    注释解析:

    注释1处的mMethod指的就是SystemServer的main方法。
    到此为止SystemServer的main方法就调用了,下面正式进入到SystemServer的main方法中。

    3.9 SystemServer进程时序图和函数调用流程图
    结合上面的源码跟踪分析,下面给出Zygote进程处理SystemServer进程时序图和启动流程图。

    时序图:


    启动流程图:


    4. SystemServer进程启动后的核心工作
    下面进入到SystemServer的main方法。

    代码路径:frameworks/base/services/java/com/android/server/SystemServer.java

    深入到main方法中:

    public static void main(String[] args) {
    //初始SystemServer对象,再调用run方法
    new SystemServer().run();
    }

    可以看到main方法中只调用了SystemServer的run方法。

    run方法如下:

    private void run() {
    try {
    traceBeginAndSlog("InitBeforeStartServices");
    //当系统时间比1970年更早,就设置当前系统时间为1970年
    if (System.currentTimeMillis() < EARLIEST_SUPPORTED_TIME) {
    Slog.w(TAG, "System clock is before 1970; setting to 1970.");
    SystemClock.setCurrentTimeMillis(EARLIEST_SUPPORTED_TIME);
    }


    //如果没有设置时区属性,则默认为GMT
    String timezoneProperty = SystemProperties.get("persist.sys.timezone");
    if (timezoneProperty == null || timezoneProperty.isEmpty()) {
    Slog.w(TAG, "Timezone not set; setting to GMT.");
    SystemProperties.set("persist.sys.timezone", "GMT");
    }

    ...省略...

    //设置虚拟机的库文件,在Android6.0上用的是libart.so
    SystemProperties.set("persist.sys.dalvik.vm.lib.2", VMRuntime.getRuntime().vmLibrary());

    ...省略...

    //清除vm内存增长上限,由于启动过程需要较多的虚拟机内存空间
    VMRuntime.getRuntime().clearGrowthLimit();

    //设置内存的可能有效使用率为0.8
    VMRuntime.getRuntime().setTargetHeapUtilization(0.8f);

    //针对部分设备依赖于运行时就产生指纹信息,因此需要在开机完成前已经定义
    Build.ensureFingerprintProperty();

    //访问环境变量前,需要明确地指定用户
    Environment.setUserRequired(true);

    //在系统服务器中,应该对任何传入的bundle进行解压缩,以避免抛出BadParcelableException
    BaseBundle.setShouldDefuse(true);

    //确保当前系统进程的binder调用,总是运行在前台优先级
    BinderInternal.disableBackgroundScheduling(true);

    //增加system_server中binder线程的数量
    BinderInternal.setMaxThreads(sMaxBinderThreads);

    //为主looper thread做准备
    android.os.Process.setThreadPriority(
    android.os.Process.THREAD_PRIORITY_FOREGROUND);
    android.os.Process.setCanSelfBackground(false);
    //创建消息Looper
    Looper.prepareMainLooper();

    //加载android_servers.so库,该库包含的源码在frameworks/base/services/目录下
    System.loadLibrary("android_servers");

    //检测上次关机过程是否失败,该方法可能不会返回
    performPendingShutdown(); //注释1

    //初始化系统上下文
    createSystemContext(); //注释2

    //创建系统服务管理
    mSystemServiceManager = new SystemServiceManager(mSystemContext); //注释3
    mSystemServiceManager.setRuntimeRestarted(mRuntimeRestart);
    //将mSystemServiceManager添加到本地服务的成员sLocalServiceObjects
    LocalServices.addService(SystemServiceManager.class, mSystemServiceManager);
    //为可以并行化的init任务准备线程池
    SystemServerInitThreadPool.get();
    } finally {
    traceEnd(); // InitBeforeStartServices
    }

    // Start services.
    try {
    traceBeginAndSlog("StartServices");
    //启动引导服务
    startBootstrapServices(); //注释4
    //启动核心服务
    startCoreServices(); //注释5
    //启动其他服务
    startOtherServices(); //注释6
    SystemServerInitThreadPool.shutdown();
    } catch (Throwable ex) {
    Slog.e("System", "******************************************");
    Slog.e("System", "************ Failure starting system services", ex);
    throw ex;
    } finally {
    traceEnd();
    }

    //用于debug版本,将log事件不断循环地输出到dropbox(用于分析)
    if (StrictMode.conditionallyEnableDebugLogging()) {
    Slog.i(TAG, "Enabled StrictMode for system server main thread.");
    }
    if (!mRuntimeRestart && !isFirstBootOrUpgrade()) {
    int uptimeMillis = (int) SystemClock.elapsedRealtime();
    MetricsLogger.histogram(null, "boot_system_server_ready", uptimeMillis);
    final int MAX_UPTIME_MILLIS = 60 * 1000;
    if (uptimeMillis > MAX_UPTIME_MILLIS) {
    Slog.wtf(SYSTEM_SERVER_TIMING_TAG,
    "SystemServer init took too long. uptimeMillis=" + uptimeMillis);
    }
    }

    //一直循环执行
    Looper.loop();
    throw new RuntimeException("Main thread loop unexpectedly exited");
    }

    注释解析:

    注释1处检查上次关机是否失败

    注释2处创建系统上下文

    注释3处创建SystemServiceManager,它会对系统服务进行创建、启动和生命周期管理

    注释4处启动系统中的引导服务

    注释5处启动系统中的核心服务

    注释6处启动系统中的其它服务

    下面分别对注释1-6对应的源码进行跟踪查阅。

    4.1 performPendingShutdown
    代码路径:frameworks/base/services/java/com/android/server/SystemServer.java

    深入到performPendingShutdown函数中:

    private void performPendingShutdown() {
    final String shutdownAction = SystemProperties.get(
    ShutdownThread.SHUTDOWN_ACTION_PROPERTY, "");
    if (shutdownAction != null && shutdownAction.length() > 0) {
    boolean reboot = (shutdownAction.charAt(0) == '1');

    final String reason;
    if (shutdownAction.length() > 1) {
    reason = shutdownAction.substring(1, shutdownAction.length());
    } else {
    reason = null;
    }
    if (reason != null && reason.startsWith(PowerManager.REBOOT_RECOVERY_UPDATE)) {
    File packageFile = new File(UNCRYPT_PACKAGE_FILE);
    if (packageFile.exists()) {
    String filename = null;
    try {
    filename = FileUtils.readTextFile(packageFile, 0, null);
    } catch (IOException e) {
    Slog.e(TAG, "Error reading uncrypt package file", e);
    }

    if (filename != null && filename.startsWith("/data")) {
    if (!new File(BLOCK_MAP_FILE).exists()) {
    Slog.e(TAG, "Can't find block map file, uncrypt failed or " +
    "unexpected runtime restart?");
    return;
    }
    }
    }
    }
    //当"sys.shutdown.requested"值不为空,则会重启或者关机
    ShutdownThread.rebootOrShutdown(null, reboot, reason);
    }
    }
    4.2 createSystemContext
    代码路径:frameworks/base/services/java/com/android/server/SystemServer.java

    深入到createSystemContext函数中:

    private void createSystemContext() {
    //创建system_server进程的上下文信息
    ActivityThread activityThread = ActivityThread.systemMain();
    mSystemContext = activityThread.getSystemContext();
    //设置主题
    mSystemContext.setTheme(DEFAULT_SYSTEM_THEME);

    //创建SystemUi的上下文信息并设置主题
    final Context systemUiContext = activityThread.getSystemUiContext();
    systemUiContext.setTheme(DEFAULT_SYSTEM_THEME);
    }

    4.3 SystemServiceManager启动Service
    代码路径:frameworks/base/services/core/java/com/android/server/SystemServiceManager.java

    系统服务启动的逻辑都是相似的,这里以PowerManagerService来举例,启动代码如下:

    mPowerManagerService = mSystemServiceManager.startService(PowerManagerService.class);
    1
    深入到SystemServiceManager的startService函数中:

    public void startService(@NonNull final SystemService service) {
    //注册Service
    mServices.add(service); //注释1
    long time = System.currentTimeMillis();
    try {
    //启动Service
    service.onStart();
    } catch (RuntimeException ex) {
    throw new RuntimeException("Failed to start service " + service.getClass().getName()
    + ": onStart threw an exception", ex);
    }
    warnIfTooLong(System.currentTimeMillis() - time, service, "onStart");
    }

    除了调用SystemServiceManager的startService函数来启动系统服务外,也可以通过如下形式来启动系统服务,以PackageManagerServcie为例:

    mPackageManagerService = PackageManagerServcie.main(mSystemContext,intaller,mFactoryTestMode != FactoryTest.FACTORY_TEST_OFF,mOnlyCore);
    1
    直接调用了PackageManagerServcie的main方法。

    代码路径:frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java

    深入到PackageManagerServcie的main方法中:

    public static PackageManagerService main(Context context, Installer installer,
    boolean factoryTest, boolean onlyCore) {
    //自检初始的设置
    PackageManagerServiceCompilerMapping.checkProperties();
    PackageManagerService m = new PackageManagerService(context, installer,
    factoryTest, onlyCore); //注释1
    m.enableSystemUserPackages();
    ServiceManager.addService("package", m); //注释2
    return m;
    }

    注释解析:

    注释1处创建一个PackageManagerService对象

    注释2处将创建的PackageManagerService对象注册到ServiceManager中

    ServiceManager是用来管理系统中的各种Service,用于系统C/S架构中的Binder通信机制:Client端要使用某个Service,需要先到ServiceManager中查下Service的相关信息,然后根据Service的相关信息与Service所在的Server进程建立通信,这样Client就可以使用Service了。

    4.4 startBootstrapServices
    代码路径:frameworks/base/services/java/com/android/server/SystemServer.java

    深入到startBootstrapServices函数中:

    private void startBootstrapServices() {

    ...省略...
    //阻塞等待与installd建立socket通道
    Installer installer = mSystemServiceManager.startService(Installer.class);

    ...省略...
    //在activity manager之前注册DeviceIdentifiersPolicyService
    mSystemServiceManager.startService(DeviceIdentifiersPolicyService.class);

    ...省略...
    //启动服务ActivityManagerService
    mActivityManagerService = mSystemServiceManager.startService(
    ActivityManagerService.Lifecycle.class).getService();
    mActivityManagerService.setSystemServiceManager(mSystemServiceManager);
    mActivityManagerService.setInstaller(installer);

    ...省略...
    //启动服务PowerManagerService
    mPowerManagerService = mSystemServiceManager.startService(PowerManagerService.class);

    ...省略...
    //初始化PowerManagement
    mActivityManagerService.initPowerManagement();

    ...省略...
    //启动服务LightsService
    mSystemServiceManager.startService(LightsService.class);

    ...省略...
    //启动服务DisplayManagerService
    mDisplayManagerService = mSystemServiceManager.startService(DisplayManagerService.class);

    ...省略...
    //Phase100: 在初始化package manager之前,需要默认的显示
    mSystemServiceManager.startBootPhase(SystemService.PHASE_WAIT_FOR_DEFAULT_DISPLAY);

    //当设备正在加密时,仅运行核心
    String cryptState = SystemProperties.get("vold.decrypt");
    if (ENCRYPTING_STATE.equals(cryptState)) {
    Slog.w(TAG, "Detected encryption in progress - only parsing core apps");
    mOnlyCore = true;
    } else if (ENCRYPTED_STATE.equals(cryptState)) {
    Slog.w(TAG, "Device encrypted - only parsing core apps");
    mOnlyCore = true;
    }...省略...

    //启动服务PackageManagerService
    mPackageManagerService = PackageManagerService.main(mSystemContext, installer,
    mFactoryTestMode != FactoryTest.FACTORY_TEST_OFF, mOnlyCore);
    mFirstBoot = mPackageManagerService.isFirstBoot();
    mPackageManager = mSystemContext.getPackageManager();

    ...省略...
    //启动服务UserManagerService
    mSystemServiceManager.startService(UserManagerService.LifeCycle.class);

    //设置AMS
    mActivityManagerService.setSystemProcess();

    ...省略...
    //启动服务OverlayManagerService
    mSystemServiceManager.startService(new OverlayManagerService(mSystemContext, installer));

    mSensorServiceStart = SystemServerInitThreadPool.get().submit(() -> {
    BootTimingsTraceLog traceLog = new BootTimingsTraceLog(
    SYSTEM_SERVER_TIMING_ASYNC_TAG, Trace.TRACE_TAG_SYSTEM_SERVER);
    traceLog.traceBegin(START_SENSOR_SERVICE);
    //启动传感器服务
    startSensorService();
    traceLog.traceEnd();
    }, START_SENSOR_SERVICE);
    }


    综上所述:该方法启动的引导服务有:ActivityManagerService、PowerManagerService、LightsService、DisplayManagerService、PackageManagerService、UserManagerService、OverlayManagerService和SensorService。

    4.5 startCoreServices
    代码路径:frameworks/base/services/java/com/android/server/SystemServer.java

    深入到startCoreServices函数中:

    private void startCoreServices() {
    //启动服务DropBoxManagerService,用于生成和管理系统运行时的一些日志文件
    mSystemServiceManager.startService(DropBoxManagerService.class);

    //启动服务BatteryService,用于统计电池电量,需要LightService
    mSystemServiceManager.startService(BatteryService.class);

    //启动服务UsageStatsService,用于统计应用使用情况
    mSystemServiceManager.startService(UsageStatsService.class);
    mActivityManagerService.setUsageStatsManager(
    LocalServices.getService(UsageStatsManagerInternal.class));

    //启动服务WebViewUpdateService,用于WebView更新服务
    mWebViewUpdateService = mSystemServiceManager.startService(WebViewUpdateService.class);
    }

    综上所述:该方法启动的核心服务有:DropBoxManagerService、BatteryService、UsageStatsService和WebViewUpdateService。

    4.6 startOtherServices
    代码路径:frameworks/base/services/java/com/android/server/SystemServer.java

    深入到startOtherServices函数中:

    private void startOtherServices() {

    ...省略...

    mContentResolver = context.getContentResolver(); //resolver

    ...省略...
    mActivityManagerService.installSystemProviders(); //provider

    ...省略...
    //启动服务AlarmManagerService
    mSystemServiceManager.startService(AlarmManagerService.class);

    //初始化watchdog
    watchdog.init(context, mActivityManagerService);

    ...省略...
    inputManager = new InputManagerService(context); //input

    //启动WindowManagerService
    wm = WindowManagerService.main(context, inputManager,
    mFactoryTestMode != FactoryTest.FACTORY_TEST_LOW_LEVEL,
    !mFirstBoot, mOnlyCore, new PhoneWindowManager());
    ServiceManager.addService(Context.WINDOW_SERVICE, wm);
    ServiceManager.addService(Context.INPUT_SERVICE, inputManager);

    SystemServerInitThreadPool.get().submit(() -> {
    traceBeginAndSlog(START_HIDL_SERVICES);
    //启动服务startHidlServices
    startHidlServices();
    traceEnd();
    }, START_HIDL_SERVICES);

    if (!disableVrManager) {
    traceBeginAndSlog("StartVrManagerService");
    //启动服务VrManagerService
    mSystemServiceManager.startService(VrManagerService.class);
    traceEnd();
    }

    ...省略...
    //启动服务IpConnectivityMetrics
    mSystemServiceManager.startService(IpConnectivityMetrics.class);

    //启动服务PinnerService
    mSystemServiceManager.startService(PinnerService.class);
    traceEnd();
    } catch (RuntimeException e) {
    Slog.e("System", "******************************************");
    Slog.e("System", "************ Failure starting core service", e);
    }

    ...省略...

    //准备好vibrator、lockSettings、window、power、package、display等服务
    vibrator.systemReady();
    lockSettings.systemReady();
    wm.systemReady();
    mPowerManagerService.systemReady(mActivityManagerService.getAppOpsService());
    mPackageManagerService.systemReady();
    mDisplayManagerService.systemReady(safeMode, mOnlyCore);

    ...省略...
    }

    该方法启动了一些非紧要和不需要立即启动的服务。

    5. Android系统部分服务及其作用
    在system_server进程启动中,将系统服务分为三大类:引导服务、核心服务和其他服务。下面简单的罗列下Android系统中常见的服务及其作用。

    引导服务

    Installer :系统安装APK时的一个服务类,启动完成Installer服务之后才能启动其他的系统服务

    ActivityManagerService :负责四大组件的启动、切换、调度

    PowerManagerService :计算系统中与Power相关的计算,然后决策系统应该如何反应

    LightsService :管理和显示背光LED

    DisplayManagerService :用来管理所有显示设备

    UserManagerService :多用户模式管理

    SensorService :为系统提供各种感应器服务

    PackageManagerService :对apk进行安装、解析、删除、卸载等操作

    …and so on …

    核心服务

    DropBoxManagerService :用于生成和管理系统运行时的一些日志文件

    BatteryService : 管理电池相关的服务

    UsageStatsService : 收集用户使用每一个App的频率、使用时长

    WebViewUpdateService :WebView更新服务

    其他服务

    CameraService :摄像头相关服务

    AlarmManagerService : 全局定时器管理服务

    InputManagerService : 管理输入事件

    WindowManagerService :窗口管理服务

    VrManagerService : VR模式管理服务

    BluetoothService : 蓝牙管理服务

    NotificationManagerService : 通知管理服务

    DeviceStorageMonitorService : 存储相关管理服务

    LocationManagerService : 定位管理服务

    AndioServcie : 音频相关管理服务

    …and so on …

    6. SystemServer进程启动总结
    SystemServer进程被创建后,主要做了如下工作:

    启动Binder线程池,使得system_server进程能与其它进程通信

    创建SystemServiceManager,用于对系统的服务进程创建、启动和生命周期管理

    启动系统中的引导服务、核心服务和其它服务

    非常感谢您的耐心阅读,希望我的文章对您有帮助。欢迎点评、转发或分享给您的朋友或技术群。
    ————————————————
    版权声明:本文为CSDN博主「salmon_zhang」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/salmon_zhang/article/details/93208135

    Always Believe Something Beauitful Will Be Happen
  • 相关阅读:
    SpringBoot入门篇--整合mybatis+generator自动生成代码+druid连接池+PageHelper分页插件+SpringBoot整合Mybatis-plus
    认证 (authentication) 和授权 (authorization) 的区别
    新手redis集群搭建
    Nginx是什么?
    分布式和集群的区别
    springBoot 项目 jar/war打包 并运行
    pyV8不支持dom操作,关于PyV8的支持DOM的疑问
    Python爬虫:更加优雅的执行JavaScript(PyV8)
    python中正则表达式 re.findall 用法
    Python爬虫-破解JS加密的Cookie
  • 原文地址:https://www.cnblogs.com/Oude/p/12306732.html
Copyright © 2011-2022 走看看