一、Loader层

1、Boot ROM:
        上电后,BootRom会被激活,引导芯片代码开始从预定义的地方(固化在ROM)开始执行,然后加载引导程序到RAM

2、 Boot Loader引导程序

        Android是基于Linux系统的,它没有BIOS程序,取而代之的是BootLoader(系统启动引导程序)。引导程序是厂商加锁和限制的地方,它是针对特定的主板与芯片的。厂商要么使用很受欢迎的引导程序比如redbootubootARMboot等或者开发自己的引导程序,它不是Android操作系统的一部分。流程图如下:

android 第一次开机引导 安卓开机引导程序_android 第一次开机引导


 

 二、kernel层——init 进程的启动

        Linux内核启动时,设置缓存、被保护存储器、计划列表、加载驱动,然后启动以下进程:

        1、0号进程:
      swapper进程(pid=0):又称idle进程、空闲进程,由系统自动创建, 运行在内核态。
系统初始化过程Kernel由无到有开创的第一个进程, 也是唯一一个没有通过fork或者kernel_thread产生的进程。

        swapper进程用于初始化进程管理、内存管理,加载Display,Camera Driver,Binder Driver等相关工作。

        2、1号进程——就是init进程
        init进程(pid=1):由0号进程通过kernel_thread创建,在内核空间完成初始化后, 加载init程序, 并最终运行在用户空间,init进程是所有用户进程的鼻祖,他的作用是:

     (1)是挂载tmpfs, devpts, proc, sysfs文件系统

     (2)是运行init.rc脚本,init将会解析init.rc,并且执行init.rc中的命令。

     (3)当一些关键进程死亡时,重启该进程;

     (4)提供Android系统的属性服务

        3、2号进程
        kthreadd进程(pid=2):由0号进程通过kernel_thread创建,是Linux系统的内核进程,会创建内核工作线程kworkder,软中断线程ksoftirqd,thermal等内核守护进程。
kthreadd运行在内核空间, 负责所有内核线程的调度和管理 kthreadd进程是所有内核进程的鼻祖

三、init进程启动细节

        我们先给个大体的流程如下图:

android 第一次开机引导 安卓开机引导程序_java_02

        init进程启动执行了两个重要操作:

        1.启动了Zygote(包括32位、64位Zygote进程),Zygote 又fork了systemService

        2.启动serviceManager

        我们来看看具体代码实现

        内核启动后加载system/core/init/init.rc文件,启动init进程。我们看一下init.rc文件

start servicemanager // 2.servicemanager启动
start hwservicemanager
start vndservicemanager

import /system/etc/init/hw/init.${ro.zygote}.rc
trigger zygote-start //启动zygote的代码实现在服务声明
on zygote-start && property:ro.crypto.state=unencrypted

    wait_for_prop odsign.verification.done 1
    # A/B update verifier that marks a successful boot.
    exec_start update_verifier_nonencrypted
    start statsd
    start netd
    start zygote    //1.启动32位Zygote兼容32位程序
    start zygote_secondary  //2.启动64位Zygote兼容64位程序

接下来我们通过这两个过程详细分析一下

  四、Zygote启动与fork systemserver

    1、Zygote启动(通过runtime.start 调用ZygoteInit的main函数)

       

        我们来看一下 zygote 的服务声明文件 init.zygote64.rc

service zygote /system/bin/app_process64 -Xzygote /system/bin --zygote --start-system-server
    class main
    socket zygote stream 660 root system

从服务声明可见启动start zygote 就是执行app_process64程序,app_process的源码在frameworks/base/cmds/app_process/app_main.cpp

int main(int argc, const char* const argv[])
 {
    //...省略
     AppRuntime runtime;
     while (i < argc) {
         if (!parentDir) {
         } else if (strcmp(arg, "--zygote") == 0) {
             zygote = true;//zygote进程
             niceName = "zygote";
         } else if (strcmp(arg, "--start-system-server") == 0) {
             startSystemServer = true;//启动系统服务
         } 
     }
     if (niceName && *niceName) {
         setArgv0(argv0, niceName);
         set_process_name(niceName);
     }
     runtime.mParentDir = parentDir;
     if (zygote) {       //参数  0、类名 1、
         runtime.start("com.android.internal.os.ZygoteInit",
                 startSystemServer ? "start-system-server" : "");//在这里通过runtime启动ZygoteInit从此由内核C层进入了我们的应用层。
     } else if (className) {
         runtime.start("com.android.internal.os.RuntimeInit",
                 application ? "application" : "tool");
     } else {
        
     }
 }


   

runtime.start的源代码在jni/AndroidRuntime.cpp 如下

