Android 7.0平台开机启动

  1. Android 启动概述

Android 系统是运行在Linux 内核上的,所以它的启动过程则是基于kernel的启动发生的。首先Kernel启动过程中会创建用户空间的第一个进程init进程,该进程也是用户空间的鼻祖,是系统的守护进程。之后init进程会启动serviceManager,它则是bind的服务管家,后续启动的许多系统或用户service都会在它里面进行注册。然后init进程也会创建Zygote进程,这个进程则是Java进程的鼻祖。之后的系统主进程system_server进程和其他app进程则都是由Zygote进程创建的。

    1. Init进程启动概述

init是Linux系统中用户空间的第一个进程(pid=1), Kerner启动后会调用/system/core/init/Init.cpp的main()方法.

Init 主要做的4件事

  1. 分析和运行所有的init.rc文件;
  2. 生成设备驱动节点; (通过rc文件创建)
  3. 处理子进程的终止(signal方式);
  4. 提供属性服务property service
      1. Init.main()

这里主要分析下main函数的执行内容:

int main(int argc, char** argv) {

    if (!strcmp(basename(argv[0]), "ueventd")) {

        return ueventd_main(argc, argv);//启动ueventd

    }

 

    if (!strcmp(basename(argv[0]), "watchdogd")) {

        return watchdogd_main(argc, argv);//启动watchdog

    }

 

    // Clear the umask.

    umask(0);//清除屏蔽字,更改目录和文件权限访问不受影响

//  #define _PATH_DEFPATH "/usr/bin:/bin"

    add_environment("PATH", _PATH_DEFPATH);//

    bool is_first_stage = (argc == 1) || (strcmp(argv[1], "--second-stage") != 0);

这里有一个状态值is_first_stage,从代码我们知道它是根据main函数的传入参数决定的。Init进程中会使用is_first_stage标志进行区分,决定是否需要进行初始化。在引入selinux机制后,有些操作必须要在内核态才能完成; 但init进程作为android的第一个进程,又是运行在用户态的。于是,最终设计为用is_first_stage进行区分init进程的运行状态。init进程在运行的过程中,会完成从内核态到用户态的切换。

 

然后主要执行的是创建文件系统目录并挂载相关的文件系统,主要mount tmpfs,devpts,proc,sysfs四种文件系统

    if (is_first_stage) {

        mount("tmpfs", "/dev", "tmpfs", MS_NOSUID, "mode=0755");

        mkdir("/dev/pts", 0755);

        mkdir("/dev/socket", 0755);

        mount("devpts", "/dev/pts", "devpts", 0, NULL);

        #define MAKE_STR(x) __STRING(x)

        mount("proc", "/proc", "proc", 0, "hidepid=2,gid=" MAKE_STR(AID_READPROC));

        mount("sysfs", "/sys", "sysfs", 0, NULL);

    }

    open_devnull_stdio();//屏蔽标准的输入输出

    klog_init();//初始化kernelLog

    klog_set_level(KLOG_NOTICE_LEVEL);//kernel Log level,在/system/core/include/cutils/klog.h定义

 

    if (!is_first_stage) {

        .......

        property_init();//创建一块共享的内存空间,用于属性服务

        .......

    }

    selinux_initialize(is_first_stage);//启动SELinux并导入相关配置策略

   

    if (is_first_stage) {

        //根据seLinux policy的策略重新设置init文件属性

        if (restorecon("/init") == -1) {

            ERROR("restorecon failed: %s\n", strerror(errno));

            security_failure();

        }

        char* path = argv[0];

        char* args[] = { path, const_cast<char*>("--second-stage"), nullptr };

        //这里就是前面所说的,启动用户态的init进程,即second-stage

        if (execv(path, args) == -1) {

            ERROR("execv(\"%s\") failed: %s\n", path, strerror(errno));

            security_failure();

        }

    }

    //这些文件节点在加载Sepolicy之前已经被创建了,因此在加载完Sepolicy后,需要重新设置相关的属性。

    NOTICE("Running restorecon...\n");

    restorecon("/dev");

    restorecon("/dev/socket");

    restorecon("/dev/__properties__");

    restorecon("/property_contexts");

    restorecon_recursive("/sys");

    //创建epoll句柄

    epoll_fd = epoll_create1(EPOLL_CLOEXEC);

    if (epoll_fd == -1) {

        ERROR("epoll_create1 failed: %s\n", strerror(errno));

        exit(1);

    }

    signal_handler_init();//初始化子进程退出的信号处理过程

    property_load_boot_defaults();//加载/default.prop文件

    export_oem_lock_status();

    start_property_service();//启动属性服务器

    const BuiltinFunctionMap function_map;

    Action::set_function_map(&function_map);

    //解析init.rc文件,对比6.0还是有很大区别

    Parser& parser = Parser::GetInstance();

    parser.AddSectionParser("service",std::make_unique<ServiceParser>());

    parser.AddSectionParser("on", std::make_unique<ActionParser>());

    parser.AddSectionParser("import", std::make_unique<ImportParser>());

    parser.ParseConfig("/init.rc");

//init进程将所有需要操作的action加入运行队列后,然后进入无限循环过程,

不断处理运行队列中的事件,同时进行重启service等操作。

    ActionManager& am = ActionManager::GetInstance();

    am.QueueEventTrigger("early-init");

    am.QueueBuiltinAction(wait_for_coldboot_done_action, "wait_for_coldboot_done");

    am.QueueBuiltinAction(mix_hwrng_into_linux_rng_action, "mix_hwrng_into_linux_rng");

#if defined(__aarch64__)

    am.QueueBuiltinAction(set_mmap_rnd_bits_action, "set_mmap_rnd_bits");

#endif

    am.QueueBuiltinAction(keychord_init_action, "keychord_init");

    am.QueueBuiltinAction(console_init_action, "console_init");

    am.QueueEventTrigger("init");

    am.QueueBuiltinAction(mix_hwrng_into_linux_rng_action, "mix_hwrng_into_linux_rng");

    std::string bootmode = property_get("ro.bootmode");

    if (bootmode == "charger") {

        am.QueueEventTrigger("early-fs");

        am.QueueEventTrigger("fs");

        am.QueueEventTrigger("post-fs");

        am.QueueEventTrigger("charger");

    } else {

        am.QueueEventTrigger("late-init");

    }

    am.QueueBuiltinAction(queue_property_triggers_action, "queue_property_triggers");

    while (true) {

        if (!waiting_for_exec) {

            am.ExecuteOneCommand();

            restart_processes();

        }

        int timeout = -1;

        if (process_needs_restart) {

            timeout = (process_needs_restart - gettime()) * 1000;

            if (timeout < 0)

                timeout = 0;

        }

        if (am.HasMoreCommands()) {

            timeout = 0;

        }

        bootchart_sample(&timeout);

        epoll_event ev;

        int nr = TEMP_FAILURE_RETRY(epoll_wait(epoll_fd, &ev, 1, timeout));

        if (nr == -1) {

            ERROR("epoll_wait failed: %s\n", strerror(errno));

        } else if (nr == 1) {

            ((void (*)()) ev.data.ptr)();

        }

    }

    return 0;

}

      1. Log 分析:

