Android开机流程、Zygote进程、systemserver、ServiceManager

news2024/11/25 22:43:05

一、Loader层

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

2、 Boot Loader引导程序

        Android是基于Linux系统的,它没有BIOS程序,取而代之的是BootLoader(系统启动引导程序)。引导程序是厂商加锁和限制的地方,它是针对特定的主板与芯片的。厂商要么使用很受欢迎的引导程序比如redbootubootARMboot等或者开发自己的引导程序,它不是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进程启动细节

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/596138.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Arcgis进阶篇(6)——如何将Arcgis Pro的离线数据发布成服务

常常因为Arcgis Server&#xff08;或者GeoScene Server&#xff09;昂贵的价格&#xff0c;而导致小项目技术选型选择开源的GIS Server&#xff08;如GeoServer等&#xff09;。但用完之后&#xff0c;发现后者实在拉跨&#xff0c;使用对比差异巨大。那就只能另想办法&#x…

商家618活动文案怎么写,注意事项

马上又是一年的618&#xff0c;特别是最近大家消费热情高涨的时候。今天&#xff0c;就来和大家好好唠一唠618。商家618活动文案怎么写&#xff0c;以及注意事项。 为了以防有些人没有真正了解618&#xff0c;虽然可能性很小&#xff0c;但是本着严谨的原则&#xff0c;还是先介…

MySQL数据库 3.内部数据模型

&#x1f914;前言&#xff1a; &#x1f642;关系型数据库&#xff1a; 关系型数据库是建立在关系模型基础上&#xff0c;由多张相互连接的二维表组成的数据库。 关系型数据库是一种使用关系模型来组织数据的数据库系统。数据以二维表的形式存储&#xff0c;一张表代表一种数…

chatgpt赋能python:Python交流微信群:打开学习和分享的大门

Python交流微信群&#xff1a;打开学习和分享的大门 Python是一种高级编程语言&#xff0c;得益于其灵活性&#xff0c;易学性和强大的社区支持&#xff0c;已经成为许多程序员首选的开发语言。但是&#xff0c;学习Python并没有那么容易&#xff0c;很多人可能会面临困惑和挫…

FPGA 设计中经常犯的 10 个错误

本文列出了FPGA设计中常见的十个错误。我们收集了 FPGA 工程师在其设计中犯的 10 个最常见错误&#xff0c;并提供了解决方案的建议和替代方案。本文假定读者已经具备 RTL 设计和数字电路方面的基础。接下来让我们深入探讨在FPGA 设计中要避免的 10 大错误。 异步逻辑 FPGA 设计…

C# webAPI 精解

入门 创建一个web项目 先创建一个web项目 基本可以运行的程度 用postman进行接口测试 .NET Framework 和 .NET Core 都可以创建 webAPI 这里用 .NET Framework 比较简单 。 启动 Visual Studio&#xff0c;并从“开始”页中选择“新建项目”。 或者&#xff0c;在 “文件” 菜…

简单介绍Roop(类似SimSwap)单张图视频换脸的项目

文章目录 &#xff08;一&#xff09;关于Roop&#xff08;二&#xff09;安装Roop&#xff08;CPU&#xff09;&#xff08;2.1&#xff09;克隆仓库&#xff08;2.2&#xff09;设置python国内源&#xff08;2.2&#xff09;检查安装virtualenv&#xff08;2.3&#xff09;创…

chatgpt赋能python:Python文本处理——从文本中提取数据

Python文本处理——从文本中提取数据 在数据分析和机器学习中&#xff0c;从文本中提取数据是一个十分重要的步骤。在Python中&#xff0c;我们可以使用各种工具和库来实现这一目标。这篇文章将介绍一些Python中用于从文本中提取数据的常用技术。 正则表达式 正则表达式是一…

大数据管理平台DataSophon-1.1.1安装部署详细流程

1 DataSophon介绍 1.1 DataSophon愿景 DataSophon致力于快速实现部署、管理、监控以及自动化运维大数据云原生平台&#xff0c;帮助您快速构建起稳定、高效、可弹性伸缩的大数据云原生平台。 1.2 DataSophon是什么 《三体》&#xff0c;这部获世界科幻文学最高奖项雨果奖的…

聚观早报 | 英伟达市值破万亿美元;微信问一问搜索功能开始内测

今日要闻&#xff1a;英伟达市值破万亿美元&#xff1b;微信「问一问」搜索功能开始内测&#xff1b;快播宣告破产公司已注销&#xff1b;贤合庄北京门店全部关闭&#xff1b;华为AIGC或在7月发布 英伟达市值破万亿美元 5 月 30 日消息&#xff0c;上周三&#xff0c;英伟达发…