runtime.start("com.android.internal.os.ZygoteInit",
                startSystemServer ? "start-system-server" : "") 做了四件事

        (1).检查化文件目录

        (2).初始化Jni调用

        (3).启动Java虚拟机

        (4).调用 ZygoteInit main函数

void AndroidRuntime::start(const char* className, const Vector<String8>& options, bool zygote)
 {
     
     static const String8 startSystemServer("start-system-server");
     
     bool primary_zygote = false;
    //省略。。。

     //一系列目录操作 1.检查化文件目录
     const char* rootDir = getenv("ANDROID_ROOT");
     if (rootDir == NULL) {
         rootDir = "/system";
         if (!hasDir("/system")) {
             LOG_FATAL("No root directory specified, and /system does not exist.");
             return;
         }
         setenv("ANDROID_ROOT", rootDir, 1);
     }
     const char* artRootDir = getenv("ANDROID_ART_ROOT");
     if (artRootDir == NULL) {
         LOG_FATAL("No ART directory specified with ANDROID_ART_ROOT environment variable.");
         return;
     }
     const char* i18nRootDir = getenv("ANDROID_I18N_ROOT");
     if (i18nRootDir == NULL) {
         LOG_FATAL("No runtime directory specified with ANDROID_I18N_ROOT environment variable.");
         return;
     }
     const char* tzdataRootDir = getenv("ANDROID_TZDATA_ROOT");
     if (tzdataRootDir == NULL) {
         LOG_FATAL("No tz data directory specified with ANDROID_TZDATA_ROOT environment variable.");
         return;
     }
     //2.初始化Jni调用
     JniInvocation jni_invocation;
     jni_invocation.Init(NULL);
     JNIEnv* env;
     //3.启动Java虚拟机
     if (startVm(&mJavaVM, &env, zygote, primary_zygote) != 0) {
         return;
     }
     onVmCreated(env);
     
     if (startReg(env) < 0) {
         ALOGE("Unable to register all android natives\n");
         return;
     }
    
   //省略。。。
     jclass startClass = env->FindClass(slashClassName);
     if (startClass == NULL) {
         ALOGE("JavaVM unable to locate class '%s'\n", slashClassName);
         /* keep going */
     } else {
     //查找 com.android.internal.os.ZygoteInit的main函数
         jmethodID startMeth = env->GetStaticMethodID(startClass, "main",
             "([Ljava/lang/String;)V");
         if (startMeth == NULL) {
             ALOGE("JavaVM unable to find main() in '%s'\n", className);
             /* keep going */
         } else {
         //4.调用 ZygoteInit main函数
             env->CallStaticVoidMethod(startClass, startMeth, strArray);
 #if 0
             if (env->ExceptionCheck())
                 threadExitUncaughtException(env);
 #endif
         }
     }
     free(slashClassName);
     ALOGD("Shutting down VM\n");
     if (mJavaVM->DetachCurrentThread() != JNI_OK)
 }

我们重点关注/java/com/android/internal/os/ZygoteInit.java  main函数,main函数做了如下:

(1).准备Fork

(2).调用预加载

(3).初始化zygote

(4).new 了一个 ZygoteServer

(5).forkSystemServer

(6)启动Looper 不停的检查 ZygoteServer 的 Sockect变化