Init进程启动后,进入Main函数执行逻辑第一句Log的是

[    3.687408] c1 init: init first stage started!

上文说过init存在内核态和用户态,这句代表当前还在内核态,并且前面的环境设置,文件系统挂载,输入输出屏蔽和Kernel Log开启都已经完成。

[    4.295989] c1 init: (Initializing SELinux enforcing took 0.61s.)

则是代表SELinux初始化已经完成,这句Log是在selinux_initialize 执行完打出来的。

[    4.307861] c2 init: init second stage started!

这句话就是代码已经开始执行用户态的init进程。

[    4.332763] c2 init: Running restorecon... 下面要修改之前已经创建的节点属性

[    4.706207] c2 init: (Loading properties from /default.prop took 0.00s.)

property_load_boot_defaults函数执行完成,属性文件解析和导入完成。

[    4.712707] c2 init: (Parsing /init.environ.rc took 0.00s.)

[    4.714294] c2 init: (Parsing /init.usb.rc took 0.00s.)

[    4.721252] c2 init: (Parsing /init.sc8830.usb.rc took 0.00s.)

[    4.721588] c2 init: (Parsing /init.storage.rc took 0.00s.)

[    4.721679] c2 init: (Parsing /init.sc8830.rc took 0.01s.)

[    4.721740] c2 init: (Parsing /init.sp7731g_1h10.rc took 0.01s.)

[    4.726928] c2 init: (Parsing /init.usb.configfs.rc took 0.01s.)

[    4.727416] c2 init: (Parsing /init.zygote32.rc took 0.00s.)

[    4.727478] c2 init: (Parsing /init.rc took 0.02s.)

 

[   11.915832] c2 init: Starting service 'zygote'...

这里则是通过解析相关init.zygote32.rc文件,解析并启动'zygote进程。

    1. Zygote进程启动概述
      1. 配置文件解析

从1.1我们了解到,init在启动的时候会解析init.rc 配置文件,而Zygote进程则是通过这一事件触发启动的。

service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server

    class main //服务进程的class级别,一般有core, main, default几个级别

    socket zygote stream 660 root system //创建socket

    onrestart write /sys/android_power/request_state wake

    onrestart write /sys/power/state on

    onrestart restart audioserver //当zygote重启时,则会重启audioServer

    onrestart restart cameraserver //当zygote重启时,则会重启cameraServer

    onrestart restart media //当zygote重启时,则会重启media

    onrestart restart netd  //当zygote重启时,则会重启netd

writepid /dev/cpuset/foreground/tasks /dev/stune/foreground/tasks

当Zygote进程启动后, 便会执行到frameworks/base/cmds/app_process/App_main.cpp文件的main()方法.调用流程:

      1. App_main.main

int main(int argc, char* const argv[])

{

    ......

        首先进行参数解析

    AppRuntime runtime(argv[0], computeArgBlockSize(argc, argv));

    argc--;

    argv++;

    // --zygote : Start in zygote mode

    // --start-system-server : Start the system server.

    // --application : Start in application (stand alone, non zygote) mode.

    // --nice-name : The nice name for this process.

    int i;

        //只解析-开头的字符串,同时--开头后面没有字符串的不处理,这些参数保存到AppRuntime中

    for (i = 0; i < argc; i++) {

        if (argv[i][0] != '-') {

            break;

        }

        if (argv[i][1] == '-' && argv[i][2] == 0) {

            ++i; // Skip --.

            break;

        }

        runtime.addOption(strdup(argv[i]));

    }

 

    // Parse runtime arguments.  Stop at first unrecognized option.

    bool zygote = false;

    bool startSystemServer = false;

    bool application = false;

    String8 niceName;

    String8 className;

 

    ++i;  // Skip unused "parent dir" argument.

        //将筛选出的字符串参数,进行解析处理

    while (i < argc) {

        const char* arg = argv[i++];

        if (strcmp(arg, "--zygote") == 0) {

            zygote = true;

            niceName = ZYGOTE_NICE_NAME;

        } else if (strcmp(arg, "--start-system-server") == 0) {

            startSystemServer = true;

        } else if (strcmp(arg, "--application") == 0) {

            application = true;

        } else if (strncmp(arg, "--nice-name=", 12) == 0) {

            niceName.setTo(arg + 12);

        } else if (strncmp(arg, "--", 2) != 0) {

            className.setTo(arg);

            break;

        } else {

            --i;

            break;

        }

    }

    Vector<String8> args;

    if (!className.isEmpty()) {

        // // 运行application或tool程序

        args.add(application ? String8("application") : String8("tool"));

        runtime.setClassNameAndArgs(className, argc - i, argv + i);

    } else {

        // We're in zygote mode.zygote会走此处,创建 /data/dalvik-cache路径

        maybeCreateDalvikCache();

        //加入参数,启动system_server

        if (startSystemServer) {

            args.add(String8("start-system-server"));

        }

        char prop[PROP_VALUE_MAX];

        if (property_get(ABI_LIST_PROPERTY, prop, NULL) == 0) {

            LOG_ALWAYS_FATAL("app_process: Unable to determine ABI list from property %s.",

                ABI_LIST_PROPERTY);

            return 11;

        }

        String8 abiFlag("--abi-list=");

        abiFlag.append(prop);

        args.add(abiFlag);

 

        // In zygote mode, pass all remaining arguments to the zygote

        // main() method.

        for (; i < argc; ++i) {

            args.add(String8(argv[i]));

        }

    }

    //设置进程名

    if (!niceName.isEmpty()) {

        runtime.setArgv0(niceName.string());

        set_process_name(niceName.string());

    }

    //判断是启动模式

    if (zygote) {

            // 启动AppRuntime

        runtime.start("com.android.internal.os.ZygoteInit", args, zygote);

    } else if (className) {

        runtime.start("com.android.internal.os.RuntimeInit", args, zygote);

    } else {

            //参数错误

        fprintf(stderr, "Error: no class name or --zygote supplied.\n");

        app_usage();

        LOG_ALWAYS_FATAL("app_process: no class name or --zygote supplied.");

        return 10;

    }

}

      1. AndroidRuntime.start

上一小节会通过执行runtime.start("com.android.internal.os.ZygoteInit", args, zygote);

void AndroidRuntime::start(const char* className, const Vector<String8>& options, bool zygote)

