概述:

该篇章主要做了如下事情:

  • 框架层最核心的服务System server的启动
  • 启动系统管理服务SystemServiceManager
  • 启动引导服务
  • 启动核心服务
  • 启动其他服务

代码路径:
 

/frameworks/base/core/java/com/android/internal/os/  - ZygoteInit.java  - RuntimeInit.java  - Zygote.java/frameworks/base/core/services/java/com/android/server/  - SystemServer.java/frameworks/base/core/jni/  - com_android_internal_os_Zygote.cpp  - AndroidRuntime.cpp/frameworks/base/cmds/app_process/App_main.cpp

System Server启动流程图:

ZygoteInit.forkSystemServer

准备fork系统进程的参数

/**     * Prepare the arguments and forks for the system server process.     *     * Returns an {@code Runnable} that provides an entrypoint into system_server code in the     * child process, and {@code null} in the parent.     */    private static Runnable forkSystemServer(String abiList, String socketName,            ZygoteServer zygoteServer) {        long capabilities = posixCapabilitiesAsBits(            OsConstants.CAP_IPC_LOCK,            OsConstants.CAP_KILL,            OsConstants.CAP_NET_ADMIN,            OsConstants.CAP_NET_BIND_SERVICE,            OsConstants.CAP_NET_BROADCAST,            OsConstants.CAP_NET_RAW,            OsConstants.CAP_SYS_MODULE,            OsConstants.CAP_SYS_NICE,            OsConstants.CAP_SYS_PTRACE,            OsConstants.CAP_SYS_TIME,            OsConstants.CAP_SYS_TTY_CONFIG,            OsConstants.CAP_WAKE_ALARM,            OsConstants.CAP_BLOCK_SUSPEND        );        /* Containers run without some capabilities, so drop any caps that are not available. */        StructCapUserHeader header = new StructCapUserHeader(                OsConstants._LINUX_CAPABILITY_VERSION_3, 0);        //容器运行没有内容,就阻止一些无效的caps.        StructCapUserData[] data;        try {            data = Os.capget(header);        } catch (ErrnoException ex) {            throw new RuntimeException("Failed to capget()", ex);        }        capabilities &= ((long) data[0].effective) | (((long) data[1].effective) << 32);        /* Hardcoded command line to start the system server */        //通过硬编码启动system server        String args[] = {            "--setuid=1000",            "--setgid=1000",            "--setgroups=1001,1002,1003,1004,1005,1006,1007,1008,1009,1010,1018,1021,1023,1024,1032,1065,3001,3002,3003,3006,3007,3009,3010",            "--capabilities=" + capabilities + "," + capabilities,            "--nice-name=system_server",            "--runtime-args",            "--target-sdk-version=" + VMRuntime.SDK_VERSION_CUR_DEVELOPMENT,            "com.android.server.SystemServer",        };        ZygoteConnection.Arguments parsedArgs = null;        int pid;        try {            parsedArgs = new ZygoteConnection.Arguments(args);            ZygoteConnection.applyDebuggerSystemProperty(parsedArgs);            ZygoteConnection.applyInvokeWithSystemProperty(parsedArgs);            boolean profileSystemServer = SystemProperties.getBoolean(                    "dalvik.vm.profilesystemserver", false);            if (profileSystemServer) {                parsedArgs.runtimeFlags |= Zygote.PROFILE_SYSTEM_SERVER;            }            /* Request to fork the system server process */            pid = Zygote.forkSystemServer(                    parsedArgs.uid, parsedArgs.gid,                    parsedArgs.gids,                    parsedArgs.runtimeFlags,                    null,                    parsedArgs.permittedCapabilities,                    parsedArgs.effectiveCapabilities);        } catch (IllegalArgumentException ex) {            throw new RuntimeException(ex);        }        /* For child process */        //启动system server子进程        if (pid == 0) {            if (hasSecondZygote(abiList)) {                waitForSecondaryZygote(socketName);            }            zygoteServer.closeServerSocket();            //处理system server 进程剩下的工作            return handleSystemServerProcess(parsedArgs);        }        return null;    }

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 runtime_flags, jobjectArray rlimits, jlong permittedCapabilities,        jlong effectiveCapabilities) {  pid_t pid = ForkAndSpecializeCommon(env, uid, gid, gids,                                      runtime_flags, rlimits,                                      permittedCapabilities, effectiveCapabilities,                                      MOUNT_EXTERNAL_DEFAULT, NULL, NULL, true, NULL,                                      NULL, false, NULL, NULL);  if (pid > 0) {      // The zygote process checks whether the child process has died or not.      //Zygote 经常检查子进程是否死亡      ALOGI("System server process %d has been created", pid);      gSystemServerPid = pid;      // There is a slight window that the system server process has crashed      // but it went unnoticed because we haven't published its pid yet. So      // we recheck here just to make sure that all is well.      //这有个system server已经奔溃的小窗口,但是它不通知,因为我们还没有发布它的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!");      }      bool low_ram_device = GetBoolProperty("ro.config.low_ram", false);      bool per_app_memcg = GetBoolProperty("ro.config.per_app_memcg", low_ram_device);      if (per_app_memcg) {          // Assign system_server to the correct memory cgroup.          // Not all devices mount /dev/memcg so check for the file first          // to avoid unnecessarily printing errors and denials in the logs.          if (!access("/dev/memcg/system/tasks", F_OK) &&                !WriteStringToFile(StringPrintf("%d", pid), "/dev/memcg/system/tasks")) {              ......          }      }  }  return pid;}

ForkAndSpecializeCommon

// Utility routine to fork zygote and specialize the child process.static pid_t ForkAndSpecializeCommon(JNIEnv* env, uid_t uid, gid_t gid, jintArray javaGids,                                     jint runtime_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, bool is_child_zygote,                                     jstring instructionSet, jstring dataDir) {  //设置子进程的signal信号处理函数  SetSignalHandlers();  ......  //fork pid  pid_t pid = fork();  if (pid == 0) {    //预初始化App    PreApplicationInit();    // Clean up any descriptors which must be closed immediately    //关闭并清除文件描述符    if (!DetachDescriptors(env, fdsToClose, &error_msg)) {      fail_fn(error_msg);    }    ......    // If this zygote isn't root, it won't be able to create a process group,    // since the directory is owned by root.    if (!is_system_server && getuid() == 0) {        //对于非system_server子进程,则创建进程组        int rc = createProcessGroup(uid, getpid());        ......    }    //设置resg id    int rc = setresgid(gid, gid, gid);        ......    //设置res user ID    rc = setresuid(uid, uid, uid);    ......    // Make it easier to debug audit logs by setting the main thread's name to the    // nice name rather than "app_process".    if (se_name_c_str == NULL && is_system_server) {      se_name_c_str = "system_server";    }    if (se_name_c_str != NULL) {      //设置线程名为system_server,方便调试      SetThreadName(se_name_c_str);    }    delete se_info;    delete se_name;    // Unset the SIGCHLD handler, but keep ignoring SIGHUP (rationale in SetSignalHandlers).    //设置子进程的signal信号处理函数为默认函数    UnsetChldSignalHandler();    //等价于调用zygote.callPostForkChildHooks()    env->CallStaticVoidMethod(gZygoteClass, gCallPostForkChildHooks, runtime_flags,                              is_system_server, is_child_zygote, instructionSet);    ......  } else if (pid > 0) {    // the parent process    //进入父进程,即zygote进程    ......    }  }  return pid;}

在这里,从Zygote进程fork 出一个进程用于创建system server进程,system server进程创建好后,便执行ZygoteInit.handleSystemServerProcess来处理system server剩下的工作;

ZygoteInit.handleSystemServerProcess:

这个方法主要做了以下处理:

 

/**     * Finish remaining work for the newly forked system server process.     */    private static Runnable handleSystemServerProcess(ZygoteConnection.Arguments parsedArgs) {        // set umask to 0077 so new files and directories will default to owner-only permissions.        Os.umask(S_IRWXG | S_IRWXO);        if (parsedArgs.niceName != null) {            //设置当前进程名为"system_server"            Process.setArgV0(parsedArgs.niceName);        }        final String systemServerClasspath = Os.getenv("SYSTEMSERVERCLASSPATH");        if (systemServerClasspath != null) {            //执行dex优化操作            performSystemServerDexOpt(systemServerClasspath);            // Capturing profiles is only supported for debug or eng builds since selinux normally            // prevents it.            boolean profileSystemServer = SystemProperties.getBoolean(                    "dalvik.vm.profilesystemserver", false);            if (profileSystemServer && (Build.IS_USERDEBUG || Build.IS_ENG)) {                try {                    //准备system server配置                    prepareSystemServerProfile(systemServerClasspath);                } catch (Exception e) {                    Log.wtf(TAG, "Failed to set up system server profile", e);                }            }        }        if (parsedArgs.invokeWith != null) {            String[] args = parsedArgs.remainingArgs;            // If we have a non-null system server class path, we'll have to duplicate the            // existing arguments and append the classpath to it. ART will handle the classpath            //ART将处理现有的参数附加上classpath。            // correctly when we exec a new process.            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);            throw new IllegalStateException("Unexpected return from WrapperInit.execApplication");        } else {            ClassLoader cl = null;            if (systemServerClasspath != null) {                // 创建类加载器,并赋予当前线程                cl = createPathClassLoader(systemServerClasspath, parsedArgs.targetSdkVersion);                Thread.currentThread().setContextClassLoader(cl);            }            /*             * Pass the remaining arguments to SystemServer.             */            //system_server故进入此分支            return ZygoteInit.zygoteInit(parsedArgs.targetSdkVersion, parsedArgs.remainingArgs, cl);        }    }

ZygoteInit.zygoteInit

public static final Runnable zygoteInit(int targetSdkVersion, String[] argv, ClassLoader classLoader) {        ......        //重新打开android log中的System.out and System.err        RuntimeInit.redirectLogStreams();        //初始化时间、时区、HTTP User-agent格式,logmanager复位。        RuntimeInit.commonInit();        //zygote的初始化        ZygoteInit.nativeZygoteInit();        //应用的初始化        return RuntimeInit.applicationInit(targetSdkVersion, argv, classLoader);    }

RuntimeInit.commonInit

protected static final void commonInit() {        /*         * set handlers; these apply to all threads in the VM. Apps can replace         * the default handler, but not the pre handler.         */        //设置未捕获异常handler        LoggingHandler loggingHandler = new LoggingHandler();        Thread.setUncaughtExceptionPreHandler(loggingHandler);        Thread.setDefaultUncaughtExceptionHandler(new KillApplicationHandler(loggingHandler));        /*         * Install a TimezoneGetter subclass for ZoneInfo.db         */        //设置时区        TimezoneGetter.setInstance(new TimezoneGetter() {            @Override            public String getId() {                return SystemProperties.get("persist.sys.timezone");            }        });        TimeZone.setDefault(null);        /*         * Sets handler for java.util.logging to use Android log facilities.         * The odd "new instance-and-then-throw-away" is a mirror of how         * the "java.util.logging.config.class" system property works. We         * can't use the system property here since the logger has almost         * certainly already been initialized.         */        LogManager.getLogManager().reset();        重置log        new AndroidConfig();        /*         * Sets the default HTTP User-Agent used by HttpURLConnection.         */        设置userAgent格式        String userAgent = getDefaultUserAgent();        System.setProperty("http.agent", userAgent);        /*         * Wire socket tagging to traffic stats.         */        // 设置socket的tag,用于网络流量统计        NetworkManagementSocketTagger.install();        ......        initialized = true;    }

app_main::onZygoteInit

    virtual void onZygoteInit()    {        sp proc = ProcessState::self();        ALOGV("App process: starting thread pool.\n");        //启动binder线程池        proc->startThreadPool();    }

ProcessState::startThreadPool

void ProcessState::startThreadPool(){    AutoMutex _l(mLock);    if (!mThreadPoolStarted) {        mThreadPoolStarted = true;        if (mSpawnThreadOnStart) {            //生成主线程            spawnPooledThread(true);        }    }}

ProcessState::spawnPooledThread

void ProcessState::spawnPooledThread(bool isMain){    if (mThreadPoolStarted) {        String8 name = makeBinderThreadName();        ALOGV("Spawning new pooled thread, name=%s\n", name.string());        //创建线程实例对象        sp t = new PoolThread(isMain);        //线程T 执行run。        t->run(name.string());    }}

RuntimeInit.applicationInit

    protected static Runnable applicationInit(int targetSdkVersion, String[] argv,            ClassLoader classLoader) {        // If the application calls System.exit(), terminate the process        // immediately without running any shutdown hooks.  It is not possible to        // shutdown an Android application gracefully.  Among other things, the        // Android runtime shutdown hooks close the Binder driver, which can cause        // leftover running threads to crash before the process actually exits.        //true代表应用程序退出时不调用AppRuntime.onExit(),否则会在退出前调用        nativeSetExitWithoutCleanup(true);        // We want to be fairly aggressive about heap utilization, to avoid        // holding on to a lot of memory that isn't needed.        //设置虚拟机的内存利用率参数值为0.75        VMRuntime.getRuntime().setTargetHeapUtilization(0.75f);        VMRuntime.getRuntime().setTargetSdkVersion(targetSdkVersion);        //解析参数        final Arguments args = new Arguments(argv);        // The end of of the RuntimeInit event (see #zygoteInit).        Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);        /*通过反射方法findStaticMain,调用startClass的static方法 main(), 此处args.startClass为”com.android.server.SystemServer”*/        // Remaining arguments are passed to the start class's static main        return findStaticMain(args.startClass, args.startArgs, classLoader);    }

SystemServer.main

public static void main(String[] args) {        //执行system server run 方法        new SystemServer().run();    }

SystemServer().run

    private void run() {        try {            ......            //当前时间如果小于1970年,就将当前时间设置为1970年            if (System.currentTimeMillis() < EARLIEST_SUPPORTED_TIME) {                Slog.w(TAG, "System clock is before 1970; setting to 1970.");                SystemClock.setCurrentTimeMillis(EARLIEST_SUPPORTED_TIME);            }            //            // Default the timezone property to GMT if not set.            //默认时区从系统属性persist.sys.timezone获得            String timezoneProperty =  SystemProperties.get("persist.sys.timezone");            if (timezoneProperty == null || timezoneProperty.isEmpty()) {                Slog.w(TAG, "Timezone not set; setting to GMT.");                //如果系统属性persist.sys.timezone是null的,就设置persist.sys.timezone默认值为GMT。                SystemProperties.set("persist.sys.timezone", "GMT");            }            ......            //设置地区语言,语言,国家,地区            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", "");            }            // The system server should never make non-oneway calls            //如果binder通信阻塞就发出警告            Binder.setWarnOnBlocking(true);            // The system server should always load safe labels            //为system server增加安全标签            PackageItemInfo.setForceSafeLabels(true);            // Default to FULL within the system server.            //system server 全局sql默认全同步            SQLiteGlobal.sDefaultSyncMode = SQLiteGlobal.SYNC_MODE_FULL;            // Deactivate SQLiteCompatibilityWalFlags until settings provider is initialized            //SQL初始化好后才能使用            SQLiteCompatibilityWalFlags.init(null);            ......            // In case the runtime switched since last boot (such as when            // the old runtime was removed in an OTA), set the system            // property so that it is in sync. We can | xq oqi't do this in            // libnativehelper's JniInvocation::Init code where we already            // had to fallback to a different runtime because it is            // running as root and we need to be the system user to set            // the property. http://b/11463182            //如果发生OTA,同步系统属性。            SystemProperties.set("persist.sys.dalvik.vm.lib.2", VMRuntime.getRuntime().vmLibrary());            // Mmmmmm... more memory!            //清除内存增长上限,因为启动过程需要很多内存空间            VMRuntime.getRuntime().clearGrowthLimit();            // The system server has to run all of the time, so it needs to be            // as efficient as possible with its memory usage.            //设置内存的可能有效使用率为0.8            VMRuntime.getRuntime().setTargetHeapUtilization(0.8f);            // Some devices rely on runtime fingerprint generation, so make sure            // we've defined it before booting further.            // 针对部分设备依赖于运行时就产生指纹信息,因此需要在开机完成前已经定义            Build.ensureFingerprintProperty();            // Within the system server, it is an error to access Environment paths without            // explicitly specifying a user.            //访问环境变量前,需要明确地指定用户            Environment.setUserRequired(true);            // Within the system server, any incoming Bundles should be defused            // to avoid throwing BadParcelableException.            BaseBundle.setShouldDefuse(true);            // Within the system server, when parceling exceptions, include the stack trace            //默认是会进行stack trace 打包的。            Parcel.setStackTraceParceling(true);            // Ensure binder calls into the system always run at foreground priority.            //确保当前系统进程的binder调用,总是运行在前台优先级(foreground priority)            BinderInternal.disableBackgroundScheduling(true);            // Increase the number of binder threads in system_server            设置system server最大binder线程数量上限。            BinderInternal.setMaxThreads(sMaxBinderThreads);            // Prepare the main looper thread (this thread).            // 主线程looper就在当前线程运行            android.os.Process.setThreadPriority(                android.os.Process.THREAD_PRIORITY_FOREGROUND);            android.os.Process.setCanSelfBackground(false);            Looper.prepareMainLooper();            Looper.getMainLooper().setSlowLogThresholdMs(                    SLOW_DISPATCH_THRESHOLD_MS, SLOW_DELIVERY_THRESHOLD_MS);            // Initialize native services.            /加载android_servers.so库,该库包含的源码在frameworks/base/services/目录下            System.loadLibrary("android_servers");            // Check whether we failed to shut down last time we tried.            // This call may not return.            //检测上次关机过程是否失败,该方法可能不会返回            performPendingShutdown();            // Initialize the system context.            //创建system 上下文            createSystemContext();            // Create the system service manager.            //创建SystemServiceManager            mSystemServiceManager = new SystemServiceManager(mSystemContext);            mSystemServiceManager.setStartInfo(mRuntimeRestart,                    mRuntimeStartElapsedTime, mRuntimeStartUptime);            //将mSystemServiceManager添加到本地服务的成员sLocalServiceObjects            LocalServices.addService(SystemServiceManager.class, mSystemServiceManager);            // Prepare the thread pool for init tasks that can be parallelized            //在system server init期间并行初始化 线程池;            SystemServerInitThreadPool.get();        } finally {           ......        }        // Start services.        // 启动各种服务        try {            //启动引导服务            startBootstrapServices();            //启动核心服务            startCoreServices();            //启动其他服务            startOtherServices();            //SystemServerInitThreadPool关闭            SystemServerInitThreadPool.shutdown();        } catch (Throwable ex) {                        throw ex;        } finally {        }        //严苛模式初始化配置        StrictMode.initVmDefaults(null);        ......        // Loop forever.        //进入looper循环        Looper.loop();        throw new RuntimeException("Main thread loop unexpectedly exited");    }

SystemServer.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 it's a pending reboot into recovery to apply an update,            // always make sure uncrypt gets executed properly when needed.            // If '/cache/recovery/block.map' hasn't been created, stop the            // reboot which will fail for sure, and get a chance to capture a            // bugreport when that's still feasible. (Bug: 26444951)            //            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;                        }                    }                }            }            //关机原因不为空并且不是REBOOT_RECOVERY_UPDATE就执行关机或者重启            Runnable runnable = new Runnable() {                @Override                public void run() {                    synchronized (this) {                        ShutdownThread.rebootOrShutdown(null, reboot, reason);                    }                }            };            // ShutdownThread must run on a looper capable of displaying the UI.            Message msg = Message.obtain(UiThread.getHandler(), runnable);            msg.setAsynchronous(true);            UiThread.getHandler().sendMessage(msg);        }    }

SystemServer.createSystemContext

private void createSystemContext() {        //创建上下文        ActivityThread activityThread = ActivityThread.systemMain();        mSystemContext = activityThread.getSystemContext();        mSystemContext.setTheme(DEFAULT_SYSTEM_THEME);        //设置默认主题        final Context systemUiContext = activityThread.getSystemUiContext();        systemUiContext.setTheme(DEFAULT_SYSTEM_THEME);    }

createSystemContext这个过程会创建对象有ActivityThread,Instrumentation, ContextImpl,LoadedApk,Application;

SystemServer.startBootstrapServices

    private void startBootstrapServices() {        //初始化系统配置实例对象        SystemServerInitThreadPool.get().submit(SystemConfig::getInstance, TAG_SYSTEM_CONFIG);        // MUST be very early        String ioCtlOpen = SystemProperties.get("persist.sys.ioctl.enable");        if (ioCtlOpen == null || ioCtlOpen.isEmpty()) {            SystemProperties.set("persist.sys.ioctl.enable", "true");        }        ......        //阻塞等待与installd建立socket通道        Installer installer = mSystemServiceManager.startService(Installer.class);        ......        //启动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);        // Now that the power manager has been started, let the activity manager        // initialize power management features.               mActivityManagerService.initPowerManagement();        //启动RecoverySystemService        mSystemServiceManager.startService(RecoverySystemService.class);        //如果有循环重启就启动救援机制        RescueParty.noteBoot(mSystemContext);        //启动LightsService        mSystemServiceManager.startService(LightsService.class);        //启动DisplayManagerService        mDisplayManagerService = mSystemServiceManager.startService(DisplayManagerService.class);        //Phase100: 在初始化package manager之前,需要默认的显示.      mSystemServiceManager.startBootPhase(SystemService.PHASE_WAIT_FOR_DEFAULT_DISPLAY);        traceEnd();        //当设备正在加密时,仅运行核心        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();        if (!mRuntimeRestart && !isFirstBootOrUpgrade()) {        .......        }        //启动UserManagerService        mSystemServiceManager.startService(UserManagerService.LifeCycle.class);        // Initialize attribute cache used to cache resources from packages.        //用应用的缓存资源初始化缓存参数        AttributeCache.init(mSystemContext);        mActivityManagerService.setSystemProcess();        // DisplayManagerService needs to setup android.display scheduling related policies        // since setSystemProcess() would have overridden policies due to setProcessGroup        //建立显示机制,setSystemProcess可以覆盖策略        mDisplayManagerService.setupSchedulerPolicies();        // Manages Overlay packages        //管理overlay 包        OverlayManagerService overlayManagerService = new OverlayManagerService(                mSystemContext, installer);        mSystemServiceManager.startService(overlayManagerService);        if (SystemProperties.getInt("persist.sys.displayinset.top", 0) > 0) {            // DisplayManager needs the overlay immediately.            //需要叠加显示            overlayManagerService.updateSystemUiContext();            LocalServices.getService(DisplayManagerInternal.class).onOverlayChanged();        }        // The sensor service needs access to package manager service, app ops        // service, and permissions service, therefore we start it after them.        // Start sensor service in a separate thread. Completion should be checked        // before using it.        //启动 sensor server        mSensorServiceStart = SystemServerInitThreadPool.get().submit(() -> {            startSensorService();        }, START_SENSOR_SERVICE);    }

SystemServer.startCoreServices

    private void startCoreServices() {        //启动电池服务        mSystemServiceManager.startService(BatteryService.class);        //启动流量统计服务        mSystemServiceManager.startService(UsageStatsService.class);        mActivityManagerService.setUsageStatsManager(                LocalServices.getService(UsageStatsManagerInternal.class));                if (mPackageManager.hasSystemFeature(PackageManager.FEATURE_WEBVIEW)) {            //启动webview            mWebViewUpdateService = mSystemServiceManager.startService(WebViewUpdateService.class);        }        //启动BinderCallsStatsService         BinderCallsStatsService.start();    }

SystemServer.startOtherServices

/**     * Starts a miscellaneous grab bag of stuff that has yet to be refactored     * and organized.     */    private void startOtherServices() {        ......        // For debugging RescueParty        //用于救援机制调试        if (Build.IS_DEBUGGABLE && SystemProperties.getBoolean("debug.crash_system", false)) {            throw new RuntimeException();        }        try {            final String SECONDARY_ZYGOTE_PRELOAD = "SecondaryZygotePreload";            //第二次Zygote proload            mZygotePreload = SystemServerInitThreadPool.get().submit(() -> {                try {                                       if (!Process.zygoteProcess.preloadDefault(Build.SUPPORTED_32_BIT_ABIS[0])) {                        Slog.e(TAG, "Unable to preload default resources");                    }                } catch (Exception ex) {                }            }, SECONDARY_ZYGOTE_PRELOAD);            //该服务根据UID提供应用描述信息。            ServiceManager.addService("sec_key_att_app_id_provider",                    new KeyAttestationApplicationIdProviderService(context));            //该服务是替换KeyChain提供存储凭证的私钥。            mSystemServiceManager.startService(KeyChainSystemService.class);            //启动执行策略服务            ServiceManager.addService("scheduling_policy", new SchedulingPolicyService());            ......            //resolver            mContentResolver = context.getContentResolver();            //provider            mActivityManagerService.installSystemProviders();            // Now that SettingsProvider is ready, reactivate SQLiteCompatibilityWalFlags            SQLiteCompatibilityWalFlags.reset();            traceEnd();            // Records errors and logs, for example wtf()            // Currently this service indirectly depends on SettingsProvider so do this after            // InstallSystemProviders.            traceBeginAndSlog("StartDropBoxManager");            mSystemServiceManager.startService(DropBoxManagerService.class);            traceEnd();            traceBeginAndSlog("StartVibratorService");            vibrator = new VibratorService(context);            ServiceManager.addService("vibrator", vibrator);            traceEnd();            if (!isWatch) {                traceBeginAndSlog("StartConsumerIrService");                consumerIr = new ConsumerIrService(context);                ServiceManager.addService(Context.CONSUMER_IR_SERVICE, consumerIr);                traceEnd();            }            traceBeginAndSlog("StartAlarmManagerService");            mSystemServiceManager.startService(AlarmManagerService.class);            traceEnd();            traceBeginAndSlog("InitWatchdog");            final Watchdog watchdog = Watchdog.getInstance();            watchdog.init(context, mActivityManagerService);            traceEnd();            traceBeginAndSlog("StartInputManagerService");            inputManager = new InputManagerService(context);            traceEnd();            traceBeginAndSlog("StartWindowManagerService");            // WMS needs sensor service ready            ConcurrentUtils.waitForFutureNoInterrupt(mSensorServiceStart, START_SENSOR_SERVICE);            mSensorServiceStart = null;            wm = WindowManagerService.main(context, inputManager,                    mFactoryTestMode != FactoryTest.FACTORY_TEST_LOW_LEVEL,                    !mFirstBoot, mOnlyCore, new PhoneWindowManager());            ServiceManager.addService(Context.WINDOW_SERVICE, wm, /* allowIsolated= */ false,                    DUMP_FLAG_PRIORITY_CRITICAL | DUMP_FLAG_PROTO);            ServiceManager.addService(Context.INPUT_SERVICE, inputManager,                    /* allowIsolated= */ false, DUMP_FLAG_PRIORITY_CRITICAL);            traceEnd();            traceBeginAndSlog("SetWindowManagerService");            mActivityManagerService.setWindowManager(wm);            traceEnd();            traceBeginAndSlog("WindowManagerServiceOnInitReady");            wm.onInitReady();            traceEnd();            // Start receiving calls from HIDL services. Start in in a separate thread            // because it need to connect to SensorManager. This have to start            // after START_SENSOR_SERVICE is done.            SystemServerInitThreadPool.get().submit(() -> {                TimingsTraceLog traceLog = new TimingsTraceLog(                        SYSTEM_SERVER_TIMING_ASYNC_TAG, Trace.TRACE_TAG_SYSTEM_SERVER);                traceLog.traceBegin(START_HIDL_SERVICES);                startHidlServices();                traceLog.traceEnd();            }, START_HIDL_SERVICES);            if (!isWatch && enableVrService) {                traceBeginAndSlog("StartVrManagerService");                mSystemServiceManager.startService(VrManagerService.class);                traceEnd();            }            traceBeginAndSlog("StartInputManager");            inputManager.setWindowManagerCallbacks(wm.getInputMonitor());            inputManager.start();            traceEnd();            // TODO: Use service dependencies instead.            traceBeginAndSlog("DisplayManagerWindowManagerAndInputReady");            mDisplayManagerService.windowManagerAndInputReady();            traceEnd();            // Skip Bluetooth if we have an emulator kernel            // TODO: Use a more reliable check to see if this product should            // support Bluetooth - see bug 988521            if (isEmulator) {                Slog.i(TAG, "No Bluetooth Service (emulator)");            } else if (mFactoryTestMode == FactoryTest.FACTORY_TEST_LOW_LEVEL) {                Slog.i(TAG, "No Bluetooth Service (factory test)");            } else if (!context.getPackageManager().hasSystemFeature                       (PackageManager.FEATURE_BLUETOOTH)) {                Slog.i(TAG, "No Bluetooth Service (Bluetooth Hardware Not Present)");            } else {                traceBeginAndSlog("StartBluetoothService");                mSystemServiceManager.startService(BluetoothService.class);                traceEnd();            }            traceBeginAndSlog("IpConnectivityMetrics");            mSystemServiceManager.startService(IpConnectivityMetrics.class);            traceEnd();            traceBeginAndSlog("NetworkWatchlistService");            mSystemServiceManager.startService(NetworkWatchlistService.Lifecycle.class);            traceEnd();            traceBeginAndSlog("PinnerService");            mSystemServiceManager.startService(PinnerService.class);            traceEnd();        } catch (RuntimeException e) {            Slog.e("System", "******************************************");            Slog.e("System", "************ Failure starting core service", e);        }        StatusBarManagerService statusBar = null;        INotificationManager notification = null;        LocationManagerService location = null;        CountryDetectorService countryDetector = null;        ILockSettings lockSettings = null;        MediaRouterService mediaRouter = null;        // Bring up services needed for UI.        if (mFactoryTestMode != FactoryTest.FACTORY_TEST_LOW_LEVEL) {            traceBeginAndSlog("StartInputMethodManagerLifecycle");            mSystemServiceManager.startService(InputMethodManagerService.Lifecycle.class);            traceEnd();            traceBeginAndSlog("StartAccessibilityManagerService");            try {                ServiceManager.addService(Context.ACCESSIBILITY_SERVICE,                        new AccessibilityManagerService(context));            } catch (Throwable e) {                reportWtf("starting Accessibility Manager", e);            }            traceEnd();        }        traceBeginAndSlog("MakeDisplayReady");        try {            wm.displayReady();        } catch (Throwable e) {            reportWtf("making display ready", e);        }        traceEnd();        if (mFactoryTestMode != FactoryTest.FACTORY_TEST_LOW_LEVEL) {            if (!"0".equals(SystemProperties.get("system_init.startmountservice"))) {                traceBeginAndSlog("StartStorageManagerService");                try {                    /*                     * NotificationManagerService is dependant on StorageManagerService,                     * (for media / usb notifications) so we must start StorageManagerService first.                     */                    mSystemServiceManager.startService(STORAGE_MANAGER_SERVICE_CLASS);                    storageManager = IStorageManager.Stub.asInterface(                            ServiceManager.getService("mount"));                } catch (Throwable e) {                    reportWtf("starting StorageManagerService", e);                }                traceEnd();                traceBeginAndSlog("StartStorageStatsService");                try {                    mSystemServiceManager.startService(STORAGE_STATS_SERVICE_CLASS);                } catch (Throwable e) {                    reportWtf("starting StorageStatsService", e);                }                traceEnd();            }        }        // We start this here so that we update our configuration to set watch or television        // as appropriate.        traceBeginAndSlog("StartUiModeManager");        mSystemServiceManager.startService(UiModeManagerService.class);        traceEnd();        if (!mOnlyCore) {            traceBeginAndSlog("UpdatePackagesIfNeeded");            try {                mPackageManagerService.updatePackagesIfNeeded();            } catch (Throwable e) {                reportWtf("update packages", e);            }            traceEnd();        }        traceBeginAndSlog("PerformFstrimIfNeeded");        try {            mPackageManagerService.performFstrimIfNeeded();        } catch (Throwable e) {            reportWtf("performing fstrim", e);        }        traceEnd();        if (mFactoryTestMode != FactoryTest.FACTORY_TEST_LOW_LEVEL) {            traceBeginAndSlog("StartOvumOvulationService");            try {                mOvumOvulationService = mSystemServiceManager.startService(OvumOvulationService.class);mOvumOvulationService.setActivityManager(mActivityManagerService);            } catch (Throwable e) {                reportWtf("starting OvumOvulationService", e);            }            traceEnd();            traceBeginAndSlog("StartLockSettingsService");            try {                mSystemServiceManager.startService(LOCK_SETTINGS_SERVICE_CLASS);                lockSettings = ILockSettings.Stub.asInterface(                    ServiceManager.getService("lock_settings"));            } catch (Throwable e) {                reportWtf("starting LockSettingsService service", e);            }            traceEnd();            final boolean hasPdb = !SystemProperties.get(PERSISTENT_DATA_BLOCK_PROP).equals("");            if (hasPdb) {                traceBeginAndSlog("StartPersistentDataBlock");                mSystemServiceManager.startService(PersistentDataBlockService.class);                traceEnd();            }            if (hasPdb || OemLockService.isHalPresent()) {                // Implementation depends on pdb or the OemLock HAL                traceBeginAndSlog("StartOemLockService");                mSystemServiceManager.startService(OemLockService.class);                traceEnd();            }            traceBeginAndSlog("StartDeviceIdleController");            mSystemServiceManager.startService(DeviceIdleController.class);            traceEnd();            // Always start the Device Policy Manager, so that the API is compatible with            // API8.            traceBeginAndSlog("StartDevicePolicyManager");            mSystemServiceManager.startService(DevicePolicyManagerService.Lifecycle.class);            traceEnd();            if (!isWatch) {                traceBeginAndSlog("StartStatusBarManagerService");                try {                    statusBar = new StatusBarManagerService(context, wm);                    ServiceManager.addService(Context.STATUS_BAR_SERVICE, statusBar);                } catch (Throwable e) {                    reportWtf("starting StatusBarManagerService", e);                }                traceEnd();            }            traceBeginAndSlog("StartClipboardService");            mSystemServiceManager.startService(ClipboardService.class);            traceEnd();            traceBeginAndSlog("StartNetworkManagementService");            try {                networkManagement = NetworkManagementService.create(context);                ServiceManager.addService(Context.NETWORKMANAGEMENT_SERVICE, networkManagement);            } catch (Throwable e) {                reportWtf("starting NetworkManagement Service", e);            }            traceEnd();            traceBeginAndSlog("StartIpSecService");            try {                ipSecService = IpSecService.create(context);                ServiceManager.addService(Context.IPSEC_SERVICE, ipSecService);            } catch (Throwable e) {                reportWtf("starting IpSec Service", e);            }            traceEnd();            traceBeginAndSlog("StartTextServicesManager");            mSystemServiceManager.startService(TextServicesManagerService.Lifecycle.class);            traceEnd();            if (!disableSystemTextClassifier) {                traceBeginAndSlog("StartTextClassificationManagerService");                mSystemServiceManager.startService(TextClassificationManagerService.Lifecycle.class);                traceEnd();            }            traceBeginAndSlog("StartNetworkScoreService");            mSystemServiceManager.startService(NetworkScoreService.Lifecycle.class);            traceEnd();            traceBeginAndSlog("StartNetworkStatsService");            try {                networkStats = NetworkStatsService.create(context, networkManagement);                ServiceManager.addService(Context.NETWORK_STATS_SERVICE, networkStats);            } catch (Throwable e) {                reportWtf("starting NetworkStats Service", e);            }            traceEnd();            traceBeginAndSlog("StartNetworkPolicyManagerService");            try {                networkPolicy = new NetworkPolicyManagerService(context, mActivityManagerService,                        networkManagement);                ServiceManager.addService(Context.NETWORK_POLICY_SERVICE, networkPolicy);            } catch (Throwable e) {                reportWtf("starting NetworkPolicy Service", e);            }            traceEnd();            if (!mOnlyCore) {                if (context.getPackageManager().hasSystemFeature(                            PackageManager.FEATURE_WIFI)) {                    // Wifi Service must be started first for wifi-related services.                    traceBeginAndSlog("StartWifi");                    mSystemServiceManager.startService(WIFI_SERVICE_CLASS);                    traceEnd();                    traceBeginAndSlog("StartWifiScanning");                    mSystemServiceManager.startService(                        "com.android.server.wifi.scanner.WifiScanningService");                    traceEnd();                }                if (context.getPackageManager().hasSystemFeature(                    PackageManager.FEATURE_WIFI_RTT)) {                    traceBeginAndSlog("StartRttService");                    mSystemServiceManager.startService(                        "com.android.server.wifi.rtt.RttService");                    traceEnd();                }                if (context.getPackageManager().hasSystemFeature(                    PackageManager.FEATURE_WIFI_AWARE)) {                    traceBeginAndSlog("StartWifiAware");                    mSystemServiceManager.startService(WIFI_AWARE_SERVICE_CLASS);                    traceEnd();                }                if (context.getPackageManager().hasSystemFeature(                    PackageManager.FEATURE_WIFI_DIRECT)) {                    traceBeginAndSlog("StartWifiP2P");                    mSystemServiceManager.startService(WIFI_P2P_SERVICE_CLASS);                    traceEnd();                }                if (context.getPackageManager().hasSystemFeature(                    PackageManager.FEATURE_LOWPAN)) {                    traceBeginAndSlog("StartLowpan");                    mSystemServiceManager.startService(LOWPAN_SERVICE_CLASS);                    traceEnd();                }            }            if (enableWigig) {                try {                    Slog.i(TAG, "Wigig Service");                    String wigigClassPath =                        "/system/framework/wigig-service.jar" + ":" +                        "/system/framework/vendor.qti.hardware.wigig.supptunnel-V1.0-java.jar" + ":" +                        "/system/framework/vendor.qti.hardware.wigig.netperftuner-V1.0-java.jar";                    PathClassLoader wigigClassLoader =                            new PathClassLoader(wigigClassPath, getClass().getClassLoader());                    Class wigigP2pClass = wigigClassLoader.loadClass(                        "com.qualcomm.qti.server.wigig.p2p.WigigP2pServiceImpl");                    Constructor ctor = wigigP2pClass.getConstructor(Context.class);                    wigigP2pService = ctor.newInstance(context);                    Slog.i(TAG, "Successfully loaded WigigP2pServiceImpl class");                    ServiceManager.addService("wigigp2p", (IBinder) wigigP2pService);                    Class wigigClass = wigigClassLoader.loadClass(                        "com.qualcomm.qti.server.wigig.WigigService");                    ctor = wigigClass.getConstructor(Context.class);                    wigigService = ctor.newInstance(context);                    Slog.i(TAG, "Successfully loaded WigigService class");                    ServiceManager.addService("wigig", (IBinder) wigigService);                } catch (Throwable e) {                    reportWtf("starting WigigService", e);                }            }            if (mPackageManager.hasSystemFeature(PackageManager.FEATURE_ETHERNET) ||                mPackageManager.hasSystemFeature(PackageManager.FEATURE_USB_HOST)) {                traceBeginAndSlog("StartEthernet");                mSystemServiceManager.startService(ETHERNET_SERVICE_CLASS);                traceEnd();            }            traceBeginAndSlog("StartConnectivityService");            try {                connectivity = new ConnectivityService(                    context, networkManagement, networkStats, networkPolicy);                ServiceManager.addService(Context.CONNECTIVITY_SERVICE, connectivity,                            /* allowIsolated= */ false,                    DUMP_FLAG_PRIORITY_HIGH | DUMP_FLAG_PRIORITY_NORMAL);                networkStats.bindConnectivityManager(connectivity);                networkPolicy.bindConnectivityManager(connectivity);            } catch (Throwable e) {                reportWtf("starting Connectivity Service", e);            }            traceEnd();            traceBeginAndSlog("StartNsdService");            try {                serviceDiscovery = NsdService.create(context);                ServiceManager.addService(                    Context.NSD_SERVICE, serviceDiscovery);            } catch (Throwable e) {                reportWtf("starting Service Discovery Service", e);            }            traceEnd();            traceBeginAndSlog("StartSystemUpdateManagerService");            try {                ServiceManager.addService(Context.SYSTEM_UPDATE_SERVICE,                        new SystemUpdateManagerService(context));            } catch (Throwable e) {                reportWtf("starting SystemUpdateManagerService", e);            }            traceEnd();            traceBeginAndSlog("StartUpdateLockService");            try {                ServiceManager.addService(Context.UPDATE_LOCK_SERVICE,                    new UpdateLockService(context));            } catch (Throwable e) {                reportWtf("starting UpdateLockService", e);            }            traceEnd();            traceBeginAndSlog("StartNotificationManager");            mSystemServiceManager.startService(NotificationManagerService.class);            SystemNotificationChannels.createAll(context);            notification = INotificationManager.Stub.asInterface(                    ServiceManager.getService(Context.NOTIFICATION_SERVICE));            traceEnd();            traceBeginAndSlog("StartDeviceMonitor");            mSystemServiceManager.startService(DeviceStorageMonitorService.class);            traceEnd();            traceBeginAndSlog("StartLocationManagerService");            try {                location = new LocationManagerService(context);                ServiceManager.addService(Context.LOCATION_SERVICE, location);            } catch (Throwable e) {                reportWtf("starting Location Manager", e);            }            traceEnd();            traceBeginAndSlog("StartCountryDetectorService");            try {                countryDetector = new CountryDetectorService(context);                ServiceManager.addService(Context.COUNTRY_DETECTOR, countryDetector);            } catch (Throwable e) {                reportWtf("starting Country Detector", e);            }            traceEnd();traceBeginAndSlog("StartOvumManagerService");try {                ServiceManager.addService(Context.OVUM_MANAGER_SERVICE,        new OvumManagerService(context, mPowerManagerService, mActivityManagerService));} catch (Throwable e) {    reportWtf("starting OvumManagerService", e);}traceEnd();            traceBeginAndSlog("StartFreezeService");            try {                if (FreezeManager.isFreezeOpen()) {                    ServiceManager.addService(Context.OVUM_FREEZE_SERVICE,                            new FreezeService(context, mActivityManagerService, location));                }            } catch (Throwable e) {                reportWtf("starting FreezeService", e);            }            traceEnd();try {                ServiceManager.addService(Context.OVUM_PERFORMANCEOBSERVER_SERVICE,                        new PerformanceObserverService(context, mActivityManagerService));            } catch (Throwable e) {                reportWtf("starting PerformanceObserverService", e);            }/*try {                ServiceManager.addService(Context.PERFORMANCE_MONITOR_SERVICE,                        new PerformanceObserverService(context, mActivityManagerService));            } catch (Throwable e) {                reportWtf("starting PerformanceMonitor", e);            }*/            if (!isWatch) {                traceBeginAndSlog("StartSearchManagerService");                try {                    mSystemServiceManager.startService(SEARCH_MANAGER_SERVICE_CLASS);                } catch (Throwable e) {                    reportWtf("starting Search Service", e);                }                traceEnd();            }            if (context.getResources().getBoolean(R.bool.config_enableWallpaperService)) {                traceBeginAndSlog("StartWallpaperManagerService");                mSystemServiceManager.startService(WALLPAPER_SERVICE_CLASS);                traceEnd();            }            traceBeginAndSlog("StartAudioService");            mSystemServiceManager.startService(AudioService.Lifecycle.class);            traceEnd();            if (mPackageManager.hasSystemFeature(PackageManager.FEATURE_BROADCAST_RADIO)) {                traceBeginAndSlog("StartBroadcastRadioService");                mSystemServiceManager.startService(BroadcastRadioService.class);                traceEnd();            }            traceBeginAndSlog("StartDockObserver");            mSystemServiceManager.startService(DockObserver.class);            traceEnd();            if (isWatch) {                traceBeginAndSlog("StartThermalObserver");                mSystemServiceManager.startService(THERMAL_OBSERVER_CLASS);                traceEnd();            }            traceBeginAndSlog("StartWiredAccessoryManager");            try {                // Listen for wired headset changes                inputManager.setWiredAccessoryCallbacks(                        new WiredAccessoryManager(context, inputManager));            } catch (Throwable e) {                reportWtf("starting WiredAccessoryManager", e);            }            traceEnd();            if (mPackageManager.hasSystemFeature(PackageManager.FEATURE_MIDI)) {                // Start MIDI Manager service                traceBeginAndSlog("StartMidiManager");                mSystemServiceManager.startService(MIDI_SERVICE_CLASS);                traceEnd();            }            if (mPackageManager.hasSystemFeature(PackageManager.FEATURE_USB_HOST)                || mPackageManager.hasSystemFeature(                PackageManager.FEATURE_USB_ACCESSORY)                || isEmulator) {                // Manage USB host and device support                traceBeginAndSlog("StartUsbService");                mSystemServiceManager.startService(USB_SERVICE_CLASS);                traceEnd();            }            if (!isWatch) {                traceBeginAndSlog("StartSerialService");                try {                    // Serial port support                    serial = new SerialService(context);                    ServiceManager.addService(Context.SERIAL_SERVICE, serial);                } catch (Throwable e) {                    Slog.e(TAG, "Failure starting SerialService", e);                }                traceEnd();            }            traceBeginAndSlog("StartHardwarePropertiesManagerService");            try {                hardwarePropertiesService = new HardwarePropertiesManagerService(context);                ServiceManager.addService(Context.HARDWARE_PROPERTIES_SERVICE,                    hardwarePropertiesService);            } catch (Throwable e) {                Slog.e(TAG, "Failure starting HardwarePropertiesManagerService", e);            }            traceEnd();            traceBeginAndSlog("StartTwilightService");            mSystemServiceManager.startService(TwilightService.class);            traceEnd();            if (ColorDisplayController.isAvailable(context)) {                traceBeginAndSlog("StartNightDisplay");                mSystemServiceManager.startService(ColorDisplayService.class);                traceEnd();            }            traceBeginAndSlog("StartJobScheduler");            JobSchedulerService js = mSystemServiceManager.startService(JobSchedulerService.class);            traceEnd();            traceBeginAndSlog("StartIdleControllerService");            try {                ServiceManager.addService(Context.OVUM_IDLE_CONTROLLER_SERVICE,                        new IdleControllerService(context, mPowerManagerService, mActivityManagerService, location, wm, js));            } catch (Throwable e) {                reportWtf("starting IdleControllerService", e);            }            traceEnd();            traceBeginAndSlog("StartSoundTrigger");            mSystemServiceManager.startService(SoundTriggerService.class);            traceEnd();            traceBeginAndSlog("StartTrustManager");            mSystemServiceManager.startService(TrustManagerService.class);            traceEnd();            if (mPackageManager.hasSystemFeature(PackageManager.FEATURE_BACKUP)) {                traceBeginAndSlog("StartBackupManager");                mSystemServiceManager.startService(BACKUP_MANAGER_SERVICE_CLASS);                traceEnd();            }            if (mPackageManager.hasSystemFeature(PackageManager.FEATURE_APP_WIDGETS)                || context.getResources().getBoolean(R.bool.config_enableAppWidgetService)) {                traceBeginAndSlog("StartAppWidgerService");                mSystemServiceManager.startService(APPWIDGET_SERVICE_CLASS);                traceEnd();            }            // We need to always start this service, regardless of whether the            // FEATURE_VOICE_RECOGNIZERS feature is set, because it needs to take care            // of initializing various settings.  It will internally modify its behavior            // based on that feature.            traceBeginAndSlog("StartVoiceRecognitionManager");            mSystemServiceManager.startService(VOICE_RECOGNITION_MANAGER_SERVICE_CLASS);            traceEnd();            if (GestureLauncherService.isGestureLauncherEnabled(context.getResources())) {                traceBeginAndSlog("StartGestureLauncher");                mSystemServiceManager.startService(GestureLauncherService.class);                traceEnd();            }            traceBeginAndSlog("StartSensorNotification");            mSystemServiceManager.startService(SensorNotificationService.class);            traceEnd();            traceBeginAndSlog("StartContextHubSystemService");            mSystemServiceManager.startService(ContextHubSystemService.class);            traceEnd();            traceBeginAndSlog("StartDiskStatsService");            try {                ServiceManager.addService("diskstats", new DiskStatsService(context));            } catch (Throwable e) {                reportWtf("starting DiskStats Service", e);            }            traceEnd();            // timezone.RulesManagerService will prevent a device starting up if the chain of trust            // required for safe time zone updates might be broken. RuleManagerService cannot do            // this check when mOnlyCore == true, so we don't enable the service in this case.            // This service requires that JobSchedulerService is already started when it starts.            final boolean startRulesManagerService =                    !mOnlyCore && context.getResources().getBoolean(                            R.bool.config_enableUpdateableTimeZoneRules);            if (startRulesManagerService) {                traceBeginAndSlog("StartTimeZoneRulesManagerService");                mSystemServiceManager.startService(TIME_ZONE_RULES_MANAGER_SERVICE_CLASS);                traceEnd();            }            if (!isWatch) {                traceBeginAndSlog("StartNetworkTimeUpdateService");                try {                    networkTimeUpdater = new NetworkTimeUpdateService(context);                    ServiceManager.addService("network_time_update_service", networkTimeUpdater);                } catch (Throwable e) {                    reportWtf("starting NetworkTimeUpdate service", e);                }                traceEnd();            }            traceBeginAndSlog("StartCommonTimeManagementService");            try {                commonTimeMgmtService = new CommonTimeManagementService(context);                ServiceManager.addService("commontime_management", commonTimeMgmtService);            } catch (Throwable e) {                reportWtf("starting CommonTimeManagementService service", e);            }            traceEnd();            traceBeginAndSlog("CertBlacklister");            try {                CertBlacklister blacklister = new CertBlacklister(context);            } catch (Throwable e) {                reportWtf("starting CertBlacklister", e);            }            traceEnd();            if (EmergencyAffordanceManager.ENABLED) {                // EmergencyMode service                traceBeginAndSlog("StartEmergencyAffordanceService");                mSystemServiceManager.startService(EmergencyAffordanceService.class);                traceEnd();            }            // Dreams (interactive idle-time views, a/k/a screen savers, and doze mode)            traceBeginAndSlog("StartDreamManager");            mSystemServiceManager.startService(DreamManagerService.class);            traceEnd();            traceBeginAndSlog("AddGraphicsStatsService");            ServiceManager.addService(GraphicsStatsService.GRAPHICS_STATS_SERVICE,                new GraphicsStatsService(context));            traceEnd();            if (CoverageService.ENABLED) {                traceBeginAndSlog("AddCoverageService");                ServiceManager.addService(CoverageService.COVERAGE_SERVICE, new CoverageService());                traceEnd();            }            if (mPackageManager.hasSystemFeature(PackageManager.FEATURE_PRINTING)) {                traceBeginAndSlog("StartPrintManager");                mSystemServiceManager.startService(PRINT_MANAGER_SERVICE_CLASS);                traceEnd();            }            if (mPackageManager.hasSystemFeature(PackageManager.FEATURE_COMPANION_DEVICE_SETUP)) {                traceBeginAndSlog("StartCompanionDeviceManager");                mSystemServiceManager.startService(COMPANION_DEVICE_MANAGER_SERVICE_CLASS);                traceEnd();            }            traceBeginAndSlog("StartRestrictionManager");            mSystemServiceManager.startService(RestrictionsManagerService.class);            traceEnd();            traceBeginAndSlog("StartMediaSessionService");            mSystemServiceManager.startService(MediaSessionService.class);            traceEnd();            traceBeginAndSlog("StartMediaUpdateService");            mSystemServiceManager.startService(MediaUpdateService.class);            traceEnd();            if (mPackageManager.hasSystemFeature(PackageManager.FEATURE_HDMI_CEC)) {                traceBeginAndSlog("StartHdmiControlService");                mSystemServiceManager.startService(HdmiControlService.class);                traceEnd();            }            if (mPackageManager.hasSystemFeature(PackageManager.FEATURE_LIVE_TV)                    || mPackageManager.hasSystemFeature(PackageManager.FEATURE_LEANBACK)) {                traceBeginAndSlog("StartTvInputManager");                mSystemServiceManager.startService(TvInputManagerService.class);                traceEnd();            }            if (mPackageManager.hasSystemFeature(PackageManager.FEATURE_PICTURE_IN_PICTURE)) {                traceBeginAndSlog("StartMediaResourceMonitor");                mSystemServiceManager.startService(MediaResourceMonitorService.class);                traceEnd();            }            if (mPackageManager.hasSystemFeature(PackageManager.FEATURE_LEANBACK)) {                traceBeginAndSlog("StartTvRemoteService");                mSystemServiceManager.startService(TvRemoteService.class);                traceEnd();            }            traceBeginAndSlog("StartMediaRouterService");            try {                mediaRouter = new MediaRouterService(context);                ServiceManager.addService(Context.MEDIA_ROUTER_SERVICE, mediaRouter);            } catch (Throwable e) {                reportWtf("starting MediaRouterService", e);            }            traceEnd();            if (mPackageManager.hasSystemFeature(PackageManager.FEATURE_FINGERPRINT)) {                traceBeginAndSlog("StartFingerprintSensor");                mSystemServiceManager.startService(FingerprintService.class);                traceEnd();            }            traceBeginAndSlog("StartBackgroundDexOptService");            try {                BackgroundDexOptService.schedule(context);            } catch (Throwable e) {                reportWtf("starting StartBackgroundDexOptService", e);            }            traceEnd();            traceBeginAndSlog("StartPruneInstantAppsJobService");            try {                PruneInstantAppsJobService.schedule(context);            } catch (Throwable e) {                reportWtf("StartPruneInstantAppsJobService", e);            }            traceEnd();            // LauncherAppsService uses ShortcutService.            traceBeginAndSlog("StartShortcutServiceLifecycle");            mSystemServiceManager.startService(ShortcutService.Lifecycle.class);            traceEnd();            traceBeginAndSlog("StartLauncherAppsService");            mSystemServiceManager.startService(LauncherAppsService.class);            traceEnd();            traceBeginAndSlog("StartCrossProfileAppsService");            mSystemServiceManager.startService(CrossProfileAppsService.class);            traceEnd();        }        if (!isWatch) {            traceBeginAndSlog("StartMediaProjectionManager");            mSystemServiceManager.startService(MediaProjectionManagerService.class);            traceEnd();        }        if (isWatch) {            traceBeginAndSlog("StartWearConfigService");            mSystemServiceManager.startService(WEAR_CONFIG_SERVICE_CLASS);            traceEnd();            traceBeginAndSlog("StartWearConnectivityService");            mSystemServiceManager.startService(WEAR_CONNECTIVITY_SERVICE_CLASS);            traceEnd();            traceBeginAndSlog("StartWearTimeService");            mSystemServiceManager.startService(WEAR_DISPLAY_SERVICE_CLASS);            mSystemServiceManager.startService(WEAR_TIME_SERVICE_CLASS);            traceEnd();            if (enableLeftyService) {                traceBeginAndSlog("StartWearLeftyService");                mSystemServiceManager.startService(WEAR_LEFTY_SERVICE_CLASS);                traceEnd();            }            traceBeginAndSlog("StartWearGlobalActionsService");            mSystemServiceManager.startService(WEAR_GLOBAL_ACTIONS_SERVICE_CLASS);            traceEnd();        }        if (!disableSlices) {            traceBeginAndSlog("StartSliceManagerService");            mSystemServiceManager.startService(SLICE_MANAGER_SERVICE_CLASS);            traceEnd();        }        if (!disableCameraService) {            traceBeginAndSlog("StartCameraServiceProxy");            mSystemServiceManager.startService(CameraServiceProxy.class);            traceEnd();        }        if (context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_EMBEDDED)) {            traceBeginAndSlog("StartIoTSystemService");            mSystemServiceManager.startService(IOT_SERVICE_CLASS);            traceEnd();        }        // Statsd helper        traceBeginAndSlog("StartStatsCompanionService");        mSystemServiceManager.startService(StatsCompanionService.Lifecycle.class);        traceEnd();        // Before things start rolling, be sure we have decided whether        // we are in safe mode.        final boolean safeMode = wm.detectSafeMode();        if (safeMode) {            traceBeginAndSlog("EnterSafeModeAndDisableJitCompilation");            mActivityManagerService.enterSafeMode();            // Disable the JIT for the system_server process            VMRuntime.getRuntime().disableJitCompilation();            traceEnd();        } else {            // Enable the JIT for the system_server process            traceBeginAndSlog("StartJitCompilation");            VMRuntime.getRuntime().startJitCompilation();            traceEnd();        }        // MMS service broker        traceBeginAndSlog("StartMmsService");        mmsService = mSystemServiceManager.startService(MmsServiceBroker.class);        traceEnd();        if (mPackageManager.hasSystemFeature(PackageManager.FEATURE_AUTOFILL)) {            traceBeginAndSlog("StartAutoFillService");            mSystemServiceManager.startService(AUTO_FILL_MANAGER_SERVICE_CLASS);            traceEnd();        }        // It is now time to start up the app processes...        traceBeginAndSlog("MakeVibratorServiceReady");        try {            vibrator.systemReady();        } catch (Throwable e) {            reportWtf("making Vibrator Service ready", e);        }        traceEnd();        traceBeginAndSlog("MakeLockSettingsServiceReady");        if (lockSettings != null) {            try {                lockSettings.systemReady();            } catch (Throwable e) {                reportWtf("making Lock Settings Service ready", e);            }        }        traceEnd();        // Needed by DevicePolicyManager for initialization        traceBeginAndSlog("StartBootPhaseLockSettingsReady");        mSystemServiceManager.startBootPhase(SystemService.PHASE_LOCK_SETTINGS_READY);        traceEnd();        traceBeginAndSlog("StartBootPhaseSystemServicesReady");        mSystemServiceManager.startBootPhase(SystemService.PHASE_SYSTEM_SERVICES_READY);        traceEnd();        // Wigig services are not registered as system services because of class loader        // limitations, send boot phase notification separately        if (enableWigig) {            try {                Slog.i(TAG, "calling onBootPhase for Wigig Services");                Class wigigP2pClass = wigigP2pService.getClass();                Method m = wigigP2pClass.getMethod("onBootPhase", int.class);                m.invoke(wigigP2pService, new Integer(                    SystemService.PHASE_SYSTEM_SERVICES_READY));                Class wigigClass = wigigService.getClass();                m = wigigClass.getMethod("onBootPhase", int.class);                m.invoke(wigigService, new Integer(                    SystemService.PHASE_SYSTEM_SERVICES_READY));            } catch (Throwable e) {                reportWtf("Wigig services ready", e);            }        }        traceBeginAndSlog("MakeWindowManagerServiceReady");        try {            wm.systemReady();        } catch (Throwable e) {            reportWtf("making Window Manager Service ready", e);        }        traceEnd();        if (safeMode) {            mActivityManagerService.showSafeModeOverlay();        }        // Update the configuration for this context by hand, because we're going        // to start using it before the config change done in wm.systemReady() will        // propagate to it.        final Configuration config = wm.computeNewConfiguration(DEFAULT_DISPLAY);        DisplayMetrics metrics = new DisplayMetrics();        WindowManager w = (WindowManager)context.getSystemService(Context.WINDOW_SERVICE);        w.getDefaultDisplay().getMetrics(metrics);        context.getResources().updateConfiguration(config, metrics);        // The system context's theme may be configuration-dependent.        final Theme systemTheme = context.getTheme();        if (systemTheme.getChangingConfigurations() != 0) {            systemTheme.rebase();        }        traceBeginAndSlog("MakePowerManagerServiceReady");        try {            // TODO: use boot phase            mPowerManagerService.systemReady(mActivityManagerService.getAppOpsService());        } catch (Throwable e) {            reportWtf("making Power Manager Service ready", e);        }        traceEnd();        traceBeginAndSlog("MakePackageManagerServiceReady");        mPackageManagerService.systemReady();        traceEnd();        traceBeginAndSlog("MakeDisplayManagerServiceReady");        try {            // TODO: use boot phase and communicate these flags some other way            mDisplayManagerService.systemReady(safeMode, mOnlyCore);        } catch (Throwable e) {            reportWtf("making Display Manager Service ready", e);        }        traceEnd();        mSystemServiceManager.setSafeMode(safeMode);        // Start device specific services        traceBeginAndSlog("StartDeviceSpecificServices");        final String[] classes = mSystemContext.getResources().getStringArray(                R.array.config_deviceSpecificSystemServices);        for (final String className : classes) {            traceBeginAndSlog("StartDeviceSpecificServices " + className);            try {                mSystemServiceManager.startService(className);            } catch (Throwable e) {                reportWtf("starting " + className, e);            }            traceEnd();        }        traceEnd();        traceBeginAndSlog("StartBootPhaseDeviceSpecificServicesReady");        mSystemServiceManager.startBootPhase(SystemService.PHASE_DEVICE_SPECIFIC_SERVICES_READY);        traceEnd();        // These are needed to propagate to the runnable below.        final NetworkManagementService networkManagementF = networkManagement;        final NetworkStatsService networkStatsF = networkStats;        final NetworkPolicyManagerService networkPolicyF = networkPolicy;        final ConnectivityService connectivityF = connectivity;        final LocationManagerService locationF = location;        final CountryDetectorService countryDetectorF = countryDetector;        final NetworkTimeUpdateService networkTimeUpdaterF = networkTimeUpdater;        final CommonTimeManagementService commonTimeMgmtServiceF = commonTimeMgmtService;        final InputManagerService inputManagerF = inputManager;        final TelephonyRegistry telephonyRegistryF = telephonyRegistry;        final MediaRouterService mediaRouterF = mediaRouter;        final MmsServiceBroker mmsServiceF = mmsService;        final IpSecService ipSecServiceF = ipSecService;        final WindowManagerService windowManagerF = wm;        // We now tell the activity manager it is okay to run third party        // code.  It will call back into us once it has gotten to the state        // where third party code can really run (but before it has actually        // started launching the initial applications), for us to complete our        // initialization.        mActivityManagerService.systemReady(() -> {            Slog.i(TAG, "Making services ready");            traceBeginAndSlog("StartActivityManagerReadyPhase");            addBootEvent("StartActivityManagerReadyPhase");            mSystemServiceManager.startBootPhase(                    SystemService.PHASE_ACTIVITY_MANAGER_READY);            traceEnd();            addBootEvent("StartActivityManagerReadyPhase END");            traceBeginAndSlog("StartObservingNativeCrashes");            addBootEvent("StartObservingNativeCrashes");            try {                mActivityManagerService.startObservingNativeCrashes();            } catch (Throwable e) {                reportWtf("observing native crashes", e);            }            traceEnd();            addBootEvent("StartObservingNativeCrashes END");            // No dependency on Webview preparation in system server. But this should            // be completed before allowing 3rd party            final String WEBVIEW_PREPARATION = "WebViewFactoryPreparation";            Future<?> webviewPrep = null;            if (!mOnlyCore && mWebViewUpdateService != null) {                webviewPrep = SystemServerInitThreadPool.get().submit(() -> {                    Slog.i(TAG, WEBVIEW_PREPARATION);                    TimingsTraceLog traceLog = new TimingsTraceLog(                            SYSTEM_SERVER_TIMING_ASYNC_TAG, Trace.TRACE_TAG_SYSTEM_SERVER);                    traceLog.traceBegin(WEBVIEW_PREPARATION);                    ConcurrentUtils.waitForFutureNoInterrupt(mZygotePreload, "Zygote preload");                    mZygotePreload = null;                    mWebViewUpdateService.prepareWebViewInSystemServer();                    traceLog.traceEnd();                }, WEBVIEW_PREPARATION);            }            if (mPackageManager.hasSystemFeature(PackageManager.FEATURE_AUTOMOTIVE)) {                traceBeginAndSlog("StartCarServiceHelperService");                addBootEvent("StartCarServiceHelperService");                mSystemServiceManager.startService(CAR_SERVICE_HELPER_SERVICE_CLASS);                addBootEvent("StartCarServiceHelperService END");                traceEnd();            }            traceBeginAndSlog("StartSystemUI");            addBootEvent("StartSystemUI");            try {                startSystemUi(context, windowManagerF);            } catch (Throwable e) {                reportWtf("starting System UI", e);            }            addBootEvent("StartSystemUI END");            traceEnd();            traceBeginAndSlog("MakeNetworkManagementServiceReady");            addBootEvent("MakeNetworkManagementServiceReady");            try {                if (networkManagementF != null) networkManagementF.systemReady();            } catch (Throwable e) {                reportWtf("making Network Managment Service ready", e);            }            CountDownLatch networkPolicyInitReadySignal = null;            if (networkPolicyF != null) {                networkPolicyInitReadySignal = networkPolicyF                        .networkScoreAndNetworkManagementServiceReady();            }            addBootEvent("MakeNetworkManagementServiceReady END");            traceEnd();                        traceBeginAndSlog("MakeIpSecServiceReady");            addBootEvent("MakeIpSecServiceReady");            try {                if (ipSecServiceF != null) ipSecServiceF.systemReady();            } catch (Throwable e) {                reportWtf("making IpSec Service ready", e);            }                        addBootEvent("MakeIpSecServiceReady END");                        traceEnd();                        traceBeginAndSlog("MakeNetworkStatsServiceReady");            addBootEvent("MakeNetworkStatsServiceReady");            try {                if (networkStatsF != null) networkStatsF.systemReady();            } catch (Throwable e) {                reportWtf("making Network Stats Service ready", e);            }            addBootEvent("MakeNetworkStatsServiceReady END");            traceEnd();            traceBeginAndSlog("MakeConnectivityServiceReady");            addBootEvent("MakeConnectivityServiceReady");            try {                if (connectivityF != null) connectivityF.systemReady();            } catch (Throwable e) {                reportWtf("making Connectivity Service ready", e);            }            addBootEvent("MakeConnectivityServiceReady END");            traceEnd();            traceBeginAndSlog("MakeNetworkPolicyServiceReady");            addBootEvent("MakeNetworkPolicyServiceReady");            try {                if (networkPolicyF != null) {                    networkPolicyF.systemReady(networkPolicyInitReadySignal);                }            } catch (Throwable e) {                reportWtf("making Network Policy Service ready", e);            }            addBootEvent("MakeNetworkPolicyServiceReady END");            traceEnd();            traceBeginAndSlog("StartWatchdog");            addBootEvent("StartWatchdog");            Watchdog.getInstance().start();            addBootEvent("StartWatchdog END");            traceEnd();            // Wait for all packages to be prepared            mPackageManagerService.waitForAppDataPrepared();            // It is now okay to let the various system services start their            // third party code...            traceBeginAndSlog("PhaseThirdPartyAppsCanStart");            addBootEvent("PhaseThirdPartyAppsCanStart");            // confirm webview completion before starting 3rd party            if (webviewPrep != null) {                ConcurrentUtils.waitForFutureNoInterrupt(webviewPrep, WEBVIEW_PREPARATION);            }            mSystemServiceManager.startBootPhase(                    SystemService.PHASE_THIRD_PARTY_APPS_CAN_START);            addBootEvent("PhaseThirdPartyAppsCanStart END");            traceEnd();            traceBeginAndSlog("MakeLocationServiceReady");            addBootEvent("MakeLocationServiceReady");            try {                if (locationF != null) locationF.systemRunning();            } catch (Throwable e) {                reportWtf("Notifying Location Service running", e);            }            addBootEvent("MakeLocationServiceReady END");            traceEnd();            traceBeginAndSlog("MakeCountryDetectionServiceReady");            addBootEvent("MakeCountryDetectionServiceReady");            try {                if (countryDetectorF != null) countryDetectorF.systemRunning();            } catch (Throwable e) {                reportWtf("Notifying CountryDetectorService running", e);            }            addBootEvent("MakeCountryDetectionServiceReady END");            traceEnd();            traceBeginAndSlog("MakeNetworkTimeUpdateReady");            addBootEvent("MakeNetworkTimeUpdateReady");            try {                if (networkTimeUpdaterF != null) networkTimeUpdaterF.systemRunning();            } catch (Throwable e) {                reportWtf("Notifying NetworkTimeService running", e);            }            addBootEvent("MakeNetworkTimeUpdateReady END");            traceEnd();            traceBeginAndSlog("MakeCommonTimeManagementServiceReady");            addBootEvent("MakeCommonTimeManagementServiceReady");            try {                if (commonTimeMgmtServiceF != null) {                    commonTimeMgmtServiceF.systemRunning();                }            } catch (Throwable e) {                reportWtf("Notifying CommonTimeManagementService running", e);            }            addBootEvent("MakeCommonTimeManagementServiceReady END");            traceEnd();            traceBeginAndSlog("MakeInputManagerServiceReady");            addBootEvent("MakeInputManagerServiceReady");            try {                // TODO(BT) Pass parameter to input manager                if (inputManagerF != null) inputManagerF.systemRunning();            } catch (Throwable e) {                reportWtf("Notifying InputManagerService running", e);            }            addBootEvent("MakeInputManagerServiceReady END");            traceEnd();            traceBeginAndSlog("MakeTelephonyRegistryReady");            addBootEvent("MakeTelephonyRegistryReady");            try {                if (telephonyRegistryF != null) telephonyRegistryF.systemRunning();            } catch (Throwable e) {                reportWtf("Notifying TelephonyRegistry running", e);            }            addBootEvent("MakeTelephonyRegistryReady END");            traceEnd();            traceBeginAndSlog("MakeMediaRouterServiceReady");            addBootEvent("MakeMediaRouterServiceReady");            try {                if (mediaRouterF != null) mediaRouterF.systemRunning();            } catch (Throwable e) {                reportWtf("Notifying MediaRouterService running", e);            }            addBootEvent("MakeMediaRouterServiceReady END");            traceEnd();            traceBeginAndSlog("MakeMmsServiceReady");            addBootEvent("MakeMmsServiceReady");            try {                if (mmsServiceF != null) mmsServiceF.systemRunning();            } catch (Throwable e) {                reportWtf("Notifying MmsService running", e);            }            addBootEvent("MakeMmsServiceReady END");            traceEnd();            traceBeginAndSlog("IncidentDaemonReady");            addBootEvent("IncidentDaemonReady");            try {                // TODO: Switch from checkService to getService once it's always                // in the build and should reliably be there.                final IIncidentManager incident = IIncidentManager.Stub.asInterface(                        ServiceManager.getService(Context.INCIDENT_SERVICE));                if (incident != null) incident.systemRunning();            } catch (Throwable e) {                reportWtf("Notifying incident daemon running", e);            }            addBootEvent("IncidentDaemonReady END");            traceEnd();        }, BOOT_TIMINGS_TRACE_LOG);        traceBeginAndSlog("ScheduleIdleOptimize");        addBootEvent("ScheduleIdleOptimize");        try {            BackgroundDexOptService.scheduleIdleOptimize(context);        } catch (Throwable e) {            reportWtf("ScheduleIdleOptimize", e);        }        addBootEvent("ScheduleIdleOptimize END");        traceEnd();    }

如图所示,图中为SystemServer 启动的服务:

System server的启动过程做了如上事情,System Server启动完成后,会启动HOME APP,详情请见下节。

更多相关文章

  1. 一个不错的启动菜单显示屏动画效果
  2. IPC——android进程间通信
  3. Android(安卓)SDK1.0 Permission 大全访问权限许可
  4. JDK ANT ANDROID Configure
  5. android 权限大全
  6. Android开发实践 界面编程(中)
  7. Android,View设置margin
  8. Android应用最上层悬浮窗实现不依赖于Activity的弹框
  9. MPAndroidChart~BubbleChart(气泡图) and RadarChart(雷达图)

随机推荐

  1. 笔记本剪切时中断,文件不见了怎么找回
  2. 远程debug
  3. 游戏测试和软件测试哪个好点?
  4. 2.0 Ansible Ad-Hoc命令
  5. 1.3 Ansible 整体架构图
  6. 1.2 Ansible 基础概念
  7. 存量用户运营企业微信的“用户端小程序”
  8. Unity | 快速集成华为AGC云存储服务
  9. 脑补|yarn能并行运行任务总数~
  10. 好用的前端开发工具:这四款你必须知道