public static void main(String[] argv) {
         ZygoteServer zygoteServer = null;
        //1.添加多次启动zygote检查 ,当前就是Zygote了
         ZygoteHooks.startZygoteNoThreadCreation();
         try {
             Os.setpgid(0, 0);
         } catch (ErrnoException ex) {
             throw new RuntimeException("Failed to setpgid(0,0)", ex);
         }
         Runnable caller;
         try {
             // Store now for StatsLogging later.
             final long startTime = SystemClock.elapsedRealtime();
             final boolean isRuntimeRestarted = "1".equals(
                     SystemProperties.get("sys.boot_completed"));
             String bootTimeTag = Process.is64Bit() ? "Zygote64Timing" : "Zygote32Timing";
             TimingsTraceLog bootTimingsTraceLog = new TimingsTraceLog(bootTimeTag,
                     Trace.TRACE_TAG_DALVIK);
             bootTimingsTraceLog.traceBegin("ZygoteInit");
             //1.准备Fork
             RuntimeInit.preForkInit();
             boolean startSystemServer = false;
             String zygoteSocketName = "zygote";
             String abiList = null;
             boolean enableLazyPreload = false;
             for (int i = 1; i < argv.length; i++) {
                 if ("start-system-server".equals(argv[i])) {
                     startSystemServer = true;
                 } else if ("--enable-lazy-preload".equals(argv[i])) {
                     enableLazyPreload = true;
                 } else if (argv[i].startsWith(ABI_LIST_ARG)) {
                     abiList = argv[i].substring(ABI_LIST_ARG.length());
                 } else if (argv[i].startsWith(SOCKET_NAME_ARG)) {
                     zygoteSocketName = argv[i].substring(SOCKET_NAME_ARG.length());
                 } else {
                     throw new RuntimeException("Unknown command line argument: " + argv[i]);
                 }
             }
             final boolean isPrimaryZygote = zygoteSocketName.equals(Zygote.PRIMARY_SOCKET_NAME);
             if (!isRuntimeRestarted) {
                 if (isPrimaryZygote) {
                     FrameworkStatsLog.write(FrameworkStatsLog.BOOT_TIME_EVENT_ELAPSED_TIME_REPORTED,
                             BOOT_TIME_EVENT_ELAPSED_TIME__EVENT__ZYGOTE_INIT_START,
                             startTime);
                 } else if (zygoteSocketName.equals(Zygote.SECONDARY_SOCKET_NAME)) {
                     FrameworkStatsLog.write(FrameworkStatsLog.BOOT_TIME_EVENT_ELAPSED_TIME_REPORTED,
                             BOOT_TIME_EVENT_ELAPSED_TIME__EVENT__SECONDARY_ZYGOTE_INIT_START,
                             startTime);
                 }
             }
             if (abiList == null) {
                 throw new RuntimeException("No ABI list supplied.");
             }
            
             if (!enableLazyPreload) {
                 bootTimingsTraceLog.traceBegin("ZygotePreload");
                 EventLog.writeEvent(LOG_BOOT_PROGRESS_PRELOAD_START,
                         SystemClock.uptimeMillis());
                 preload(bootTimingsTraceLog);//2.调用预加载
                 EventLog.writeEvent(LOG_BOOT_PROGRESS_PRELOAD_END,
                         SystemClock.uptimeMillis());
                 bootTimingsTraceLog.traceEnd(); // ZygotePreload
             }
             // Do an initial gc to clean up after startup
             bootTimingsTraceLog.traceBegin("PostZygoteInitGC");
             gcAndFinalize();
             bootTimingsTraceLog.traceEnd(); // PostZygoteInitGC
             bootTimingsTraceLog.traceEnd(); // ZygoteInit
             Zygote.initNativeState(isPrimaryZygote);//3.初始化zygote状态
             ZygoteHooks.stopZygoteNoThreadCreation();
             //4.new 了一个 ZygoteServer
             zygoteServer = new ZygoteServer(isPrimaryZygote);
             if (startSystemServer) {//5.forkSystemServer
                 Runnable r = forkSystemServer(abiList, zygoteSocketName, zygoteServer);
                 // {@code r == null} in the parent (zygote) process, and {@code r != null} in the
                 // child (system_server) process.
                 if (r != null) {
                     r.run();
                     return;
                 }
             }
             Log.i(TAG, "Accepting command socket connections");
             // The select loop returns early in the child process after a fork and
             // loops forever in the zygote.
             caller = zygoteServer.runSelectLoop(abiList);//6.启动Looper 不停的检查 ZygoteServer 的 Sockect变化
         } catch (Throwable ex) {
             Log.e(TAG, "System zygote died with fatal exception", ex);
             throw ex;
         } finally {
             if (zygoteServer != null) {
                 zygoteServer.closeServerSocket();
             }
         }
         // We're in the child process and have exited the select loop. Proceed to execute the
         // command.
         if (caller != null) {
             caller.run();
         }
     }
     static void preload(TimingsTraceLog bootTimingsTraceLog) {
         Log.d(TAG, "begin preload");
      
         beginPreload();
        preloadClasses();//预加载类,其中就包括我们熟悉的系统API         cacheNonBootClasspathClassLoaders();加载无法放入Boot classpath的文件
        preloadResources();加载drawables、colors
         nativePreloadAppProcessHALs();加载hal 硬件
         maybePreloadGraphicsDriver();调用OpenGL/Vulkan加载图形驱动程序
         preloadSharedLibraries();//加载共享库
         preloadTextResources();初始化TextView ,对,你没看错
         WebViewFactory.prepareWebViewInZygote();//初始化webview
         endPreload();// 取消软引用保护
         warmUpJcaProviders(); 初始化JCA安全相关的参数,比如AndroidKeyStoreProvider安装
         sPreloadComplete = true;
    }    ZygoteServer 是怎么运作的呢?