{

    ......

    //创建虚拟机

    JniInvocation jni_invocation;

    jni_invocation.Init(NULL);

    JNIEnv* env;

    if (startVm(&mJavaVM, &env, zygote) != 0) {

        return;

    }

    onVmCreated(env);

     * Register android functions.//JNI方法注册

    if (startReg(env) < 0) {

        ALOGE("Unable to register all android natives\n");

        return;

    }

    ......

    char* slashClassName = toSlashClassName(className);

    jclass startClass = env->FindClass(slashClassName);

    if (startClass == NULL) {

        ALOGE("JavaVM unable to locate class '%s'\n", slashClassName);

        /* keep going */

    } else {

        jmethodID startMeth = env->GetStaticMethodID(startClass, "main",

            "([Ljava/lang/String;)V");

        if (startMeth == NULL) {

            ALOGE("JavaVM unable to find main() in '%s'\n", className);

            /* keep going */

        } else {

                     //此处开始调用Zygote.main 方法

            env->CallStaticVoidMethod(startClass, startMeth, strArray);

        ......

        }

    }

    free(slashClassName);

}

Start方法的第一句Log就是下面,代表该进程已经开始启动

A001-01 08:08:10.716   223   223 D AndroidRuntime: >>>>>> START com.android.internal.os.ZygoteInit uid 0 <<<<<<

      1. ZygoteInit.main

public static void main(String argv[]) {

        // 标记Zygote已经启动

        ZygoteHooks.startZygoteNoThreadCreation();

        try {

            RuntimeInit.enableDdms();//打开DDMS功能

            //性能统计相关的操作类

            SamplingProfilerIntegration.start();

            boolean startSystemServer = false;

            String socketName = "zygote";

            String abiList = null;

                         //这里面主要进行了参数的解析,是否打开systemServer,还有就是

                         检查参数--abi-list=和--socket-name=

            for (int i = 1; i < argv.length; i++) {

                if ("start-system-server".equals(argv[i])) {

                    startSystemServer = true;                     

                } else if (argv[i].startsWith(ABI_LIST_ARG)) {

                    abiList = argv[i].substring(ABI_LIST_ARG.length());

                } else if (argv[i].startsWith(SOCKET_NAME_ARG)) {

                    socketName = argv[i].substring(SOCKET_NAME_ARG.length());

                } else {

                    throw new RuntimeException("Unknown command line argument: " + argv[i]);

                }

            }

                         abiList参数为null 会抛出异常

            if (abiList == null) {

                throw new RuntimeException("No ABI list supplied.");

            }

            // 注册zygote的socket端口

            registerZygoteSocket(socketName);

            EventLog.writeEvent(LOG_BOOT_PROGRESS_PRELOAD_START,

                SystemClock.uptimeMillis());//boot_progress_preload_start

            preload();//预加载类和资源

            EventLog.writeEvent(LOG_BOOT_PROGRESS_PRELOAD_END,

                SystemClock.uptimeMillis());//boot_progress_preload_end

            SamplingProfilerIntegration.writeZygoteSnapshot();

            // 在启动后做一次GC操作

            gcAndFinalize();

            // Zygote process unmounts root storage spaces.

            Zygote.nativeUnmountStorageOnInit();

            ZygoteHooks.stopZygoteNoThreadCreation();

                         //启动systemServer

            if (startSystemServer) {

                startSystemServer(abiList, socketName);

            }

            Log.i(TAG, "Accepting command socket connections");

                         //进入循环模式

            runSelectLoop(abiList);

            closeServerSocket();

        } catch (MethodAndArgsCaller caller) {

            caller.run();

        } catch (RuntimeException ex) {

            Log.e(TAG, "Zygote died with exception", ex);

            closeServerSocket();

            throw ex;

        }

    }

 

Log分析:

 

A001-01 08:08:12.401   223   223 I SamplingProfilerIntegration: Profiling disabled.

代表正在执行SamplingProfilerIntegration.start();

A001-01 08:08:12.405   223   223 D Zygote  : begin preload

开始执行preload();加载类和资源

第一个执行beginIcuCachePinning();

A001-01 08:08:12.406   223   223 I Zygote  : Installing ICU cache reference pinning...

A001-01 08:08:12.406   223   223 I Zygote  : Preloading ICU data...

 

preloadClasses();//预加载类

A001-01 08:08:12.667   223   223 I Zygote  : Preloading classes...

preloadResources();//预加载资源,包含drawable和color资源

A001-01 08:08:15.991   223   223 I Zygote  : Preloading resources...

preloadOpenGL();

preloadSharedLibraries();//通过System.loadLibrary()方法,预加载"android","compiler_rt","jnigraphics"这3个共享库

A001-01 08:08:16.565   223   223 I Zygote  : Preloading shared libraries...

 

endIcuCachePinning();

A001-01 08:08:16.630   223   223 I Zygote  : Uninstalled ICU cache reference pinning...

warmUpJcaProviders();

A001-01 08:08:16.642   223   223 I Zygote  : Installed AndroidKeyStoreProvider in 11ms.

A001-01 08:08:16.689   223   223 I Zygote  : Warmed up JCA providers in 46ms.

至此preload函数执行完成,分别在main和eventLog打出如下

A001-01 08:08:16.689   223   223 D Zygote  : end preload

A301-01 08:08:16.689   223   223 I boot_progress_preload_end: 21809

fork systemserver进程时,在执行com_android_internal_os_Zygote.cpp com_android_internal_os_Zygote_nativeForkSystemServer()方法会打出如下Log,代表systemServer进程已经被创建:

A001-01 08:08:16.877   223   223 I Zygote  : System server process 661 has been created

 

下面这句Log则是在startsystemserver完成后,执行runSelectLoop前打出。代表要进行zygote进入等待和处理客户端请求的状态。

A001-01 08:08:16.894   223   223 I Zygote  : Accepting command socket connections

 

  1. SystemServer启动流程分析

SystemServer是Android Framework层的主进程,该进程运行着Framework的核心服务。systemServer由Zygote启动 fork生成的。进程名是system_server,上文我们跟踪代码分析到Zygote进程会调用startSystemServer()方法走入system_server的启动流程。

下图是systemServer的启动框图:

那么我们将按照上图对于主要函数进行分析

    1. Zygote 进程启动SystemServer
      1. startSystemServer()

private static boolean startSystemServer(String abiList, String socketName)

                 throws MethodAndArgsCaller, RuntimeException {

        ......

        //首先配置启动systemserver 的相关参数uid,gid,name,group

        String args[] = {

                 "--setuid=1000",

                 "--setgid=1000",

        "--setgroups=1001,1002,1003,1004,1005,1006,1007,1008,1009,1010,1018,1021,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 {

                 //Arguments用于解析参数,这里则是把上文配置的参数解析生成目标格式并存在parsedArgs对象中

                 parsedArgs = new ZygoteConnection.Arguments(args);

                 ZygoteConnection.applyDebuggerSystemProperty(parsedArgs);

                 ZygoteConnection.applyInvokeWithSystemProperty(parsedArgs);

                 // fork子进程,该进程是system_server进程

                 pid = Zygote.forkSystemServer(

                                  parsedArgs.uid, parsedArgs.gid,

                                  parsedArgs.gids,

                                  parsedArgs.debugFlags,

                                  null,

                                  parsedArgs.permittedCapabilities,

                                  parsedArgs.effectiveCapabilities);

        } catch (IllegalArgumentException ex) {

                 throw new RuntimeException(ex);

        }

        /* For child process */

        if (pid == 0) {

                 if (hasSecondZygote(abiList)) {

                         //对于有两个zygote进程情况,需等待第2个zygote创建完成

                         waitForSecondaryZygote(socketName);

                 }

         // 完成system_server进程剩余的工作

                 handleSystemServerProcess(parsedArgs);

        }

        return true;

}

      1. forkSystemServer()

