Android开机启动流程分析二(System进程)

2021-01-11  本文已影响0人  假期开发仔

   在Android开机启动流程分析一Zygote进程那一章中知道在ZygoteInit.main方法中,会调用ZygoteInit.startSystemServer进行System进程以及相关服务的启动,之后就会进入循环等待模式,等待ActivityMangagerService创建新应用进程的请求。接下来从ZygoteInit.startSystemServer开始通过源码分析System进程和服务的启动流程。

ZygoteInit.startSystemServer

   startSystemServer:为System服务进程准备参数,并从Zygotefork一个System进程出来。源码如下:

// 这里根据不同的系统产生的参数不同 以rk3399_industry Android7.1.2为例
// adbList = ro.product.cpu.abilist64
// socketName = “zygote”
private static boolean startSystemServer(String abiList, String socketName)
            throws MethodAndArgsCaller, RuntimeException {
        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
        );
        ....
        /* 保存System进程的启动参数 */
        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 {
            parsedArgs = new ZygoteConnection.Arguments(args);
            ZygoteConnection.applyDebuggerSystemProperty(parsedArgs);
            ZygoteConnection.applyInvokeWithSystemProperty(parsedArgs);
            
            // 通过Zygote的静态成员函数forkSystemServer创建一个子进程 
            // 该进程就是Android系统的Systen进程
            // 进程用户ID和用户组ID都被设置为1000
            // 并且还具有用户组1001~1010,1018,1021,1032,3001~3003,3006,3007,3009,3010的权限
            pid = Zygote.forkSystemServer( //forkSystemServer最终通过函数fork在当前进程创建一个子进程
                    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) {
         // 当Zygote.forkSystemServer返回0代表目前是在创建的子进程中
            if (hasSecondZygote(abiList)) {
                if(isBox){
                    waitForSecondaryZygote(socketName);
                }
                Log.d(TAG,"--------call waitForSecondaryZygote,skip this---,abiList= "+abiList);
            }
            // 启动System进程
            handleSystemServerProcess(parsedArgs);
        }

        return true;
    }
    
    
    /**
     * fork成功后进行启动System进程和服务的剩余工作
     */
    private static void handleSystemServerProcess(
            ZygoteConnection.Arguments parsedArgs)
            throws ZygoteInit.MethodAndArgsCaller {
        //由之前分析可得,Zygote进程启动时会创建一个Server的socket,
        //用来监听AMS请求创建新的应用程序,System进程是Zygote进程fork出来的,
        //所以同样包含了这个socket,但并不需要,所以在此处关闭
        //内部其实就是将sServerSocket close并置null
        closeServerSocket();

        //将umask设置为0077,这样新文件和目录将默认为所有者权限。
        Os.umask(S_IRWXG | S_IRWXO);

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

        final String systemServerClasspath = Os.getenv("SYSTEMSERVERCLASSPATH");
        if (systemServerClasspath != null) {
            //进行dex优化
            performSystemServerDexOpt(systemServerClasspath);
        }
        //启动systemserver时invokeWith为null
        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
            // 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(parsedArgs.remainingArgs, 0, amendedArgs, 2, parsedArgs.remainingArgs.length);
            }

            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);
            }

            /*
             * 将其余参数传递给SystemServer。
             */
            // parsedArgs.remainingArgs 
            // 表示之前System进程启动参数args[]中不能被Arguments解析的参数
            // 这里parsedArgs.remainingArgs = {"com.android.server.SystemServer"}
            RuntimeInit.zygoteInit(parsedArgs.targetSdkVersion, parsedArgs.remainingArgs, cl);
        }
    }

   由上面分析得出startSystemServer设置了一些进程的权限,名称,参数的配置,并从zygote进程中fork出一个子进程(即SystemServer进程),关闭了复制出来的多余的socket,并将剩余参数传递给SystemServer,调用RuntimeInit.zygoteInit来进一步启动System进程

RuntimeInit.zygoteInit

frameworks/base/core/java/com/android/internal/os/RuntimeInit.java

public static final void zygoteInit(int targetSdkVersion, String[] argv, ClassLoader classLoader)
            throws ZygoteInit.MethodAndArgsCaller {
        Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "RuntimeInit");
        //重定向log输出
        redirectLogStreams();
        //设置System进程的时区和键盘布局等一些通用信息
        commonInit();
        //native层的初始化
        nativeZygoteInit();
        //此时argv={"com.android.server.SystemServer"},该方法内会调用SystemServer的main方法,
        applicationInit(targetSdkVersion, argv, classLoader);
    }
    
     /**
     * 重定向System.out和System.err 至Android log
     */
    public static void redirectLogStreams() {
        System.out.close();
        System.setOut(new AndroidPrintStream(Log.INFO, "System.out"));
        System.err.close();
        System.setErr(new AndroidPrintStream(Log.WARN, "System.err"));
    }
    
    //一些通用信息的设置
    private static final void commonInit() {

        /* 设置适用于VM中的所有线程的默认处理程序*/
        Thread.setDefaultUncaughtExceptionHandler(new UncaughtHandler());

        /*
         * 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();
        new AndroidConfig();

        /*
         * 设置HttpURLConnection使用的默认HTTP用户代理。
         */
        String userAgent = getDefaultUserAgent();
        System.setProperty("http.agent", userAgent);

        /*
         * 设置socket的tag,用于网络流量统计
         */
        NetworkManagementSocketTagger.install();

        /*
         * If we're running in an emulator launched with "-trace", put the
         * VM into emulator trace profiling mode so that the user can hit
         * F9/F10 at any time to capture traces.  This has performance
         * consequences, so it's not something you want to do always.
         */
        String trace = SystemProperties.get("ro.kernel.android.tracing");
        if (trace.equals("1")) {
            Slog.i(TAG, "NOTE: emulator trace profiling enabled");
            Debug.enableEmulatorTraceOutput();
        }

        initialized = true;
    }

zygoteInit方法主要进行了System进程的时区和键盘布局等一些通用信息的设置,native层的初始化,之后会调用调用应用程序java层的main方法。下面来细看下这些设置和初始化方法。