java/com/android/internal/os/ZygoteServer.java
class ZygoteServer {
         ZygoteServer(boolean isPrimaryZygote) {
             mUsapPoolEventFD = Zygote.getUsapPoolEventFD();
             //创建Zygote Socket 链接
             if (isPrimaryZygote) {
                 mZygoteSocket = Zygote.createManagedSocketFromInitSocket(Zygote.PRIMARY_SOCKET_NAME);
                 mUsapPoolSocket =
                         Zygote.createManagedSocketFromInitSocket(
                                 Zygote.USAP_POOL_PRIMARY_SOCKET_NAME);
             } else {
                 mZygoteSocket = Zygote.createManagedSocketFromInitSocket(Zygote.SECONDARY_SOCKET_NAME);
                 mUsapPoolSocket =
                         Zygote.createManagedSocketFromInitSocket(
                                 Zygote.USAP_POOL_SECONDARY_SOCKET_NAME);
             }
             mUsapPoolSupported = true;
             fetchUsapPoolPolicyProps();//USAP 预创建进程机制,提前Fork好一定数量进程待用,提高效率
         }
     }
     
     public final class Zygote { //Zygote Socket 链接的最终实现是 LocalServerSocket
         static LocalServerSocket createManagedSocketFromInitSocket(String socketName) {
             int fileDesc;
             final String fullSocketName = ANDROID_SOCKET_PREFIX + socketName;
             try {
                 String env = System.getenv(fullSocketName);
                 fileDesc = Integer.parseInt(env);
             } catch (RuntimeException ex) {
                 throw new RuntimeException("Socket unset or invalid: " + fullSocketName, ex);
             }
             try {
                 FileDescriptor fd = new FileDescriptor();//创建文件描述符,Linux中socket也是文件
                 fd.setInt$(fileDesc);
                 return new LocalServerSocket(fd);//建立 socket
             } catch (IOException ex) {
                 throw new RuntimeException(
                     "Error building socket from file descriptor: " + fileDesc, ex);
             }
         }
     }
     public LocalServerSocket(FileDescriptor fd) throws IOException
     {
         impl = new LocalSocketImpl(fd);//socket实现类
         impl.listen(LISTEN_BACKLOG);//监听socket 消息,比如需要fork新进程
         localAddress = impl.getSockAddress();
     }


 

2、fork SystemServer:

public class ZygoteInit {
 private static Runnable forkSystemServer(String abiList, String socketName,
             ZygoteServer zygoteServer) {
        
         StructCapUserHeader header = new StructCapUserHeader(
                 OsConstants._LINUX_CAPABILITY_VERSION_3, 0);
         StructCapUserData[] data;
         try {
             data = Os.capget(header);
         } catch (ErrnoException ex) {
             throw new RuntimeException("Failed to capget()", ex);
         }
         capabilities &= Integer.toUnsignedLong(data[0].effective) |
                 (Integer.toUnsignedLong(data[1].effective) << 32);
         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,3005,3006,3007,3009,3010,3011,3012",
                 "--capabilities=" + capabilities + "," + capabilities,
                 "--nice-name=system_server",
                 "--runtime-args",
                 "--target-sdk-version=" + VMRuntime.SDK_VERSION_CUR_DEVELOPMENT,
                 "com.android.server.SystemServer",//后续会调用 SystemServer 的main函数
         };
         ZygoteArguments parsedArgs;
         int pid;
         try {//添加命令参数
             ZygoteCommandBuffer commandBuffer = new ZygoteCommandBuffer(args);
             try {
                 parsedArgs = ZygoteArguments.getInstance(commandBuffer);
             } catch (EOFException e) {
                 throw new AssertionError("Unexpected argument error for forking system server", e);
             }
             commandBuffer.close();
             Zygote.applyDebuggerSystemProperty(parsedArgs);
             Zygote.applyInvokeWithSystemProperty(parsedArgs);//获取需要的系统属性参数
             if (Zygote.nativeSupportsMemoryTagging()) {
                 String mode = SystemProperties.get("arm64.memtag.process.system_server", "");
                 if (mode.isEmpty()) {
                   /* The system server has ASYNC MTE by default, in order to allow
                    * system services to specify their own MTE level later, as you
                    * can't re-enable MTE once it's disabled. */
                   mode = SystemProperties.get("persist.arm64.memtag.default", "async");
                 }
                 if (mode.equals("async")) {
                     parsedArgs.mRuntimeFlags |= Zygote.MEMORY_TAG_LEVEL_ASYNC;
                 } else if (mode.equals("sync")) {
                     parsedArgs.mRuntimeFlags |= Zygote.MEMORY_TAG_LEVEL_SYNC;
                 } else if (!mode.equals("off")) {
                     /* When we have an invalid memory tag level, keep the current level. */
                     parsedArgs.mRuntimeFlags |= Zygote.nativeCurrentTaggingLevel();
                     Slog.e(TAG, "Unknown memory tag level for the system server: \"" + mode + "\"");
                 }
             } else if (Zygote.nativeSupportsTaggedPointers()) {
                 /* Enable pointer tagging in the system server. Hardware support for this is present
                  * in all ARMv8 CPUs. */
                 parsedArgs.mRuntimeFlags |= Zygote.MEMORY_TAG_LEVEL_TBI;
             }
             /* Enable gwp-asan on the system server with a small probability. This is the same
              * policy as applied to native processes and system apps. */
             parsedArgs.mRuntimeFlags |= Zygote.GWP_ASAN_LEVEL_LOTTERY;
             if (shouldProfileSystemServer()) {
                 parsedArgs.mRuntimeFlags |= Zygote.PROFILE_SYSTEM_SERVER;
             }
             /* Request to fork the system server process */
             pid = Zygote.forkSystemServer( //调用zygote fork 系统服务
                     parsedArgs.mUid, parsedArgs.mGid,
                     parsedArgs.mGids,
                     parsedArgs.mRuntimeFlags,
                     null,
                     parsedArgs.mPermittedCapabilities,
                     parsedArgs.mEffectiveCapabilities);
         } catch (IllegalArgumentException ex) {
             throw new RuntimeException(ex);
         }
         /* For child process */
         if (pid == 0) {
             if (hasSecondZygote(abiList)) {
                 waitForSecondaryZygote(socketName);
             }
             zygoteServer.closeServerSocket();
             return handleSystemServerProcess(parsedArgs);//
         }
         return null;
     }}