1. forkSystemServer()

public static int forkSystemServer(int uid, int gid, int[] gids, int debugFlags,

                 int[][] rlimits, long permittedCapabilities, long effectiveCapabilities) {

        ......

        //调用native方法fork system_server进程

        int pid = nativeForkSystemServer(

                         uid, gid, gids, debugFlags, rlimits, permittedCapabilities, effectiveCapabilities);

        ......

        return pid;

}

2. nativeForkSystemServer()

nativeForkSystemServer()方法则是调用到Zygote的JNI层 com_android_internal_os_Zygote.cpp 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) {

  pid_t pid = ForkAndSpecializeCommon(env, uid, gid, gids,

                                      debug_flags, rlimits,

                                      permittedCapabilities, effectiveCapabilities,

                                      MOUNT_EXTERNAL_DEFAULT, NULL, NULL, true, NULL,

                                      NULL, NULL);

  if (pid > 0) {

      //zygote进程,检测system_server进程是否创建

      gSystemServerPid = pid;

      int status;

      if (waitpid(pid, &status, WNOHANG) == pid) {

          //当system_server进程死亡后,重启zygote进程

          RuntimeAbort(env, __LINE__, "System server process has died. Restarting Zygote!");

      }

  }

  这里有一个fork 后对于systemServer进程是否创建成功的判断,如果创建失败则会重启Zygote进程

3.ForkAndSpecializeCommon()

static pid_t ForkAndSpecializeCommon(.....) {

  SetSigChldHandler();//设置systemServer的对于Linux信号的处理

  ......

  //fork 子进程

  pid_t pid = fork();

  if (pid == 0) {

    // 进入子进程了

    gMallocLeakZygoteChild = 1;

   

    // 第一步先清除描述符

    DetachDescriptors(env, fdsToClose);

    ......

    if (!is_system_server) {

            //对于非system_server子进程,则创建进程组,rc 非0则打出创建失败原因

        int rc = createProcessGroup(uid, getpid());

        .....

    }

    //设置group GID

    SetGids(env, javaGids);

    //设置资源limit

    SetRLimits(env, javaRlimits);

    ......

    //设置真实的,有效的和保存过的组标识号

    int rc = setresgid(gid, gid, gid);

    //分别设置真实的,有效的和保存过的用户标识号

    rc = setresuid(uid, uid, uid);

    ......

    SetCapabilities(env, permittedCapabilities, effectiveCapabilities);

    设置调度策略

    SetSchedulerPolicy(env);

 

    const char* se_info_c_str = NULL;

    ScopedUtfChars* se_info = NULL;

    if (java_se_info != NULL) {

        se_info = new ScopedUtfChars(env, java_se_info);

        se_info_c_str = se_info->c_str();

        if (se_info_c_str == NULL) {

          RuntimeAbort(env, __LINE__, "se_info_c_str == NULL");

        }

    }

    //selinux上下文

    rc = selinux_android_setcontext(uid, is_system_server, se_info_c_str, se_name_c_str);

    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;

    UnsetSigChldHandler();

    env->CallStaticVoidMethod(gZygoteClass, gCallPostForkChildHooks, debug_flags,

                              is_system_server, instructionSet);   

  } else if (pid > 0) {

    进入父进程Zygote

  }

  return pid;

}

      1. handleSystemServerProcess()

上文介绍了systemServer进程的fork过程,当返回pid为0的判断内,则进入systemserver 进程里面了。而handleSystemServerProcess()方法则继续完成systemserver 启动的其他内容,

一直到main()主函数的启动。

private static void handleSystemServerProcess(.....)

                 throws ZygoteInit.MethodAndArgsCaller {

        closeServerSocket();/关闭fork过程从Zygote copy的socket

        Os.umask(S_IRWXG | S_IRWXO);

        if (parsedArgs.niceName != null) {

                 //设置进程名system_server

                 Process.setArgV0(parsedArgs.niceName);

        }

        //执行dex优化

        final String systemServerClasspath = Os.getenv("SYSTEMSERVERCLASSPATH");

        if (systemServerClasspath != null) {

                 performSystemServerDexOpt(systemServerClasspath);

        }

        if (parsedArgs.invokeWith != null) {

                 ......

                 //通过系统调用执行进程

                 WrapperInit.execApplication(parsedArgs.invokeWith,

                                 parsedArgs.niceName, parsedArgs.targetSdkVersion,

                                  VMRuntime.getCurrentInstructionSet(), null, args);

        } else {

                 ClassLoader cl = null;

                 if (systemServerClasspath != null) {

              //创建类加载器

                         cl = createSystemServerClassLoader(systemServerClasspath,parsedArgs.targetSdkVersion);

                         Thread.currentThread().setContextClassLoader(cl);

                 }

                 //通过寻找到相应目标类的main()函数并执行

                 RuntimeInit.zygoteInit(parsedArgs.targetSdkVersion, parsedArgs.remainingArgs, cl);

        }

}

      1. RuntimeInit.zygoteInit()

public static final void zygoteInit(int targetSdkVersion, String[] argv, ClassLoader classLoader)

        throws ZygoteInit.MethodAndArgsCaller {

    Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "RuntimeInit");

    redirectLogStreams(); //重定向log输出

    commonInit(); // 通用的一些初始化

    nativeZygoteInit(); // zygote初始化

    applicationInit(targetSdkVersion, argv, classLoader); // 应用初始化

}

 

private static void applicationInit(int targetSdkVersion, String[] argv, ClassLoader classLoader)

        throws ZygoteInit.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) {

        return;

    }

    Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);

//调用startClass的static方法 main(),此处args.startClass为”com.android.server.SystemServer”。

    invokeStaticMain(args.startClass, args.startArgs, classLoader);

}

对于方法我们关注下面的处理

private static void invokeStaticMain(String className, String[] argv, ClassLoader classLoader)

        throws ZygoteInit.MethodAndArgsCaller {

//通过抛出异常,回到ZygoteInit.main()。

    throw new ZygoteInit.MethodAndArgsCaller(m, argv)

}

在分析Zygote 的时候,对startSystemServer 进行try catch时,当上文处抛出异常时就会执行caller.run。

这里面我们看下caller的处理。

public static void main(String argv[]) {

    try {

        startSystemServer(abiList, socketName);//启动system_server

        ....

    } catch (MethodAndArgsCaller caller) {

        caller.run();

    } catch (RuntimeException ex) {

        closeServerSocket();

        throw ex;

    }

}