nativeZygoteInit()

   nativeZygoteInit()方法最后会调用jni方法,位于frameworks/base/core/jni/AndroidRuntime.cpp方法内,源码如下:

static void com_android_internal_os_RuntimeInit_nativeZygoteInit(JNIEnv* env, jobject clazz)
{
    // 根据 app_process的执行 那部分分析得出,gCurRuntime是一个AppRuntime对象
    // AppRuntime类继承了AndroidRuntime类,Zygote进程创建一个AppRuntime对象时
    // AndroidRuntime的构造函数被调用,gCurRuntime就会被初始化。
    // 由于该进程是Zygote fork出来的,所以也有gCurRuntime。
    // onZygoteInit方法位于frameworks/base/cmds/app_process/app_main.cpp内
    gCurRuntime->onZygoteInit();
}

/*frameworks/base/cmds/app_process/app_main.cpp*/
//注:virtual为c++中的虚函数,指一个类中你希望重载的成员函数,可以理解成Java的抽象(abstract)
  virtual void onZygoteInit()
    {
        sp<ProcessState> proc = ProcessState::self();
        ALOGV("App process: starting thread pool.\n");
        //之后进入ProcessState类中
        proc->startThreadPool();
    }

/*frameworks/native/libs/binder/ProcessState.cpp*/
void ProcessState::startThreadPool()
{
    AutoMutex _l(mLock);
    if (!mThreadPoolStarted) {
        mThreadPoolStarted = true;
        spawnPooledThread(true);
    }
}
void ProcessState::spawnPooledThread(bool isMain)
{
    if (mThreadPoolStarted) {
        String8 name = makeBinderThreadName();
        ALOGV("Spawning new pooled thread, name=%s\n", name.string());
        sp<Thread> t = new PoolThread(isMain);
        t->run(name.string());
    }
}

String8 ProcessState::makeBinderThreadName() {
    int32_t s = android_atomic_add(1, &mThreadPoolSeq);
    pid_t pid = getpid();
    String8 name;
    name.appendFormat("Binder:%d_%X", pid, s);
    return name;
}

   这部分代码与Binder相关,总的来说nativeZygoteInit()会在System进程中启动一个Binder线程池,便与Binder通信系统建立了联系,之后System服务就可以使用Binder通信了。

RuntimeInit.applicationInit

frameworks/base/core/java/com/android/internal/os/RuntimeInit.java

 private static void applicationInit(int targetSdkVersion, String[] argv, ClassLoader classLoader)
            throws ZygoteInit.MethodAndArgsCaller {
        nativeSetExitWithoutCleanup(true);

        VMRuntime.getRuntime().setTargetHeapUtilization(0.75f);
        VMRuntime.getRuntime().setTargetSdkVersion(targetSdkVersion);
        // 这里的Arguments类与上面的类不是同一个,这个Arguments是RuntimeInit中的一个内部类
        final Arguments args;
        try {
             // argv = {"com.android.server.SystemServer"}
            args = new Arguments(argv);
        } catch (IllegalArgumentException ex) {
            Slog.e(TAG, ex.getMessage());
            // let the process exit
            return;
        }
        ....
        // 之后进行SystemServer的启动,将剩余参数传递给SystemServer.main方法
        invokeStaticMain(args.startClass, args.startArgs, classLoader);
    }
    static class Arguments {
        String startClass;

        String[] startArgs;
        
        ....
        Arguments(String args[]) throws IllegalArgumentException {
            parseArgs(args);
        }

        ....
        private void parseArgs(String args[])
                throws IllegalArgumentException {
            int curArg = 0;
            for (; curArg < args.length; curArg++) {
                String arg = args[curArg];

                if (arg.equals("--")) {
                    curArg++;
                    break;
                } else if (!arg.startsWith("--")) {
                    break;
                }
            }

            if (curArg == args.length) {
                throw new IllegalArgumentException("Missing classname argument to RuntimeInit!");
            }

            startClass = args[curArg++];
            startArgs = new String[args.length - curArg];
            System.arraycopy(args, curArg, startArgs, 0, startArgs.length);
        }
    }
    /**
     * 调用className对应类的main方法,调用失败抛出RuntimeException异常
     *
     * @param className 完整路径的类名
     * @param argv 传递给main()方法的参数
     * @param classLoader 类加载器
     */
    private static void invokeStaticMain(String className, String[] argv, ClassLoader classLoader)
            throws ZygoteInit.MethodAndArgsCaller {
        Class<?> cl;

        try {
            //将SystemServer类加载到当前进程中
            cl = Class.forName(className, true, classLoader);
        } catch (ClassNotFoundException ex) {
            throw new RuntimeException(
                    "Missing class when invoking static main " + className,
                    ex);
        }

        Method m;
        try {
            //获得它的静态成员函数main,保存在Method对象m中
            m = cl.getMethod("main", new Class[] { String[].class });
        } catch (NoSuchMethodException ex) {
            throw new RuntimeException(
                    "Missing static main on " + className, ex);
        } catch (SecurityException ex) {
            throw new RuntimeException(
                    "Problem getting static main on " + className, ex);
        }

        int modifiers = m.getModifiers();
        if (! (Modifier.isStatic(modifiers) && Modifier.isPublic(modifiers))) {
            throw new RuntimeException(
                    "Main method is not public and static on " + className);
        }

        /**
        * 将Method对象m封装在一个MethodAndArgsCaller对象中,
        * 并将这个对象MethodAndArgsCaller对象作为一个异常对象抛出给应用程序处理
        */
        throw new ZygoteInit.MethodAndArgsCaller(m, argv);
    }

   由于新创建的System进程复制了Zygote进程的地址空间,因此,新创建的进程的调用堆栈与Zygote进程的一致,因此当RuntimeInit.invokeStaticMain抛出一个MethodAndArgsCaller的异常时,系统就会沿着这个调用过程往后寻找一个代码块捕获并处理。这部分的代码就在ZygoteInit.main函数内,我们往下看源码:

public static void main(String argv[]) {
        ....
        try {
            ....
        } catch (MethodAndArgsCaller caller) {
            //重点部分
            caller.run();
        } catch (Throwable ex) {
            ....
        }
    }

   可以看到ZygoteInit.main中通过try-catch捕获了MethodAndArgsCaller这一异常,并调用了MethodAndArgsCaller对象的run方法;我们接下来就看一下这个run方法;
   ZygoteInit.MethodAndArgsCaller:位于frameworks/base/core/java/com/android/internal/os/ZygoteInit.java文件内

public static class MethodAndArgsCaller extends Exception
            implements Runnable {
        /** 要调用的方法 */
        private final Method mMethod;

        /** 参数数组 */
        private final String[] mArgs;

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

        public void run() {
            try {
                mMethod.invoke(null, new Object[] { mArgs });
            } catch (IllegalAccessException ex) {
                throw new RuntimeException(ex);
            } catch (InvocationTargetException ex) {
                Throwable cause = ex.getCause();
                if (cause instanceof RuntimeException) {
                    throw (RuntimeException) cause;
                } else if (cause instanceof Error) {
                    throw (Error) cause;
                }
                throw new RuntimeException(ex);
            }
        }
    }

   MethodAndArgsCaller类有两个成员变量,mMethod指向了SystemServer类的静态成员函数mainmArgs指向了传入的参数;最后run通过反射调用SystemServer.main

   这里绕了一大圈,为何要RuntimeInit.applicationInit->invokeStaticMain-> throw new ZygoteInit.MethodAndArgsCaller(m, argv);执行这一大步,不直接调用?

   原因是我们每创建一个新的进程,进入到对应的main方法前都有一个内部初始化运行时库,启动Binder线程池等操作,在执行到main时其实已经执行了许多代码了,为了使新创建的进程认为它的入口是main,所以才用了抛出异常的方式回到ZygoteInit.main来间接调用,也是利用了Java的异常处理机制清除之前的调用堆栈。

SystemServer.main

frameworks/base/services/java/com/android/server/SystemServer.java
源码如下:

 //可支持的最早时间,即1970年
private static final long EARLIEST_SUPPORTED_TIME = 86400 * 1000;
public static void main(String[] args) {
        new SystemServer().run();
    }
    
  private void run() {
        try {
            ....
            // 防止设备时间早1970之前导致部分api处理出错,
            if (System.currentTimeMillis() < EARLIEST_SUPPORTED_TIME) {
                Slog.w(TAG, "System clock is before 1970; setting to 1970.");
                //强制设置时间在1970年之后
                SystemClock.setCurrentTimeMillis(EARLIEST_SUPPORTED_TIME);
            }

            ....

            // 进入Android System服务
            Slog.i(TAG, "Entered the Android system server!");
            ....

            // 清除vm内存增长限制,启动过程需要较多的虚拟机内存空间
            VMRuntime.getRuntime().clearGrowthLimit();
            // 系统服务器必须一直运行,因此它需要尽可能有效地使用内存。
            // 设置内存利用率我哦0.8
            VMRuntime.getRuntime().setTargetHeapUtilization(0.8f);

            ....

            // 确保当前系统进程的binder调用,总是以前台优先级运行(foreground priority)
            BinderInternal.disableBackgroundScheduling(true);
            // 增加system_server中绑定线程的数量
            BinderInternal.setMaxThreads(sMaxBinderThreads);
            // Prepare the main looper thread (this thread).
            android.os.Process.setThreadPriority(
                android.os.Process.THREAD_PRIORITY_FOREGROUND);
            android.os.Process.setCanSelfBackground(false);
            // 主线程looper就在当前线程运行
            Looper.prepareMainLooper();

            // 初始化本地服务。
            System.loadLibrary("android_servers");

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

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

            // 创建系统服务管理器
            mSystemServiceManager = new SystemServiceManager(mSystemContext);
            mSystemServiceManager.setRuntimeRestarted(mRuntimeRestart);
            //将mSystemServiceManager添加到本地服务的成员sLocalServiceObjects
            //sLocalServiceObjects是一个ArrayMap对象
            LocalServices.addService(SystemServiceManager.class, mSystemServiceManager);
        } finally {
            Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER);
        }
        // 启动各种系统服务
        try {
            startBootstrapServices(); //启动引导服务
            startCoreServices();    //启动核心服务
            startOtherServices();   //启动其他服务
        } catch (Throwable ex) {
            throw ex;
        } finally {
            Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER);
        }

        // debug版本,会将日志输出到dropbox,用于分析
        if (StrictMode.conditionallyEnableDebugLogging()) {
            Slog.i(TAG, "Enabled StrictMode for system server main thread.");
        }

        // 一直循环执行
        Looper.loop();
        throw new RuntimeException("Main thread loop unexpectedly exited");
    }
    
    // 初始化系统上下文
    private void createSystemContext() {
        //创建ActivityThread对象和ContextImpl,创建Application,并调用其onCreate()方法
        ActivityThread activityThread = ActivityThread.systemMain();
        //LoadedApk对象
        mSystemContext = activityThread.getSystemContext();
        //设置主题
        mSystemContext.setTheme(DEFAULT_SYSTEM_THEME);
    }
    /***    
    LoadedApk(ActivityThread activityThread) {
    mActivityThread = activityThread;
    mApplicationInfo = new ApplicationInfo();
    mApplicationInfo.packageName = "android";
    mPackageName = "android";
    mAppDir = null;
    mResDir = null;
    mSplitAppDirs = null;
    mSplitResDirs = null;
    mOverlayDirs = null;
    mSharedLibraries = null;
    mDataDir = null;
    mDataDirFile = null;
    mDeviceProtectedDataDirFile = null;
    mCredentialProtectedDataDirFile = null;
    mLibDir = null;
    mBaseClassLoader = null;
    mSecurityViolation = false;
    mIncludeCode = true;
    mRegisterPackage = false;
    mClassLoader = ClassLoader.getSystemClassLoader();
    mResources = Resources.getSystem();
    }   
    ***/
    /* frameworks/base/core/java/android/app/ActivityThread.java */
    //ActivityThread.systemMain();
    public static ActivityThread systemMain() {
        // 判断应用内存,对于低内存设备,禁止应用加速
        if (!ActivityManager.isHighEndGfx()) {
            ThreadedRenderer.disable(true);
        } else {
            ThreadedRenderer.enableForegroundTrimming();
        }
        //创建ActivityThread
        ActivityThread thread = new ActivityThread();
        //创建Application以及调用其onCreate()方法
        thread.attach(true);
        return thread;
    }
    
    private void attach(boolean system) {
        sCurrentActivityThread = this;
        mSystemThread = system;
        if (!system) {
           ....
        }  else {
            //system=true system进程
            android.ddm.DdmHandleAppName.setAppName("system_process",
                    UserHandle.myUserId());
            try {
                mInstrumentation = new Instrumentation();
                //创建应用上下文,这里也会调用一次getSystemContext()
                //该方法内会创建LoadedApk
                ContextImpl context = ContextImpl.createAppContext(
                        this, getSystemContext().mPackageInfo);
                //创建Application
                mInitialApplication = context.mPackageInfo.makeApplication(true, null);
                //调用Application.onCreate方法
                mInitialApplication.onCreate();
            } catch (Exception e) {
                throw new RuntimeException(
                        "Unable to instantiate Application():" + e.toString(), e);
            }
        }

        //设置一些视图回调方法
        ViewRootImpl.addConfigCallback(new ComponentCallbacks2() {
           .....
        });
    }
    
  //ActivityThread.getSystemContext
  public ContextImpl getSystemContext() {
        synchronized (this) {
            if (mSystemContext == null) {
                mSystemContext = ContextImpl.createSystemContext(this);
            }
            return mSystemContext;
        }
    }
    /* frameworks/base/core/java/android/app/ContextImpl.java*/
    //ContextImpl.createSystemContext(this);
    static ContextImpl createSystemContext(ActivityThread mainThread) {
        //创建LoadedApk对象
        LoadedApk packageInfo = new LoadedApk(mainThread);
        //创建ContextImpl对象
        ContextImpl context = new ContextImpl(null, mainThread,
                packageInfo, null, null, 0, null, null, Display.INVALID_DISPLAY);
        context.mResources.updateConfiguration(context.mResourcesManager.getConfiguration(),
                context.mResourcesManager.getDisplayMetrics());
        return context;
    }
    
    /* frameworks/base/core/java/android/app/LoadedApk.java */
    //LoadedApk.createAppContext();
     public Application makeApplication(boolean forceDefaultAppClass,
            Instrumentation instrumentation) {
        if (mApplication != null) {
            return mApplication;
        }

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

        Application app = null;

        String appClass = mApplicationInfo.className;
        if (forceDefaultAppClass || (appClass == null)) {
            appClass = "android.app.Application";
        }

        try {
            java.lang.ClassLoader cl = getClassLoader();
            if (!mPackageName.equals("android")) {
                Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER,
                        "initializeJavaContextClassLoader");
                initializeJavaContextClassLoader();
                Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
            }
            ContextImpl appContext = ContextImpl.createAppContext(mActivityThread, this);
            // 创建Application
            app = mActivityThread.mInstrumentation.newApplication(
                    cl, appClass, appContext);
            appContext.setOuterContext(app);
        } catch (Exception e) {
           ....
        }
        //将创建的app添加到应用列表。
        mActivityThread.mAllApplications.add(app);
        mApplication = app;
        ....
        return app;
    }

   这部分是SystemServer的一些基础准备,之后会进行一系列系统服务的启动。