先调用  java/com/android/internal/os/Zygote.java 的 forkSystemServer,我们看一下源码
static int forkSystemServer(int uid, int gid, int[] gids, int runtimeFlags,
             int[][] rlimits, long permittedCapabilities, long effectiveCapabilities) {
         ZygoteHooks.preFork();
         int pid = nativeForkSystemServer(//调用native层fork system Server
                 uid, gid, gids, runtimeFlags, rlimits,
                 permittedCapabilities, effectiveCapabilities);
         // Set the Java Language thread priority to the default value for new apps.
         Thread.currentThread().setPriority(Thread.NORM_PRIORITY);
         ZygoteHooks.postForkCommon();
         return pid;
     }nativeForkSystemServer 在 com_android_internal_os_Zygote.cpp
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 permitted_capabilities,
         jlong effective_capabilities) {
   std::vector<int> fds_to_close(MakeUsapPipeReadFDVector()),
                    fds_to_ignore(fds_to_close);
   fds_to_close.push_back(gUsapPoolSocketFD);
   if (gUsapPoolEventFD != -1) {
     fds_to_close.push_back(gUsapPoolEventFD);
     fds_to_ignore.push_back(gUsapPoolEventFD);
   }
   if (gSystemServerSocketFd != -1) {
       fds_to_close.push_back(gSystemServerSocketFd);
       fds_to_ignore.push_back(gSystemServerSocketFd);
   }
   pid_t pid = zygote::ForkCommon(env, true,//fork 函数
                                  fds_to_close,
                                  fds_to_ignore,
                                  true);
   if (pid == 0) {//0号进程
       //省略...
   } else if (pid > 0) {//非0号进程,也就是init或者其他进程
       ALOGI("System server process %d has been created", pid);
       gSystemServerPid = pid;
       int status;
       if (waitpid(pid, &status, WNOHANG) == pid) {
           ALOGE("System server process %d has died. Restarting Zygote!", pid);
           RuntimeAbort(env, __LINE__, "System server process has died. Restarting Zygote!");
       }
       if (UsePerAppMemcg()) {
           if (!SetTaskProfiles(pid, std::vector<std::string>{"SystemMemoryProcess"})) {
               ALOGE("couldn't add process %d into system memcg group", pid);
           }
       }
   }
   return pid;
 } pid_t zygote::ForkCommon(JNIEnv* env, bool is_system_server,
                          const std::vector<int>& fds_to_close,
                          const std::vector<int>& fds_to_ignore,
                          bool is_priority_fork,
                          bool purge) {
   SetSignalHandlers();
   auto fail_fn = std::bind(zygote::ZygoteFailure, env,
                            is_system_server ? "system_server" : "zygote",
                            nullptr, _1);
   BlockSignal(SIGCHLD, fail_fn);
   __android_log_close();
   AStatsSocket_close();
   if (gOpenFdTable == nullptr) {
     gOpenFdTable = FileDescriptorTable::Create(fds_to_ignore, fail_fn);
   } else {
     gOpenFdTable->Restat(fds_to_ignore, fail_fn);
   }
   pid_t pid = fork();//真实的fork 进程
   if (pid == 0) {
     if (is_priority_fork) {
       setpriority(PRIO_PROCESS, 0, PROCESS_PRIORITY_MAX);
     } else {
       setpriority(PRIO_PROCESS, 0, PROCESS_PRIORITY_MIN);
     }
 #if defined(__BIONIC__) && !defined(NO_RESET_STACK_PROTECTOR)
     android_reset_stack_guards();
 #endif
     PreApplicationInit();  //分配内存
     DetachDescriptors(env, fds_to_close, fail_fn);  
     ClearUsapTable();   
     gOpenFdTable->ReopenOrDetach(fail_fn);   
     android_fdsan_set_error_level(fdsan_error_level);
     gSystemServerSocketFd = -1;
   } else if (pid == -1) {
     ALOGE("Failed to fork child process: %s (%d)", strerror(errno), errno);
   } else {
     ALOGD("Forked child process %d", pid);
   }
   UnblockSignal(SIGCHLD, fail_fn);
   return pid;
 }然后调用 handleSystemServerProcess