阿里云服务器选购指南(图文教程详解)

目录 一、前言 二、基本概念 1.定义 2.部署形式 3.用处 三、主流平台 1.Google 2.AWS 3.华为云 4.腾讯云 5.阿里云 四、云服务器分类 1.云服务器ECS 2.轻量应用服务器 3.GPU云服务器 4.FPGA云服务器 5.无影云桌面 五、选购指南 1.明确需求 2.明确身份 3.明确时间 4.明确教程 一…

浅谈数字电视大楼电力保护监控系统的设计与应用

摘要&#xff1a;介绍天津电视台数字电视大厦电力监控系统的选择与建立&#xff0c;组网方式&#xff0c;系统的使用与报文的显示等&#xff0c;通过该系统对大厦所有变配电回路、UPS 线路等关键部位进行监控和管理。 关键词&#xff1a;电力监控;数字电视;变配电; 1.总述 天津…

一个通用的自适应prompt方法,突破了零样本学习的瓶颈

深度学习自然语言处理 原创作者&#xff1a;Winni 今天要给大家介绍一篇Google的研究&#xff0c;解决了大语言模型&#xff08;LLMs&#xff09;在零样本学习方面的困境。相比于少样本学习&#xff0c;LLMs在零样本学习上常常表现得比较弱&#xff0c;这主要是因为缺乏指导。而…

MySQL数据库 5.DDl操作数据库

目录 &#x1f914;DDL介绍&#xff1a; &#x1f914;语法详解&#xff1a; 1.查询&#xff1a; 1.查询所有数据库&#xff1a; 示例&#xff1a;查询自带数据库 2.查询当前数据库&#xff1a; 2.创建&#xff1a; 示例&#xff1a;创建一个名字叫做itcast的数据库&…

chatgpt赋能python:Python的交运算:了解、应用和优化

Python的交运算&#xff1a;了解、应用和优化 Python是一种流行的编程语言&#xff0c;它拥有丰富的数据结构和算法库。其中&#xff0c;交运算是一种常用的操作&#xff0c;它能够方便地比较两个集合的相同元素。在这篇SEO文章中&#xff0c;我们将介绍Python中的交运算&…

(原创)Android apk应用加固、字节对齐、二次签名全流程

这篇博客主要是讲如何对apk应用进行加固、对齐和签名的&#xff0c;会有详细的步骤逐一介绍 前言 随着各大加固工具都开始逐一收费后&#xff0c;个人开发中或者中小型企业如何对应用进行加固就成了一个问题。以前我常用的是360加固助手&#xff0c;虽然每天限制一定的免费次数…

玖章算术荣获信通院“生成式人工智能技术和应用优秀案例”奖

5月31日&#xff0c;“杭州通用人工智能论坛”在杭州梦想小镇互联网村成功举办。本次会议由中国信息通信究院&#xff08;以下简称中国信通院&#xff09;、浙江省经济和信息化厅、杭州市人民政府、中国人工智能产业发展联盟等共同主办。 玖章算术获奖 玖章算术的 NineData 智…

git 使用ssh连接Github:017

1. 首先打开Git Bash终端&#xff0c;生成私钥和公钥&#xff1a;ssh-keygen 输入&#xff1a;ssh-keygen 之后&#xff0c; 会有三步提示&#xff0c;全部按回车建。 2. 进入主路径&#xff1a;cd ~/.ssh/ 进入这个路径之后&#xff0c;使用命令&#xff1a;ls 会看到两个文…

基于VMD-SSA-LSTM的多维时序光伏功率预测

目录 1 主要内容 变分模态分解(VMD) 麻雀搜索算法SSA 长短期记忆网络LSTM 2 部分代码 3 程序结果 4 下载链接 1 主要内容 之前分享了预测的程序基于LSTM的负荷和可再生能源出力预测【核心部分复现】&#xff0c;该程序预测效果比较好&#xff0c;并且结构比较清晰&#x…

.net 6.0图片转Base64部署到Linux系统上报The type initializer for ‘Gdip‘ threw an exception

在业务当中需要将图片文件转为Base64&#xff1a;windows上可以运行正常执行&#xff0c;部署到Linux系统上报The type initializer for ‘Gdip‘ threw an exception 图片转Base64代码如下 /// <summary> /// 图片转为base64编码的文本 /// </summary> /// <…