系统服务的启动

分为三部分

startBootstrapServices():引导服务

private void startBootstrapServices() {
        // 等待Install完成启动,它会创建具有合适权限的关键目录,如/data/user
        // 需要在初始化其他服务前完成
        Installer installer = mSystemServiceManager.startService(Installer.class);

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

        // 启动PowerManagerService
        mPowerManagerService = mSystemServiceManager.startService(PowerManagerService.class);

        // PowerManagerService已经启动,通过ActivityManagerService初始化PowerManagement
        mActivityManagerService.initPowerManagement();

        // 管理led和显示背光,需要它来控制显示。
        mSystemServiceManager.startService(LightsService.class);

        // 启动isplayManagerService
        mDisplayManagerService = mSystemServiceManager.startService(DisplayManagerService.class);

        // 设置默认显示,在初始化PackageManagerService之前
        mSystemServiceManager.startBootPhase(SystemService.PHASE_WAIT_FOR_DEFAULT_DISPLAY);

        // 当设备进行加密时,只运行核心应用
        String cryptState = SystemProperties.get("vold.decrypt");
        if (ENCRYPTING_STATE.equals(cryptState)) {
            Slog.w(TAG, "Detected encryption in progress - only parsing core apps");
            mOnlyCore = true;
        } else if (ENCRYPTED_STATE.equals(cryptState)) {
            Slog.w(TAG, "Device encrypted - only parsing core apps");
            mOnlyCore = true;
        }
        //启动PackageManagerService
        mPackageManagerService = PackageManagerService.main(mSystemContext, installer,
                mFactoryTestMode != FactoryTest.FACTORY_TEST_OFF, mOnlyCore);
        mFirstBoot = mPackageManagerService.isFirstBoot();
        mPackageManager = mSystemContext.getPackageManager();

        //管理A/B OTA dexting? 不太理解 这里还得再研究下
        if (!mOnlyCore) {
            boolean disableOtaDexopt = SystemProperties.getBoolean("config.disable_otadexopt",
                    false);
            if (!disableOtaDexopt) {
                traceBeginAndSlog("StartOtaDexOptService");
                try {
                    OtaDexoptService.main(mSystemContext, mPackageManagerService);
                } catch (Throwable e) {
                    reportWtf("starting OtaDexOptService", e);
                } finally {
                    Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER);
                }
            }
        }

        //启动UserManagerService
        mSystemServiceManager.startService(UserManagerService.LifeCycle.class);

        //初始化用于从包中缓存资源的属性缓存。不太理解?求大神解答
        AttributeCache.init(mSystemContext);

        // 为系统进程设置Application实例并启动。
        mActivityManagerService.setSystemProcess();

        //启动传感器服务
        startSensorService();
    }
    //传感器服务时一个jni方法,这部分放到之后再分析,先放一放
    private static native void startSensorService();

   总的来说,引导服务包括:ActivityManagerService,PowerManagerService,LightsService,DisplayManagerService,PackageManagerService,UserManagerService,传感器服务。