private static Runnable handleSystemServerProcess(ZygoteArguments parsedArgs) {
         
         Os.umask(S_IRWXG | S_IRWXO);//为用户文件创建权限掩码
         if (parsedArgs.mNiceName != null) {
             Process.setArgV0(parsedArgs.mNiceName);//执行AndroidRuntime::getRuntime()->setArgv0设置进程名 为system_server
         }
         final String systemServerClasspath = Os.getenv("SYSTEMSERVERCLASSPATH");
         if (systemServerClasspath != null) {
             if (shouldProfileSystemServer() && (Build.IS_USERDEBUG || Build.IS_ENG)) {
                 try {
                     Log.d(TAG, "Preparing system server profile");
                     final String standaloneSystemServerJars =
                             Os.getenv("STANDALONE_SYSTEMSERVER_JARS");
                     final String systemServerPaths = standaloneSystemServerJars != null
                             ? String.join(":", systemServerClasspath, standaloneSystemServerJars)
                             : systemServerClasspath;
                     prepareSystemServerProfile(systemServerPaths);//加载系统属性配置文件
                 } catch (Exception e) {
                     Log.wtf(TAG, "Failed to set up system server profile", e);
                 }
             }
         }
         if (parsedArgs.mInvokeWith != null) {
             String[] args = parsedArgs.mRemainingArgs;
             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.mInvokeWith,
                     parsedArgs.mNiceName, parsedArgs.mTargetSdkVersion,
                     VMRuntime.getCurrentInstructionSet(), null, args);//启动app_process程序//后面有源码
             throw new IllegalStateException("Unexpected return from WrapperInit.execApplication");
         } else {
             ClassLoader cl = getOrCreateSystemServerClassLoader();
             if (cl != null) {
                 Thread.currentThread().setContextClassLoader(cl);
             }
             return ZygoteInit.zygoteInit(parsedArgs.mTargetSdkVersion,
                     parsedArgs.mDisabledCompatChanges,
                     parsedArgs.mRemainingArgs, cl); //看后续源码
         }
     }WrapperInit.execApplication
public static void execApplication(String invokeWith, String niceName,
             int targetSdkVersion, String instructionSet, FileDescriptor pipeFd,
             String[] args) {
         StringBuilder command = new StringBuilder(invokeWith);
         final String appProcess;
         if (VMRuntime.is64BitInstructionSet(instructionSet)) {
             appProcess = "/system/bin/app_process64";
         } else {
             appProcess = "/system/bin/app_process32";
         }
         command.append(' ');
         command.append(appProcess);
         command.append(" -Xcompiler-option --generate-mini-debug-info");
         command.append(" /system/bin --application");
         if (niceName != null) {
             command.append(" '--nice-name=").append(niceName).append("'");
         }
         command.append(" com.android.internal.os.WrapperInit ");
         command.append(pipeFd != null ? pipeFd.getInt$() : 0);
         command.append(' ');
         command.append(targetSdkVersion);
         Zygote.appendQuotedShellArgs(command, args);
         preserveCapabilities();
         Zygote.execShell(command.toString());//执行命令
     }ZygoteInit.zygoteInit