public static class MethodAndArgsCaller extends Exception

                 implements Runnable {

        ......

        public void run() {

                 try {

                     //通过反射机制能够调用到SystemServer.main()方法

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

                 }

 ……

        }

      1. Log分析:

上文在fork systemserver进程时,在执行com_android_internal_os_Zygote.cpp com_android_internal_os_Zygote_nativeForkSystemServer()方法会打出如下Log,代表systemServer进程已经被创建:

A001-01 08:08:16.877   223   223 I Zygote  : System server process 661 has been created

    1. SystemServer 启动系统服务

上文我们知道通过Zygote fork SystemServer 进程,调用到SystemServer.main()方法。这一节我们主要关注启动的各个阶段启动的服务,和相关分类。

首先main函数的只是执行new SystemServer().run(); 实例化systemServer并执行run方法。

而对于run方法我们除了一些运行状态的初始化以外,主要关注下面几个方法。

performPendingShutdown();

createSystemContext();

mSystemServiceManager = new SystemServiceManager(mSystemContext);

startBootstrapServices();

startCoreServices();

startOtherServices();

Looper.loop()

      1. Run()

private void run() {

        try {

                 Trace.traceBegin(Trace.TRACE_TAG_SYSTEM_SERVER, "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);

                 }

                 //语言更改为本地属性预置的

                 if (!SystemProperties.get("persist.sys.language").isEmpty()) {

                         final String languageTag = Locale.getDefault().toLanguageTag();

                         SystemProperties.set("persist.sys.locale", languageTag);

                         SystemProperties.set("persist.sys.language", "");

                         SystemProperties.set("persist.sys.country", "");

                         SystemProperties.set("persist.sys.localevar", "");

                 }

                 // Here we go!

                Slog.i(TAG, "Entered the Android system server!");

                 EventLog.writeEvent(EventLogTags.BOOT_PROGRESS_SYSTEM_RUN, SystemClock.uptimeMillis());

                 //变更虚拟机使用的库文件,目前使用应该是libart.so

                 SystemProperties.set("persist.sys.dalvik.vm.lib.2", VMRuntime.getRuntime().vmLibrary());

                  //判断性能统计功能是否开启

                 if (SamplingProfilerIntegration.isEnabled()) {

                         SamplingProfilerIntegration.start();

                         mProfilerSnapshotTimer = new Timer();

                         mProfilerSnapshotTimer.schedule(new TimerTask() {

                                          @Override

                                          public void run() {

                                              //SystemServer性能统计,每小时统计一次,统计结果输出为文件

                                                  SamplingProfilerIntegration.writeSnapshot("system_server", null);

                                          }

                                  }, SNAPSHOT_INTERVAL, SNAPSHOT_INTERVAL);

                 }

                 // 因为启动阶段系统会消耗大量的虚拟机内存空间,此处先清除内存的限制

                 VMRuntime.getRuntime().clearGrowthLimit();

                 //因为systemServer会一直运行,这里设置了下它的内存使用率

                 VMRuntime.getRuntime().setTargetHeapUtilization(0.8f);

                 // 一些设备的运行可能依赖指纹信息,这里先提前进行定义

                 Build.ensureFingerprintProperty();

                 制定用户

                 Environment.setUserRequired(true);

                 // 在system server,任何传入的Bundles应该被defused,以避免抛出BadParcelableException。

                 BaseBundle.setShouldDefuse(true);

                 // 确保当前系统进程的binder调用,总是运行在前台优先级

                 BinderInternal.disableBackgroundScheduling(true);

                 BinderInternal.setMaxThreads(sMaxBinderThreads);

                 //主线程looper就在当前线程运行

                 android.os.Process.setThreadPriority(

                         android.os.Process.THREAD_PRIORITY_FOREGROUND);

                 android.os.Process.setCanSelfBackground(false);

                 Looper.prepareMainLooper();

                 //初始化native服务

                 System.loadLibrary("android_servers");

                 //检查上次关机是否失败,该方法可能不会反回.

 // "sys.shutdown.requested"值不为空,则会重启或者关机

                 performPendingShutdown();

                 //初始化system context.

                 createSystemContext();

                 // 创建systemServiceManager作为系统服务管理

                 mSystemServiceManager = new SystemServiceManager(mSystemContext);

                 //将mSystemServiceManager添加到本地服务的成员sLocalServiceObjects

                 LocalServices.addService(SystemServiceManager.class, mSystemServiceManager);

        } finally {

                 Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER);

        }

        // 开始启动系统相关核心服务

        try {

                 Trace.traceBegin(Trace.TRACE_TAG_SYSTEM_SERVER, "StartServices");

                 startBootstrapServices();

                 startCoreServices();

                 startOtherServices();

        } catch (Throwable ex) {

                 Slog.e("System", "******************************************");

                 Slog.e("System", "************ Failure starting system services", ex);

                 throw ex;

        } finally {

                 Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER);

        }

        ......

        //循环处理

        Looper.loop();

        throw new RuntimeException("Main thread loop unexpectedly exited");

}

Log分析:

刚进入systemServer的run 方法就会打出如下Log

A101-01 08:08:17.070   661   661 I SystemServer: Entered the Android system server!

A301-01 08:08:17.071   661   661 I boot_progress_system_run: 22191

 

 

 

      1. Framework 核心服务启动

我们可以把系统服务的启动分成下面六个阶段。分别在下面三个方法实现。

六个阶段:

public static final int PHASE_WAIT_FOR_DEFAULT_DISPLAY = 100;

public static final int PHASE_LOCK_SETTINGS_READY = 480;

public static final int PHASE_SYSTEM_SERVICES_READY = 500;

public static final int PHASE_ACTIVITY_MANAGER_READY = 550;

public static final int PHASE_THIRD_PARTY_APPS_CAN_START = 600;

public static final int PHASE_BOOT_COMPLETED = 1000;

三个方法函数:

startBootstrapServices();

startCoreServices();

startOtherServices();

 

        1. 系统服务启动的六个阶段

在完成每阶段的执行后,systemServer通过调用mSystemServiceManager.startBootPhase() 方式发出消息。

而一些服务则会对其进行回调。

  1. 系统服务启动阶段:

创建四大引导服务

ActivityManagerService

PowerManagerService

LightsService//光感应传感器服务。

DisplayManagerService共4项服务

 

Log分析:

A101-01 08:08:17.308   661   661 I SystemServiceManager: Starting com.android.server.pm.InstallerEx

A101-01 08:08:17.322   661   661 I SystemServiceManager: Starting com.android.server.am.ActivityManagerService$Lifecycle

//电源管理服务

A101-01 08:08:17.942   661   661 I SystemServiceManager: Starting com.android.server.power.PowerManagerService

//光感应传感器服务。

A101-01 08:08:17.975   661   661 I SystemServiceManager: Starting com.android.server.lights.LightsService

//用于管理全局显示生命周期,决定在已连接的物理设备如何配置逻辑显示,并且通知系统和应用状态的改变