startCoreServices():核心服务

/**
 * Starts some essential services that are not tangled up in the bootstrap process.
 */
 private void startCoreServices() {
    // Tracks the battery level.  Requires LightService.
    mSystemServiceManager.startService(BatteryService.class);

    // Tracks application usage stats.
    mSystemServiceManager.startService(UsageStatsService.class);
    mActivityManagerService.setUsageStatsManager(
            LocalServices.getService(UsageStatsManagerInternal.class));

    // Tracks whether the updatable WebView is in a ready state and watches for update installs.
    mWebViewUpdateService = mSystemServiceManager.startService(WebViewUpdateService.class);
 }

startOtherServices():其他服务

   startOtherServices()这部分源码超多,估计得有个1000来行吧,为了让展示更容易看,去掉了一些简单的启动服务代码,去掉了其中的try-catch结构,内部的try-catch大部分都是抛出之后打印信息。

private void startOtherServices() {
        final Context context = mSystemContext;
        //声明各种服务,但没有实例化
        VibratorService vibrator = null;
        IMountService mountService = null;
        ....
        Usb usbOtg = null;
        //读取配置信息
        boolean disableStorage = SystemProperties.getBoolean("config.disable_storage", false);
        boolean disableBluetooth = SystemProperties.getBoolean("config.disable_bluetooth", false);
        ....
        //该值代表是否处于模拟器中
        boolean isEmulator = SystemProperties.get("ro.kernel.qemu").equals("1");

        SystemConfig.getInstance();

        //启动StartSchedulingPolicyService、TelecomLoaderService、TelephonyRegistry、TelephonyRegistry,启动代码省略
        ....     

        mEntropyMixer = new EntropyMixer(context);
        mContentResolver = context.getContentResolver();

        if (!disableCameraService) {
            //启动CameraService
            mSystemServiceManager.startService(CameraService.class);
        }

        //AccountManagerService再启动ContentService,启动代码省略
        ....        
        //InstallSystemProviders
        mActivityManagerService.installSystemProviders();
        //启动VibratorService
        vibrator = new VibratorService(context);
        ServiceManager.addService("vibrator", vibrator);

        if (!disableConsumerIr) {
            //启动ConsumerIrService
            consumerIr = new ConsumerIrService(context);
            ServiceManager.addService(Context.CONSUMER_IR_SERVICE, consumerIr);
        }
        //启动AlarmManagerService
        mSystemServiceManager.startService(AlarmManagerService.class);

        //初始化看门狗
        final Watchdog watchdog = Watchdog.getInstance();
        watchdog.init(context, mActivityManagerService);

        //启动InputManagerService
        inputManager = new InputManagerService(context);

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

        if (!disableVrManager) {
            //启动VrManagerService
            mSystemServiceManager.startService(VrManagerService.class);
        }
        mActivityManagerService.setWindowManager(wm);

        inputManager.setWindowManagerCallbacks(wm.getInputMonitor());
        inputManager.start();

        mDisplayManagerService.windowManagerAndInputReady();

        if (isEmulator) {
            //模拟器情况跳过蓝牙服务
        } else if (mFactoryTestMode == FactoryTest.FACTORY_TEST_LOW_LEVEL) {
            Slog.i(TAG, "没有蓝牙服务(出厂测试)");
        } else if (!context.getPackageManager().hasSystemFeature
                   (PackageManager.FEATURE_BLUETOOTH)) {
            Slog.i(TAG, "没有蓝牙服务(蓝牙硬件不存在)");
        } else if (disableBluetooth) {
            Slog.i(TAG, "蓝牙服务被配置禁用");
        } else {
            //启动BluetoothService
            mSystemServiceManager.startService(BluetoothService.class);
        }
        
        //启动MetricsLoggerService,IpConnectivityMetrics,PinnerService
        ....


        // UI显示所需的服务。
        if (mFactoryTestMode != FactoryTest.FACTORY_TEST_LOW_LEVEL) {
            //在FACTORY_TEST_LOW_LEVEL模式下,有些服务不需要启动,此处是非FACTORY_TEST_LOW_LEVEL情况下
            //启动InputMethodManagerService
            mSystemServiceManager.startService(InputMethodManagerService.Lifecycle.class);
            //启动AccessibilityManagerService
            ServiceManager.addService(Context.ACCESSIBILITY_SERVICE,
                        new AccessibilityManagerService(context));
        }
        //进行一些尺寸初始化
        wm.displayReady();

        if (mFactoryTestMode != FactoryTest.FACTORY_TEST_LOW_LEVEL) {
            if (!disableStorage &&
                !"0".equals(SystemProperties.get("system_init.startmountservice"))) {
                //NotificationManagerService依赖于MountService(用于媒体/ usb通知),所以我们必须首先启动MountService。
                mSystemServiceManager.startService(MOUNT_SERVICE_CLASS);
                mountService = IMountService.Stub.asInterface(
                            ServiceManager.getService("mount"));
            }
        }

        //启动UiModeManagerService
        mSystemServiceManager.startService(UiModeManagerService.class);
        //mOnlyCore 用于判断是否只扫描系统的目录
        if (!mOnlyCore) {
            //检查system app是否需要更新,需要则更新
            mPackageManagerService.updatePackagesIfNeeded();
        }

        //检查system app是否需要fs裁剪
        mPackageManagerService.performFstrimIfNeeded();

        if (mFactoryTestMode != FactoryTest.FACTORY_TEST_LOW_LEVEL) {
            if (!disableNonCoreServices) {
                //启动LockSettingsService
                mSystemServiceManager.startService(LOCK_SETTINGS_SERVICE_CLASS);
                lockSettings = ILockSettings.Stub.asInterface(
                            ServiceManager.getService("lock_settings"));

                if (!SystemProperties.get(PERSISTENT_DATA_BLOCK_PROP).equals("")) {
                    //启动PersistentDataBlockService
                    mSystemServiceManager.startService(PersistentDataBlockService.class);
                }

                //启动DeviceIdleController
                mSystemServiceManager.startService(DeviceIdleController.class);

                //启动evicePolicyManagerService
                mSystemServiceManager.startService(DevicePolicyManagerService.Lifecycle.class);
            }
            //disableSystemUI表示是否禁用系统界面
            if (!disableSystemUI) {
                //启动StatusBarManagerService
                statusBar = new StatusBarManagerService(context, wm);
                ServiceManager.addService(Context.STATUS_BAR_SERVICE, statusBar);
            }
            //disableNonCoreServices代表是否关闭非核心服务
            if (!disableNonCoreServices) {
                //启动ClipboardService
                ServiceManager.addService(Context.CLIPBOARD_SERVICE,
                        new ClipboardService(context));
            }
            //disableNetwork代表是否禁用网络
            if (!disableNetwork) {
                //启动NetworkManagementService
                networkManagement = NetworkManagementService.create(context);
                ServiceManager.addService(Context.NETWORKMANAGEMENT_SERVICE, networkManagement);
            }
            //disableTextServices表示是否禁用文字服务
            if (!disableNonCoreServices && !disableTextServices) {
                //启动TextServicesManagerService
                mSystemServiceManager.startService(TextServicesManagerService.Lifecycle.class);
            }

            if (!disableNetwork) {
                //启动NetworkScoreService
                networkScore = new NetworkScoreService(context);
                ServiceManager.addService(Context.NETWORK_SCORE_SERVICE, networkScore);

                //启动NetworkStatsService
                networkStats = NetworkStatsService.create(context, networkManagement);
                ServiceManager.addService(Context.NETWORK_STATS_SERVICE, networkStats);

                //启动NetworkPolicyManagerService
                networkPolicy = new NetworkPolicyManagerService(context,
                        mActivityManagerService, networkStats, networkManagement);
                ServiceManager.addService(Context.NETWORK_POLICY_SERVICE, networkPolicy);

                if (context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_WIFI_NAN)) {
                    /启动WifiNanServic
                    mSystemServiceManager.startService(WIFI_NAN_SERVICE_CLASS);
                } else {
                    Slog.i(TAG, "无Wi-Fi NAN服务(不支持NAN)");
                }
                //启动WifiP2pService、WifiService和WifiScanningService
                mSystemServiceManager.startService(WIFI_P2P_SERVICE_CLASS);
                mSystemServiceManager.startService(WIFI_SERVICE_CLASS);
                mSystemServiceManager.startService(
                 "com.android.server.wifi.scanner.WifiScanningService");

                if (!disableRtt) {
                    //启动RttService
                    mSystemServiceManager.startService("com.android.server.wifi.RttService");
                }
                //查看是否包含以太网或者USB HOST模式
                if (mPackageManager.hasSystemFeature(PackageManager.FEATURE_ETHERNET) ||
                    mPackageManager.hasSystemFeature(PackageManager.FEATURE_USB_HOST)) {
                    //启动EthernetService
                    mSystemServiceManager.startService(ETHERNET_SERVICE_CLASS);
                    if (mPackageManager.hasSystemFeature(PackageManager.FEATURE_PPPOE)) {
                        //启动PppoeService mSystemServiceManager.startService(PPPOE_SERVICE_CLASS);
                    }
                }

                //启动ConnectivityService
                connectivity = new ConnectivityService(
                        context, networkManagement, networkStats, networkPolicy);
                ServiceManager.addService(Context.CONNECTIVITY_SERVICE, connectivity);
                networkStats.bindConnectivityManager(connectivity);
                networkPolicy.bindConnectivityManager(connectivity);

                //启动NsdService
                serviceDiscovery = NsdService.create(context);
                ServiceManager.addService(
                            Context.NSD_SERVICE, serviceDiscovery);
            }

            if (!disableNonCoreServices) {
                //启动UpdateLockService
                ServiceManager.addService(Context.UPDATE_LOCK_SERVICE,
                            new UpdateLockService(context));
            }

            if (!disableNonCoreServices) {
                //启动RecoverySystemService
                mSystemServiceManager.startService(RecoverySystemService.class);
            }

            ....
            //启动NotificationManagerService
            mSystemServiceManager.startService(NotificationManagerService.class);
            notification = INotificationManager.Stub.asInterface(
                    ServiceManager.getService(Context.NOTIFICATION_SERVICE));
            networkPolicy.bindNotificationManager(notification);
            
            //启动DeviceStorageMonitorService
            mSystemServiceManager.startService(DeviceStorageMonitorService.class);   if (!disableLocation) {
                //启动LocationManagerService
                location = new LocationManagerService(context);
                ServiceManager.addService(Context.LOCATION_SERVICE, location);

                //启动CountryDetectorService
                countryDetector = new CountryDetectorService(context);
                ServiceManager.addService(Context.COUNTRY_DETECTOR, countryDetector);
            }

            if (!disableNonCoreServices && !disableSearchManager) {
                //启动SearchManagerService
                mSystemServiceManager.startService(SEARCH_MANAGER_SERVICE_CLASS);
            }
            //启动DropBoxManagerService
            mSystemServiceManager.startService(DropBoxManagerService.class);

            if (!disableNonCoreServices && context.getResources().getBoolean(
                        R.bool.config_enableWallpaperService)) {
                //启动WallpaperManagerService
                mSystemServiceManager.startService(WALLPAPER_SERVICE_CLASS);
            }
            //启动AudioService
            mSystemServiceManager.startService(AudioService.Lifecycle.class);

            if (!disableNonCoreServices && !isBox ) {
                //启动DockObserver
                mSystemServiceManager.startService(DockObserver.class);

                if (context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_WATCH)) {
                    mSystemServiceManager.startService(THERMAL_OBSERVER_CLASS);
                }
            }

            //启动WiredAccessoryManager
            // 监听有线耳机的变化
            inputManager.setWiredAccessoryCallbacks(
                    new WiredAccessoryManager(context, inputManager));

            if (!disableNonCoreServices) {
                if (mPackageManager.hasSystemFeature(PackageManager.FEATURE_MIDI)) {
                    // 启动 MIDI Manager service
                    mSystemServiceManager.startService(MIDI_SERVICE_CLASS);
                }

                if (mPackageManager.hasSystemFeature(PackageManager.FEATURE_USB_HOST)
                        || mPackageManager.hasSystemFeature(
                                PackageManager.FEATURE_USB_ACCESSORY)) {
                    // 管理USB主机和设备支持,启动UsbService
                    mSystemServiceManager.startService(USB_SERVICE_CLASS);
                }

                if (!disableSerial) {
                    //启动SerialService,支持串行端口
                    serial = new SerialService(context);
                    ServiceManager.addService(Context.SERIAL_SERVICE, serial);
                }

                //启动HardwarePropertiesManagerService
                hardwarePropertiesService = new HardwarePropertiesManagerService(context);
                ServiceManager.addService(Context.HARDWARE_PROPERTIES_SERVICE,hardwarePropertiesService);
            }
            //启动TwilightService
            mSystemServiceManager.startService(TwilightService.class);

            if (NightDisplayController.isAvailable(context)) {
                //启动NightDisplayService
                mSystemServiceManager.startService(NightDisplayService.class);
            }
            //启动JobSchedulerService
            mSystemServiceManager.startService(JobSchedulerService.class);
            //启动SoundTriggerService
            mSystemServiceManager.startService(SoundTriggerService.class);
              if (!disableNonCoreServices) {
                if (mPackageManager.hasSystemFeature(PackageManager.FEATURE_BACKUP)) {
                    //启动BackupManagerService
                    mSystemServiceManager.startService(BACKUP_MANAGER_SERVICE_CLASS);
                }

                if (mPackageManager.hasSystemFeature(PackageManager.FEATURE_APP_WIDGETS)
                    || context.getResources().getBoolean(R.bool.config_enableAppWidgetService)) {
                    //启动AppWidgetService
                    mSystemServiceManager.startService(APPWIDGET_SERVICE_CLASS);
                }

                if (mPackageManager.hasSystemFeature(PackageManager.FEATURE_VOICE_RECOGNIZERS)) {
                    //启动VoiceInteractionManagerService
                    mSystemServiceManager.startService(VOICE_RECOGNITION_MANAGER_SERVICE_CLASS);
                }

                if (GestureLauncherService.isGestureLauncherEnabled(context.getResources())) {
                    Slog.i(TAG, "手势启动服务");
                    //启动GestureLauncherService
                    mSystemServiceManager.startService(GestureLauncherService.class);
                }
                usbOtg = new Usb(context);
                ServiceManager.addService("usb_otg", usbOtg);
                usbOtg.start();
                //启动SensorNotificationService和ContextHubSystemService
                mSystemServiceManager.startService(SensorNotificationService.class);
                mSystemServiceManager.startService(ContextHubSystemService.class);
            }
        
            //启动DiskStatsService
            ServiceManager.addService("diskstats", new DiskStatsService(context));
           if (!disableSamplingProfiler) {
                //启动SamplingProfilerService
                ServiceManager.addService("samplingprofiler",
                                new SamplingProfilerService(context));
            }

            if (!disableNetwork && !disableNetworkTime) {
                //启动NetworkTimeUpdateService
                networkTimeUpdater = new NetworkTimeUpdateService(context);
                ServiceManager.addService("network_time_update_service", networkTimeUpdater);
            }
            //启动CommonTimeManagementService
            commonTimeMgmtService = new CommonTimeManagementService(context);
            ServiceManager.addService("commontime_management", commonTimeMgmtService);
            
            if (!disableNetwork) {
                CertBlacklister blacklister = new CertBlacklister(context);
            }

            if (!disableNetwork && !disableNonCoreServices && EmergencyAffordanceManager.ENABLED) {
                //启动EmergencyAffordanceService
                mSystemServiceManager.startService(EmergencyAffordanceService.class);
            }

            if (!disableNonCoreServices) {
                //启动DreamManagerService
                mSystemServiceManager.startService(DreamManagerService.class);
            }
            if (!disableNonCoreServices && ZygoteInit.PRELOAD_RESOURCES) {
                //启动AssetAtlasService
                atlas = new AssetAtlasService(context);
                ServiceManager.addService(AssetAtlasService.ASSET_ATLAS_SERVICE, atlas);
            }

            if (!disableNonCoreServices) {
                //启动GraphicsStatsService
                ServiceManager.addService(GraphicsStatsService.GRAPHICS_STATS_SERVICE,
                        new GraphicsStatsService(context));
            }

            if (mPackageManager.hasSystemFeature(PackageManager.FEATURE_PRINTING)) {
                    //启动PrintManagerService
                    mSystemServiceManager.startService(PRINT_MANAGER_SERVICE_CLASS);
            }
            //启动RestrictionsManagerService
            mSystemServiceManager.startService(RestrictionsManagerService.class);
            //启动MediaSessionService
            mSystemServiceManager.startService(MediaSessionService.class);

            if (mPackageManager.hasSystemFeature(PackageManager.FEATURE_HDMI_CEC)) {
                //启动HdmiControlService
                mSystemServiceManager.startService(HdmiControlService.class);
            }

            if (mPackageManager.hasSystemFeature(PackageManager.FEATURE_LIVE_TV)) {
                //启动TvInputManagerService
                mSystemServiceManager.startService(TvInputManagerService.class);
            }

            if (mPackageManager.hasSystemFeature(PackageManager.FEATURE_PICTURE_IN_PICTURE)) {
                //启动MediaResourceMonitorService
                mSystemServiceManager.startService(MediaResourceMonitorService.class);
            }

            if (mPackageManager.hasSystemFeature(PackageManager.FEATURE_LEANBACK)) {
                //启动TvRemoteService
                mSystemServiceManager.startService(TvRemoteService.class);
            }
            if (!disableNonCoreServices) {
                //启动MediaRouterService
                mediaRouter = new MediaRouterService(context);
                ServiceManager.addService(Context.MEDIA_ROUTER_SERVICE, mediaRouter);

                if (!disableTrustManager) {
                    //启动TrustManagerService
                    mSystemServiceManager.startService(TrustManagerService.class);
                }

                if (mPackageManager.hasSystemFeature(PackageManager.FEATURE_FINGERPRINT)) {
                    //启动FingerprintService
                    mSystemServiceManager.startService(FingerprintService.class);
                }
                //启动BackgroundDexOptService
                BackgroundDexOptService.schedule(context);
            }
            // 启动LauncherAppsService和ShortcutService,LauncherAppsService会使用到ShortcutService
            mSystemServiceManager.startService(ShortcutService.Lifecycle.class);
            mSystemServiceManager.startService(LauncherAppsService.class);
        }
      if (!disableNonCoreServices && !disableMediaProjection) {
            //启动MediaProjectionManagerService
            mSystemServiceManager.startService(MediaProjectionManagerService.class);
        }

        if (context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_WATCH)) {
            //启动WearBluetoothServicea、WearWifiMediatorService
            mSystemServiceManager.startService(WEAR_BLUETOOTH_SERVICE_CLASS);
            mSystemServiceManager.startService(WEAR_WIFI_MEDIATOR_SERVICE_CLASS);
            if (SystemProperties.getBoolean("config.enable_cellmediator", false)) {
                //启动WearCellularMediatorService
                mSystemServiceManager.startService(WEAR_CELLULAR_MEDIATOR_SERVICE_CLASS);
            }
          if (!disableNonCoreServices) {
              //启动WearTimeService
              mSystemServiceManager.startService(WEAR_TIME_SERVICE_CLASS);
          }
        }

        // 为system_server进程启用JIT
        VMRuntime.getRuntime().startJitCompilation();

        // 启动MmsServiceBroker
        mmsService = mSystemServiceManager.startService(MmsServiceBroker.class);

        if (Settings.Global.getInt(mContentResolver, Settings.Global.DEVICE_PROVISIONED, 0) == 0 ||
                UserManager.isDeviceInDemoMode(mSystemContext)) {
            mSystemServiceManager.startService(RetailDemoModeService.class);
        }

        // 现在开始启动应用程序进程

        //震动服务准备完成
        vibrator.systemReady();
        //锁设置服务准备完成
        if (lockSettings != null) {
            lockSettings.systemReady();
        }
        // DevicePolicyManager需要初始化
        mSystemServiceManager.startBootPhase(SystemService.PHASE_LOCK_SETTINGS_READY);
        mSystemServiceManager.startBootPhase(SystemService.PHASE_SYSTEM_SERVICES_READY);
        //WindowManagerService准备完成
        wm.systemReady();
        if (safeMode) {
            mActivityManagerService.showSafeModeOverlay();
        }
        //我们在WindowManagerService准备完成前就已经使用到了config,这里手动更新此上下文配置
        Configuration config = wm.computeNewConfiguration();
        DisplayMetrics metrics = new DisplayMetrics();
        WindowManager w = (WindowManager)context.getSystemService(Context.WINDOW_SERVICE);
        w.getDefaultDisplay().getMetrics(metrics);
        context.getResources().updateConfiguration(config, metrics);

        // 系统上下文的主题可能与配置有关。
        final Theme systemTheme = context.getTheme();
        if (systemTheme.getChangingConfigurations() != 0) {
            systemTheme.rebase();
        }
        //PowerManagerService准备好了
        mPowerManagerService.systemReady(mActivityManagerService.getAppOpsService());
        //PackageManagerService准备好了
        mPackageManagerService.systemReady();
        //DisplayManagerService准备好了
        mDisplayManagerService.systemReady(safeMode, mOnlyCore);

        ....

        mActivityManagerService.systemReady(new Runnable() {
            @Override
            public void run() {
                mSystemServiceManager.startBootPhase(
                        SystemService.PHASE_ACTIVITY_MANAGER_READY);

                mActivityManagerService.startObservingNativeCrashes();
                if (!mOnlyCore) {
                    mWebViewUpdateService.prepareWebViewInSystemServer();
                }
                //启动SystemUI
                startSystemUi(context);
                //一系列systemReady方法
                if (networkScoreF != null) networkScoreF.systemReady();
                if (networkManagementF != null) networkManagementF.systemReady();
                if (networkStatsF != null) networkStatsF.systemReady();
                if (networkPolicyF != null) networkPolicyF.systemReady();
                if (connectivityF != null) connectivityF.systemReady();
                Watchdog.getInstance().start();//看门狗开始工作

                // 现在可以让各种系统服务启动它们的第三方代码了…
                mSystemServiceManager.startBootPhase(
                        SystemService.PHASE_THIRD_PARTY_APPS_CAN_START);

                if (locationF != null) locationF.systemRunning();
                if (countryDetectorF != null) countryDetectorF.systemRunning();
                if (networkTimeUpdaterF != null) networkTimeUpdaterF.systemRunning();
                if (commonTimeMgmtServiceF != null) {
                        commonTimeMgmtServiceF.systemRunning();
                    }
                if (atlasF != null) atlasF.systemRunning();
                if (inputManagerF != null) inputManagerF.systemRunning();
                if (telephonyRegistryF != null) telephonyRegistryF.systemRunning();
                if (mediaRouterF != null) mediaRouterF.systemRunning();

                if (mmsServiceF != null) mmsServiceF.systemRunning();
                if (networkScoreF != null) networkScoreF.systemRunning();
            }
        });
    }

   这部分启动了大量的服务。之后System进程就启动完成了,并进入Looper.loop()状态,等待消息的到来;

这里画了一个简单的流程图,可以简单看下:


system_process_img.png
上一篇下一篇

猜你喜欢

热点阅读