public static Runnable zygoteInit(int targetSdkVersion, long[] disabledCompatChanges,
             String[] argv, ClassLoader classLoader) {
         RuntimeInit.redirectLogStreams();
         RuntimeInit.commonInit();//异常捕捉,设置时区等
         ZygoteInit.nativeZygoteInit();//注册了 zygote 初始化的各种 jni 方法
         return RuntimeInit.applicationInit(targetSdkVersion, disabledCompatChanges, argv,
                 classLoader);//看后续源码
     }
     
     
     private static void applicationInit(int targetSdkVersion, String[] argv)
             throws ZygoteInit.MethodAndArgsCaller {
         nativeSetExitWithoutCleanup(true);
         VMRuntime.getRuntime().setTargetHeapUtilization(0.75f);
         VMRuntime.getRuntime().setTargetSdkVersion(targetSdkVersion);//设置目标sdk版本
         final Arguments args;
         try {
             args = new Arguments(argv);
         } catch (IllegalArgumentException ex) {
             Slog.e(TAG, ex.getMessage());
             // let the process exit
             return;
         }
         invokeStaticMain(args.startClass, args.startArgs);
     }
     
     private static void invokeStaticMain(String className, String[] argv)
             throws ZygoteInit.MethodAndArgsCaller {
         Class<?> cl;
         try {
             cl = Class.forName(className);
         } catch (ClassNotFoundException ex) {
             throw new RuntimeException(
                     "Missing class when invoking static main " + className,
                     ex);
         }
         Method m;
         try {
             m = cl.getMethod("main", new Class[] { String[].class });//调用SystemServer.java类的main函数
         } 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);
         }
         throw new ZygoteInit.MethodAndArgsCaller(m, argv);
     }SystemServer 的main函数如下