A101-01 08:08:17.992   661   661 I SystemServiceManager: Starting com.android.server.display.DisplayManagerService

  1. Phase100

会进入阶段PHASE_WAIT_FOR_DEFAULT_DISPLAY=100会进行回调的服务

DisplayManagerService

 public void onBootPhase(int phase) {

        if (phase == PHASE_WAIT_FOR_DEFAULT_DISPLAY) {

         

          }

然后创建大量服务下面等服务:

PackageManagerService

WindowManagerService

InputManagerService

NetworkManagerService

DropBoxManagerService

FingerprintService

LauncherAppsService

A101-01 08:08:18.007   661   661 I SystemServiceManager: Starting phase 100

//Android framework框架核心服务,用于APK的解析、权限验证、安装等。

A101-01 08:08:18.039   661   661 I SystemServer: StartPackageManagerService

package scan开始

A301-01 08:08:18.104   661   661 I boot_progress_pms_start: 23224

System目录扫描

A301-01 08:08:18.612   661   661 I boot_progress_pms_system_scan_start: 23732

Data目录扫描

A301-01 08:08:20.508   661   661 I boot_progress_pms_data_scan_start: 25628

package scan结束

A301-01 08:08:20.586   661   661 I boot_progress_pms_scan_end: 25707

A301-01 08:08:22.806   661   661 I boot_progress_pms_ready: 27926

 

A101-01 08:08:22.904   661   661 I SystemServer: StartOtaDexOptService

//user用户管理服务

A101-01 08:08:22.907   661   661 I SystemServer: StartUserManagerService

A101-01 08:08:22.908   661   661 I SystemServiceManager: Starting com.android.server.pm.UserManagerService$LifeCycle

A001-01 08:08:22.931   661   661 D SensorService: nuSensorService starting...

到此处startBootstrapServices()执行完。然后开始执行startCoreServices();

电池电量相关service

A101-01 08:08:23.580   661   661 I SystemServiceManager: Starting com.android.server.BatteryService

收集用户使用每一个APP的频率、使用时常的一个service

A101-01 08:08:23.601   661   661 I SystemServiceManager: Starting com.android.server.usage.UsageStatsService

A101-01 08:08:23.630   661   661 I SystemServiceManager: Starting com.android.server.webkit.WebViewUpdateService

到这里startCoreServices()也执行完了,接着就会执行startOtherServices()

A101-01 08:08:23.643   661   661 I SystemServer: Reading configuration...

A101-01 08:08:23.643   661   661 I SystemServer: StartSchedulingPolicyService

A101-01 08:08:23.646   661   661 I SystemServiceManager: Starting com.android.server.telecom.TelecomLoaderService

A101-01 08:08:23.651   661   661 I SystemServer: StartTelephonyRegistry

//生成系统随机数

A101-01 08:08:23.660   661   661 I SystemServer: StartEntropyMixer

A101-01 08:08:23.690   661   661 I SystemServer: Camera Service

A101-01 08:08:23.691   661   661 I SystemServiceManager: Starting com.android.server.camera.CameraService

//Android账户服务,提供了对账户、密码、授权的集中管理

A101-01 08:08:23.704   661   661 I SystemServer: StartAccountManagerService

A101-01 08:08:23.707   661   661 I SystemServiceManager: Starting com.android.server.accounts.AccountManagerService$Lifecycle

//内容服务,主要是数据库等提供解决方法的服务

A101-01 08:08:23.720   661   661 I SystemServer: StartContentService

A101-01 08:08:23.722   661   661 I SystemServiceManager: Starting com.android.server.content.ContentService$Lifecycle

//将SettingsProvider放到SystemServer进程中来运行

A101-01 08:08:23.731   661   661 I SystemServer: InstallSystemProviders

//android 震动马达相关的service

A101-01 08:08:23.807   661   661 I SystemServer: StartVibratorService

//远程控制,通过红外等控制周围的设备

A101-01 08:08:23.821   661   661 I SystemServer: StartConsumerIrService

//展讯自己加的一个服务

A101-01 08:08:23.826   661   661 I SystemServer: PowerGuru Manager

//提供闹铃和定时器等功能

A101-01 08:08:23.844   661   661 I SystemServer: StartAlarmManagerService

A101-01 08:08:23.844   661   661 I SystemServiceManager: Starting com.android.server.AlarmManagerService

//初始化watchdog

A101-01 08:08:23.873   661   661 I SystemServer: InitWatchdog

 

//处理事件分发

A101-01 08:08:23.874   661   661 I SystemServer: StartInputManagerService

//窗口管理服务

A101-01 08:08:23.886   661   661 I SystemServer: StartWindowManagerService

//android N增加的适用VR服务的

A101-01 08:08:24.013   661   661 I SystemServer: StartVrManagerService

A101-01 08:08:24.013   661   661 I SystemServiceManager: Starting com.android.server.vr.VrManagerService

A101-01 08:08:24.048   661   661 I SystemServiceManager: Starting com.android.server.BluetoothService

A101-01 08:08:24.071   661   661 I SystemServer: ConnectivityMetricsLoggerService??

A101-01 08:08:24.072   661   661 I SystemServiceManager: Starting com.android.server.connectivity.MetricsLoggerService

A101-01 08:08:24.076   661   661 I SystemServer: PinnerService?

A101-01 08:08:24.076   661   661 I SystemServiceManager: Starting com.android.server.PinnerService

//输入法服务,打开和关闭输入法

A101-01 08:08:24.079   661   661 I SystemServiceManager: Starting com.android.server.InputMethodManagerService$Lifecycle

//辅助管理程序截获所有的用户输入,并根据这些输入给用户一些额外的反馈,起到辅助的效果,View的点击、焦点等事件分发管理服。

A101-01 08:08:24.171   661   661 I SystemServer: StartAccessibilityManagerService

//磁盘加载服务程序,一般要和一个linux daemon程序如vold/mountd等合作起作用,主要负责监听并广播device的mount/unmount/badremoval等等事件。

A101-01 08:08:24.223   661   661 I SystemServiceManager: Starting com.android.server.MountService$Lifecycle

//管理当前Android设备的夜间模式和行车模式.

A101-01 08:08:24.273   661   661 I SystemServiceManager: Starting com.android.server.UiModeManagerService

//和锁屏界面中的输入密码,手势等安全功能有关。可以保存每个user的相关锁屏信息

A101-01 08:08:24.300   661   661 I SystemServer: StartLockSettingsService

A101-01 08:08:24.310   661   661 I SystemServiceManager: Starting com.android.server.LockSettingsService$Lifecycle

A101-01 08:08:24.330   661   661 I SystemServiceManager: Starting com.android.server.PersistentDataBlockService??

//这个服务可以控制设备的Idle状态。而当设备在idle状态时,它会忽略cpu的wakelock,Alarm等。

A101-01 08:08:25.386   661   661 I SystemServiceManager: Starting com.android.server.DeviceIdleController

//提供一些系统级别的设置及属性

A101-01 08:08:25.394   661   661 I SystemServiceManager: Starting com.android.server.devicepolicy.DevicePolicyManagerService$Lifecycle

//状态栏

A101-01 08:08:25.417   661   661 I SystemServer: StartStatusBarManagerService

 

//剪贴板功能

A101-01 08:08:25.429   661   661 I SystemServer: StartClipboardService

//网络管理服务。Android 系统网络连接和管理服务由四个系统服务ConnectivityService、NetworkPolicyManagerService、NetworkManagementService、NetworkStatsService共同配合完成网络连接和管理功能。ConnectivityService、NetworkPolicyManagerService、NetworkStatsService三个服务都通过INetworkManagementService接口跨进程访问NetworkManagementService服务,实现与网络接口的交互及信息读取。

A101-01 08:08:25.438   661   661 I SystemServer: StartNetworkManagementService

A101-01 08:08:25.452   661   661 I SystemServiceManager: Starting com.android.server.TextServicesManagerService$Lifecycle

A101-01 08:08:25.469   661   661 I SystemServer: StartNetworkScoreService

A101-01 08:08:25.474   661   661 I SystemServer: StartNetworkStatsService

A101-01 08:08:25.493   661   661 I SystemServer: StartNetworkPolicyManagerService

A101-01 08:08:25.523   661   661 I SystemServiceManager: Starting com.android.server.wifi.p2p.WifiP2pService

A101-01 08:08:25.591   661   661 I SystemServiceManager: Starting com.android.server.wifi.WifiService

A101-01 08:08:25.898   661   661 I SystemServiceManager: Starting com.android.server.wifi.scanner.WifiScanningService

A101-01 08:08:25.907   661   661 I SystemServiceManager: Starting com.android.server.wifi.RttService

A101-01 08:08:25.913   661   661 I SystemServer: StartConnectivityService

//网络搜索服务

A101-01 08:08:25.949   661   661 I SystemServer: StartNsdService

A101-01 08:08:25.959   661   661 I SystemServer: StartUpdateLockService//提供升级锁

A101-01 08:08:25.964   661   661 I SystemServiceManager: Starting com.android.server.RecoverySystemService//OTA升级相关的service

A101-01 08:08:25.969   661   661 I SystemServiceManager: Starting com.android.server.notification.NotificationManagerService//通知服务

A101-01 08:08:26.046   661   661 I SystemServiceManager: Starting com.android.server.storage.DeviceStorageMonitorService//手机存储监控

A101-01 08:08:26.057   661   661 I SystemServer: StartLocationManagerService//位置服务,GPS、定位等。

A101-01 08:08:26.066   661   661 I SystemServer: StartCountryDetectorService//检测用户国家

A101-01 08:08:26.070   661   661 I SystemServer: StartSearchManagerService//搜索服务

A101-01 08:08:26.071   661   661 I SystemServiceManager: Starting com.android.server.search.SearchManagerService$Lifecycle

A101-01 08:08:26.077   661   661 I SystemServiceManager: Starting com.android.server.DropBoxManagerService//用于系统运行时日志的存储管理

A101-01 08:08:26.081   661   661 I SystemServer: StartWallpaperManagerService//壁纸管理服务

A101-01 08:08:26.082   661   661 I SystemServiceManager: Starting com.android.server.wallpaper.WallpaperManagerService$Lifecycle

A101-01 08:08:26.096   661   661 I SystemServer: StartAudioService

A101-01 08:08:26.097   661   661 I SystemServiceManager: Starting com.android.server.audio.AudioService$Lifecycle

A101-01 08:08:26.167   661   661 I SystemServiceManager: Starting com.android.server.DockObserver//应该是手机设备底座管理

A101-01 08:08:26.173   661   661 I SystemServer: StartWiredAccessoryManager//监视手机和底座上的耳机

A101-01 08:08:26.177   661   661 I SystemServiceManager: Starting com.android.server.midi.MidiService$Lifecycle//MIDI管理

A101-01 08:08:26.185   661   661 I SystemServiceManager: Starting com.android.server.usb.UsbService$Lifecycle//USB管理

A101-01 08:08:26.227   661   661 I SystemServer: StartSerialService//对串口的设备进行操作

A101-01 08:08:26.236   661   661 I SystemServer: BoardScore Service

A101-01 08:08:26.255   661   661 I SystemServiceManager: Starting com.android.server.twilight.TwilightService//指出用户当前所在位置是否为晚上,被UiModeManager等用来调整夜间模式。

A101-01 08:08:26.264   661   661 I SystemServiceManager: Starting com.android.server.job.JobSchedulerService//允许开发者在符合某些条件时创建执行在后台的任务。

A101-01 08:08:26.295   661   661 I SystemServiceManager: Starting com.android.server.soundtrigger.SoundTriggerService//应该是语音识别相关的

A101-01 08:08:26.304   661   661 I SystemServiceManager: Starting com.android.server.backup.BackupManagerService$Lifecycle//备份服务

A101-01 08:08:26.314   661   661 I SystemServiceManager: Starting com.android.server.appwidget.AppWidgetService//应用小部件服务

A101-01 08:08:26.338   661   661 I SystemServiceManager: Starting com.android.server.voiceinteraction.VoiceInteractionManagerService//也是语音识别相关的服务

A101-01 08:08:26.343   661   661 I SystemServer: Gesture Launcher Service??监控传感器的某些手势操作,然后启动相应的inten

A101-01 08:08:26.344   661   661 I SystemServiceManager: Starting com.android.server.GestureLauncherService

A101-01 08:08:26.345   661   661 I SystemServiceManager: Starting com.android.server.SensorNotificationService//传感器的通知服务

A101-01 08:08:26.346   661   661 I SystemServiceManager: Starting com.android.server.ContextHubSystemService

A101-01 08:08:26.351   661   661 I SystemServer: StartDiskStatsService//磁盘统计服务,供dumpsys使用

A101-01 08:08:26.354   661   661 I SystemServer: StartSamplingProfilerService//性能统计

A101-01 08:08:26.368   661   661 I SystemServer: StartNetworkTimeUpdateService//监视网络时间,当网络时间变化时更新本地时间。

A101-01 08:08:26.372   661   661 I SystemServer: StartCommonTimeManagementService//管理本地常见的时间服务的配置,在网络配置变化时重新配置本地服务

A101-01 08:08:26.376   661   661 I SystemServer: CertBlacklister//黑名单

A101-01 08:08:26.382   661   661 I SystemServiceManager: Starting com.android.server.dreams.DreamManagerService//屏幕保护

A101-01 08:08:26.387   661   661 I SystemServer: StartAssetAtlasService//负责将预加载的bitmap组装成纹理贴图,生成的纹理贴图可以被用来跨进程使用,以减少内存。

A101-01 08:08:26.397   661   661 I SystemServiceManager: Starting com.android.server.print.PrintManagerService//打印相关服务

A101-01 08:08:26.406   661   661 I SystemServiceManager: Starting com.android.server.restrictions.RestrictionsManagerService??

A101-01 08:08:26.411   661   661 I SystemServiceManager: Starting com.android.server.media.MediaSessionService//多媒体相关的服务

A101-01 08:08:26.425   661   661 I SystemServer: StartMediaRouterService

A101-01 08:08:26.433   661   661 I SystemServiceManager: Starting com.android.server.trust.TrustManagerService

A101-01 08:08:26.443   661   661 I SystemServer: StartBackgroundDexOptService

A101-01 08:08:26.449   661   661 I SystemServiceManager: Starting com.android.server.pm.ShortcutService$Lifecycle

A101-01 08:08:26.458   661   661 I SystemServiceManager: Starting com.android.server.pm.LauncherAppsService

A101-01 08:08:26.467   661   661 I SystemServiceManager: Starting com.android.server.media.projection.MediaProjectionManagerService

A101-01 08:08:26.502   661   661 I SystemServiceManager: Starting com.android.server.MmsServiceBroker

  1. Phase480

进入阶段PHASE_LOCK_SETTINGS_READY=480阶段,会进行回调的服务

DevicePolicyManagerService

onBootPhase(480)

DevicePolicyManagerService

阶段480后马上就进入阶段500

A101-01 08:08:26.572   661   661 I SystemServiceManager: Starting phase 480

  1. Phase500

PHASE_SYSTEM_SERVICES_READY=500,进入该阶段服务能安全地调用核心系统服务,

会进行回调的服务:

AlarmManagerService

JobSchedulerService

NotificationManagerService

BackupManagerService

UsageStatsService

DeviceIdleController

TrustManagerService

UiModeManagerService

BluetoothService

BluetoothManagerService

EthernetService

WifiP2pService

WifiScanningService

WifiService

RttService

onBootPhase(500)

 

然后会执行各主要服务的systemReady():

WindowManagerService.systemReady():

PowerManagerService.systemReady():

PackageManagerService.systemReady():

DisplayManagerService.systemReady():

最后执行AMS.systemReady方法.AMS在进行systemReady的时候回调用期待systemUI和homeActivity。

A101-01 08:08:26.595   661   661 I SystemServiceManager: Starting phase 500

A301-01 08:08:26.810   661   661 I boot_progress_ams_ready: 31930

A101-01 08:08:26.810   661   661 I ActivityManager: System now ready

A101-01 08:08:26.823   661   661 I SystemServer: Making services ready

  1. Phase550

PHASE_ACTIVITY_MANAGER_READY=550,

A此阶段AMS的相关Service 已准备就绪,进入该阶段服务能广播Intent;

但是system_server主线程并没有就绪.

会进行回调的服务:

MountService

TelecomLoaderService

UsbService

WebViewUpdateService

DockObserver

BatteryService

onBootPhase(550)

 

接下来执行会进行AMS启动native crash监控,,加载WebView,启动SystemUi等

mActivityManagerService.startObservingNativeCrashes();

WebViewFactory.prepareWebViewInSystemServer();

startSystemUi(context);

networkScoreF.systemReady();

networkManagementF.systemReady();

networkStatsF.systemReady();

networkPolicyF.systemReady();

connectivityF.systemReady();

audioServiceF.systemReady();

Watchdog.getInstance().start();

A101-01 08:08:26.823   661   661 I SystemServiceManager: Starting phase 550

A101-01 08:08:26.830   661   661 D BluetoothManagerService: Bluetooth boot completed

A101-01 08:08:27.066   661   661 I ActivityManager: Start proc 865:com.android.systemui/u0a13 for service com.android.systemui/.ImageWallpaper

A101-01 08:08:27.105   661   661 I SystemServer: WebViewFactory preparation

6Phase600

PHASE_THIRD_PARTY_APPS_CAN_START=600

该阶段会进行回调的服务:

JobSchedulerService

NotificationManagerService

BackupManagerService

AppWidgetService

GestureLauncherService

DreamManagerService

TrustManagerService

VoiceInteractionManagerService

onBootPhase(600)

 

然后接下来就是各种服务的systemRunning过程:

WallpaperManagerService、InputMethodManagerService、LocationManagerService、CountryDetectorService、NetworkTimeUpdateService、CommonTimeManagementService、TextServicesManagerService、AssetAtlasService、InputManagerService、TelephonyRegistry、MediaRouterService、MmsServiceBroker这些服务依次执行其systemRunning()方法。

然后会执行start home activity。

Log:

A101-01 08:08:30.657   661   661 I SystemServiceManager: Starting phase 600

A101-01 08:08:31.714   661   661 I SystemServer: WcnManager Service//sprd 添加

  1. Phase1000

PHASE_BOOT_COMPLETED = 1000

Home Activity启动时,会执行如下调用调用到AMS.finishBooting(),然后则进入阶段Phase1000。

ActivityStarter.startHomeActivityLocked

ActivityStarter.startActivityLocked

WindowManagerService.continueSurfaceLayout

WindowSurfacePlacer.continueLayout

WindowSurfacePlacer.performSurfacePlacement

WindowSurfacePlacer.performSurfacePlacementLoop

WindowSurfacePlacer.performSurfacePlacementInner

WindowManagerService.enableScreenIfNeededLocked

WindowManagerService.performEnableScreen

ActivityManagerService.bootAnimationComplete

ActivityManagerService.finishBooting

到此,系统服务启动阶段完成就绪,system_server进程启动完成则进入Looper.loop()状态,随时待命,等待消息队列MessageQueue中的消息到来,则马上进入执行状态。

Log:

A101-01 08:08:35.805   661   701 I SystemServiceManager: Starting phase 1000

        1. SystemServer启动系统服务的启动方式

system_server进程中的服务启动方式有两种,分别是SystemServiceManager的startService()和ServiceManager的addService

1.startService

通过SystemServiceManager的startService(Class<T> serviceClass)用于启动继承于SystemService的服务。主要功能:

创建serviceClass类对象,将新建对象注册到SystemServiceManager的成员变量mServices;

调用新建对象的onStart()方法,即调用serviceClass.onStart();

当系统启动到一个新的阶段Phase时,SystemServiceManager的startBootPhase()会循环遍历所有向SystemServiceManager注册过服务的onBootPhase()方法,即调用serviceClass.onBootPhase()。

2.addService

通过ServiceManager的addService(String name, IBinder service)用于初始化继承于IBinder的服务。主要功能:

将该服务向Native层的serviceManager注册服务。

        1. 服务类别

system_server进程,从启动的服务可以分为引导服务、核心服务、其他服务3类。

引导服务(7个):ActivityManagerService、PowerManagerService、LightsService、DisplayManagerService、PackageManagerService、UserManagerService、SensorService;

核心服务(3个):BatteryService、UsageStatsService、WebViewUpdateService;

其他服务:AlarmManagerService、VibratorServic.

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值