public static void main(String[] args) {
          new SystemServer().run();}
 private void run() {
 703          try {           
 800              Looper.prepareMainLooper();         
 807              System.loadLibrary("android_servers");825              ActivityThread.initializeMainlineModules();
 828              ServiceManager.addService("system_server_dumper", mDumper);
 832              mSystemServiceManager = new SystemServiceManager(mSystemContext);
 833              mSystemServiceManager.setStartInfo(mRuntimeRestart,
 834                      mRuntimeStartElapsedTime, mRuntimeStartUptime);
 837              LocalServices.addService(SystemServiceManager.class, mSystemServiceManager);            
 867          } finally {
 868              t.traceEnd();  // InitBeforeStartServices
 869          }874          // Start services.
 875          try {
 876              t.traceBegin("StartServices");
 877              startBootstrapServices(t);//启动引导服务
 878              startCoreServices(t);//启动内核服务
 879              startOtherServices(t);//启动其他服务
 880          } catch (Throwable ex) {
 881              Slog.e("System", "******************************************");
 882              Slog.e("System", "************ Failure starting system services", ex);
 883              throw ex;
 884          } finally {
 885              t.traceEnd(); // StartServices
 886          }
 903          Looper.loop();
 904          
 905      } private void startBootstrapServices(@NonNull TimingsTraceAndSlog t) {
 992         
 1011          ServiceManager.addService(Context.PLATFORM_COMPAT_SERVICE, platformCompat);
 1012          ServiceManager.addService(Context.PLATFORM_COMPAT_NATIVE_SERVICE,
 1013                  new PlatformCompatNative(platformCompat));
 1014          AppCompatCallbacks.install(new long[0]);
 1015         
 1021          mSystemServiceManager.startService(FileIntegrityService.class);
 1022         
 1028          Installer installer = mSystemServiceManager.startService(Installer.class);
 1029        
 1034          mSystemServiceManager.startService(DeviceIdentifiersPolicyService.class);
 1035          
 1039          mSystemServiceManager.startService(UriGrantsManagerService.Lifecycle.class);
 1040         
 1044          mSystemServiceManager.startService(PowerStatsService.class);
 1045         
 1048          startIStatsService();
 1049         
 1054          startMemtrackProxyService();
 1055         
 1060          ActivityTaskManagerService atm = mSystemServiceManager.startService(
 1061                  ActivityTaskManagerService.Lifecycle.class).getService();
 1062          mActivityManagerService = ActivityManagerService.Lifecycle.startService(
 1063                  mSystemServiceManager, atm);
 1064          mActivityManagerService.setSystemServiceManager(mSystemServiceManager);
 1065          mActivityManagerService.setInstaller(installer);
 1066          mWindowManagerGlobalLock = atm.getGlobalLock();
 1067          
 1071          mDataLoaderManagerService = mSystemServiceManager.startService(
 1072                  DataLoaderManagerService.class);
 1073         
 1077          mIncrementalServiceHandle = startIncrementalService();
 1078         
 1085          mPowerManagerService = mSystemServiceManager.startService(PowerManagerService.class);
 1086        
 1089          mSystemServiceManager.startService(ThermalManagerService.class);
 1090          
 1093          mSystemServiceManager.startService(HintManagerService.class);
 1094         
 1099          mActivityManagerService.initPowerManagement();
 1100          
 1104          mSystemServiceManager.startService(RecoverySystemService.Lifecycle.class);
 1105         
 1110          RescueParty.registerHealthObserver(mSystemContext);
 1111          PackageWatchdog.getInstance(mSystemContext).noteBoot();
 1112  
 1113        
 1115          mSystemServiceManager.startService(LightsService.class);
 1116        
 1128          mDisplayManagerService = mSystemServiceManager.startService(DisplayManagerService.class);
 1129          
 1133          mSystemServiceManager.startBootPhase(t, SystemService.PHASE_WAIT_FOR_DEFAULT_DISPLAY);
 1134         
 1147          if (!mRuntimeRestart) {
 1148        
 1155          DomainVerificationService domainVerificationService = new DomainVerificationService(
 1156                  mSystemContext, SystemConfig.getInstance(), platformCompat);
 1157          mSystemServiceManager.startService(domainVerificationService);
 1158         
 1173          SystemServerDexLoadReporter.configureSystemServerDexReporter(mPackageManagerService);
 1174  
 1175          mFirstBoot = mPackageManagerService.isFirstBoot();
 1176          mPackageManager = mSystemContext.getPackageManager();1205          mSystemServiceManager.startService(UserManagerService.LifeCycle.class);
 1206       
 1215          mActivityManagerService.setSystemProcess();
 1216          
 1219          platformCompat.registerPackageReceiver(mSystemContext);
 1220    
 1233          mSystemServiceManager.startService(new OverlayManagerService(mSystemContext));
 1234         
 1237          mSystemServiceManager.startService(new SensorPrivacyService(mSystemContext));
 1238         LocalServices.getService(DisplayManagerInternal.class).onOverlayChanged();
     
 1249          mSystemServiceManager.startService(SensorService.class);
 1250         
 1252      }
  private void startCoreServices(@NonNull TimingsTraceAndSlog t) {
 1258         
 1262          mSystemServiceManager.startService(SystemConfigService.class);
 1263          
 1267          mSystemServiceManager.startService(BatteryService.class);
 1268        
 1272          mSystemServiceManager.startService(UsageStatsService.class);
 1273          mActivityManagerService.setUsageStatsManager(
 1274                  LocalServices.getService(UsageStatsManagerInternal.class));
 1275         
 1278          if (mPackageManager.hasSystemFeature(PackageManager.FEATURE_WEBVIEW)) {
 1279              t.traceBegin("StartWebViewUpdateService");
 1280              mWebViewUpdateService = mSystemServiceManager.startService(WebViewUpdateService.class);
 1281              t.traceEnd();
 1282          }
         
 1286          mSystemServiceManager.startService(CachedDeviceStateService.class);
 1287          
 1291          mSystemServiceManager.startService(BinderCallsStatsService.LifeCycle.class);
 1292          
 1296          mSystemServiceManager.startService(LooperStatsService.Lifecycle.class);
 1297         
 1301          mSystemServiceManager.startService(ROLLBACK_MANAGER_SERVICE_CLASS);
 1302         
 1306          mSystemServiceManager.startService(NativeTombstoneManagerService.class);
 1307         
 1311          mSystemServiceManager.startService(BugreportManagerService.class);
 1312         
 1316          mSystemServiceManager.startService(GpuService.class);
 1317         
 1320      }        startOtherServices(){
         //太多了,可以自己去看源码
         http://aospxref.com/android-12.0.0_r3/xref/frameworks/base/services/java/com/android/server/SystemServer.java#run }

systemserver服务启动就讲完了

2.servicemanager启动

我们看到 init 也启动了/system/bin/servicemanager程序,servicemanager程序的源码在android/frameworks/native/cmds/servicemanager/main.cpp

int main(int argc, char** argv) {
    
     const char* driver = argc == 2 ? argv[1] : "/dev/binder";
     sp<ProcessState> ps = ProcessState::initWithDriver(driver);//驱动层创建binder_proc
     ps->setThreadPoolMaxThreadCount(0);
     ps->setCallRestriction(ProcessState::CallRestriction::FATAL_IF_NOT_ONEWAY);//创建ServiceManager
     sp<ServiceManager> manager = sp<ServiceManager>::make(std::make_unique<Access>());
    //添加服务if (!manager->addService("manager", manager, false /*allowIsolated*/, IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT).isOk()) {
         LOG(ERROR) << "Could not self register servicemanager";
     }
     IPCThreadState::self()->setTheContextObject(manager);
     if (!ps->becomeContextManager()) {//注册成为binder服务的大管家
         LOG(FATAL) << "Could not become context manager";
     }//开启looper 消息循环 监听 BinderCallback
     sp<Looper> looper = Looper::prepare(false /*allowNonCallbacks*/);
     BinderCallback::setupTo(looper); //处理Binder请求
     ClientCallbackCallback::setupTo(looper, manager);//定时通知client变化
 #ifndef VENDORSERVICEMANAGER
     if (!SetProperty("servicemanager.ready", "true")) {
         LOG(ERROR) << "Failed to set servicemanager ready property";
     }
 #endif
     while(true) {
         looper->pollAll(-1);
     }
     // should not be reached
     return EXIT_FAILURE;
 }