{
  "schemaVersion": "0.11.0",
  "canonical": "https://www.pystone.net/notes/android-os-boot-sequence/",
  "atlas": "https://www.pystone.net/?node=android-os-boot-sequence#knowledge-atlas",
  "markdown": "https://www.pystone.net/notes/android-os-boot-sequence.md",
  "context": "https://www.pystone.net/notes/android-os-boot-sequence.context.json",
  "knowledgeVersion": "224c990773de.5fa8af6e39fa",
  "build": {
    "siteCommit": "224c990773de166d23a886306577dd90379529ce",
    "notesCommit": "5fa8af6e39fa3891d1b9b4832bfa6c4e0ecaaf0a",
    "builtAt": "1970-01-01T00:00:00.000Z",
    "version": "224c990773de.5fa8af6e39fa"
  },
  "id": "note:android-os-boot-sequence",
  "slug": "android-os-boot-sequence",
  "title": "Android OS 启动流程",
  "type": "note",
  "visibility": "public",
  "idStability": "rename-stable",
  "author": {
    "name": "Perrin Yong",
    "profile": "https://www.pystone.net/profile/"
  },
  "publisher": {
    "name": "Perrin Yong",
    "profile": "https://www.pystone.net/profile/"
  },
  "aliases": [],
  "summary": "Android OS Boot Process ![](assets/image 20250122183537175.png) 图片来源: https://copperhead.co/blog/android boot process/ Android OS 启动流程 发生时间 ：设备加电时。 作用 ： 1. 初始化硬件（CPU、内存等）。 2. 扫描引导介质（如 NAND 或 eMMC）以寻找引导加载程序（Bootloader）…",
  "contentRole": "unspecified",
  "isMoc": false,
  "mocRecognition": "none",
  "generated": false,
  "attribution": "unspecified",
  "domain": "10-计算机、信息技术与工程",
  "tags": [],
  "mocs": [],
  "contentHash": "3457bc1386087f7a8282c6b241dcca71b30ea02b5bb47223c07cb2f3ffc6a5f2",
  "assets": [
    {
      "reference": "assets/image-20250122183537175.png",
      "url": "/media/3ea4dc931d1dff105b41.png",
      "mediaType": "image/png",
      "contentHash": "3ea4dc931d1dff105b4189f07008880331bbd0b5a2e299f71fef847ec8d344f9",
      "byteLength": 50714,
      "width": 735,
      "height": 628
    }
  ],
  "headings": [
    {
      "depth": 1,
      "text": "Android OS 启动流程",
      "anchor": "android-os-启动流程",
      "citation": "https://www.pystone.net/notes/android-os-boot-sequence/#android-os-%E5%90%AF%E5%8A%A8%E6%B5%81%E7%A8%8B"
    },
    {
      "depth": 2,
      "text": "2. Bootloader（引导加载程序）",
      "anchor": "2-bootloader引导加载程序",
      "citation": "https://www.pystone.net/notes/android-os-boot-sequence/#2-bootloader%E5%BC%95%E5%AF%BC%E5%8A%A0%E8%BD%BD%E7%A8%8B%E5%BA%8F"
    },
    {
      "depth": 2,
      "text": "3. Linux Kernel（Linux 内核）",
      "anchor": "3-linux-kernellinux-内核",
      "citation": "https://www.pystone.net/notes/android-os-boot-sequence/#3-linux-kernellinux-%E5%86%85%E6%A0%B8"
    },
    {
      "depth": 2,
      "text": "4. Init Process（初始化进程）",
      "anchor": "4-init-process初始化进程",
      "citation": "https://www.pystone.net/notes/android-os-boot-sequence/#4-init-process%E5%88%9D%E5%A7%8B%E5%8C%96%E8%BF%9B%E7%A8%8B"
    },
    {
      "depth": 2,
      "text": "初始化和启动属性服务",
      "anchor": "初始化和启动属性服务",
      "citation": "https://www.pystone.net/notes/android-os-boot-sequence/#%E5%88%9D%E5%A7%8B%E5%8C%96%E5%92%8C%E5%90%AF%E5%8A%A8%E5%B1%9E%E6%80%A7%E6%9C%8D%E5%8A%A1"
    },
    {
      "depth": 2,
      "text": "Init 解析Service",
      "anchor": "init-解析service",
      "citation": "https://www.pystone.net/notes/android-os-boot-sequence/#init-%E8%A7%A3%E6%9E%90service"
    },
    {
      "depth": 2,
      "text": "init启动Service(包括zygote)",
      "anchor": "init启动service包括zygote",
      "citation": "https://www.pystone.net/notes/android-os-boot-sequence/#init%E5%90%AF%E5%8A%A8service%E5%8C%85%E6%8B%ACzygote"
    },
    {
      "depth": 2,
      "text": "AppRuntime启动Zygote",
      "anchor": "appruntime启动zygote",
      "citation": "https://www.pystone.net/notes/android-os-boot-sequence/#appruntime%E5%90%AF%E5%8A%A8zygote"
    },
    {
      "depth": 2,
      "text": "Zygote Init",
      "anchor": "zygote-init",
      "citation": "https://www.pystone.net/notes/android-os-boot-sequence/#zygote-init"
    },
    {
      "depth": 2,
      "text": "6. System Services（系统服务）",
      "anchor": "6-system-services系统服务",
      "citation": "https://www.pystone.net/notes/android-os-boot-sequence/#6-system-services%E7%B3%BB%E7%BB%9F%E6%9C%8D%E5%8A%A1"
    },
    {
      "depth": 2,
      "text": "SyetemServer进程的启动",
      "anchor": "syetemserver进程的启动",
      "citation": "https://www.pystone.net/notes/android-os-boot-sequence/#syetemserver%E8%BF%9B%E7%A8%8B%E7%9A%84%E5%90%AF%E5%8A%A8"
    },
    {
      "depth": 2,
      "text": "SyetemServer进程的工作",
      "anchor": "syetemserver进程的工作",
      "citation": "https://www.pystone.net/notes/android-os-boot-sequence/#syetemserver%E8%BF%9B%E7%A8%8B%E7%9A%84%E5%B7%A5%E4%BD%9C"
    },
    {
      "depth": 2,
      "text": "7. Boot Completed（启动完成）",
      "anchor": "7-boot-completed启动完成",
      "citation": "https://www.pystone.net/notes/android-os-boot-sequence/#7-boot-completed%E5%90%AF%E5%8A%A8%E5%AE%8C%E6%88%90"
    },
    {
      "depth": 2,
      "text": "Launcher",
      "anchor": "launcher",
      "citation": "https://www.pystone.net/notes/android-os-boot-sequence/#launcher"
    },
    {
      "depth": 2,
      "text": "Thanks",
      "anchor": "thanks",
      "citation": "https://www.pystone.net/notes/android-os-boot-sequence/#thanks"
    }
  ],
  "claims": [],
  "outgoing": [],
  "incoming": [
    {
      "id": "note:application-and-cloud-engineering",
      "title": "应用开发与云端工程",
      "url": "https://www.pystone.net/notes/application-and-cloud-engineering/",
      "atlas": "https://www.pystone.net/?node=application-and-cloud-engineering#knowledge-atlas",
      "label": "应用开发与云端工程",
      "origin": "explicit",
      "humanReviewed": true,
      "context": "Android开发中的“Android OS 启动流程”导航项",
      "citation": "https://www.pystone.net/notes/application-and-cloud-engineering/#android%E5%BC%80%E5%8F%91"
    }
  ],
  "contentMarkdown": "Android OS Boot Process\n![](assets/image-20250122183537175.png)\n图片来源: https://copperhead.co/blog/android-boot-process/\n# Android OS 启动流程\n- **发生时间**：设备加电时。\n- **作用**：\n    1. 初始化硬件（CPU、内存等）。\n    2. 扫描引导介质（如 NAND 或 eMMC）以寻找引导加载程序（Bootloader）。\n    3. 将引导加载程序复制到内存中，并开始执行。\n- **类似功能**：类似于电脑的 BIOS，完成最基本的硬件初始化。\n\n---\n\n## **2. Bootloader（引导加载程序）**\n\n- **发生时间**：ROM代码执行后。\n- **功能**：\n    - 引导加载程序不是 Android 系统的一部分，主要由设备制造商定制，负责加载 Android 系统。\n    - 分为两个阶段：\n        1. **初始程序加载（IPL）**：\n            - 设置外部 RAM。\n            - 将第二阶段程序（SPL）复制到 RAM 并开始执行。\n        2. **第二程序加载（SPL）**：\n            - 加载 Android 系统核心（Linux Kernel）。\n            - 初始化硬件（如显示、文件系统等）。\n            - 提供进入其他模式（如 fastboot 和 recovery）的选项。\n            - 将 Linux Kernel 从引导介质复制到内存中并执行。\n\n---\n\n## **3. Linux Kernel（Linux 内核）**\n\n- **发生时间**：Bootloader 将控制权交给内核时。\n- **功能**：\n    1. 设置缓存、内存保护、调度机制。\n    2. 加载必要的驱动程序（设备驱动、显示驱动等）。\n    3. 初始化硬件（电源管理、存储等）。\n    4. 查找并启动 `init` 进程。\n- **区别于普通 Linux 内核的功能**：\n    - **Binder**：Android 专用的进程间通信（IPC）机制。\n    - **ASHMEM**：高效共享内存管理。\n    - **Wake Locks**：管理设备在空闲时的电源状态。\n    - **Logger**：支持 Android 的 logcat 日志工具。\n    - **Paranoid Networking**：基于进程组的网络权限控制。\n\n---\n\n## **4. Init Process（初始化进程）**\ninit进程是Android系统中用户空间的第一个进程\n\n\n- **发生时间**：内核加载完成后。\n- **功能**：\n    1. 挂载关键目录：`/sys`、`/dev`、`/proc`。\n    2. 调用start_property_service启动属性服务,\n    3. 运行 `init.rc` 脚本：\n        - 配置系统属性。\n        - 启动关键守护进程。\n        - 加载 Zygote 进程。\n- **位置**：\n    - `init` 源码路径：`<android source>/system/core/init`\n    - `init.rc` 路径：`<android source>/system/core/rootdir`\n\n**system/core/init/init.cpp**\n\n```cpp\nint main(int argc, char** argv) {\n    if (!strcmp(basename(argv[0]), \"ueventd\")) {\n        return ueventd_main(argc, argv);\n    }\n    if (!strcmp(basename(argv[0]), \"watchdogd\")) {\n        return watchdogd_main(argc, argv);\n    }\n    umask(0);\n    add_environment(\"PATH\", _PATH_DEFPATH);\n    bool is_first_stage = (argc == 1) || (strcmp(argv[1], \"--second-stage\") != 0);\n    //创建文件并挂载\n    if (is_first_stage) {\n        mount(\"tmpfs\", \"/dev\", \"tmpfs\", MS_NOSUID, \"mode=0755\");\n        mkdir(\"/dev/pts\", 0755);\n        mkdir(\"/dev/socket\", 0755);\n        mount(\"devpts\", \"/dev/pts\", \"devpts\", 0, NULL);\n        #define MAKE_STR(x) __STRING(x)\n        mount(\"proc\", \"/proc\", \"proc\", 0, \"hidepid=2,gid=\" MAKE_STR(AID_READPROC));\n        mount(\"sysfs\", \"/sys\", \"sysfs\", 0, NULL);\n    }\n    open_devnull_stdio();\n    klog_init();\n    klog_set_level(KLOG_NOTICE_LEVEL);\n    NOTICE(\"init %s started!\\n\", is_first_stage ? \"first stage\" : \"second stage\");\n    if (!is_first_stage) {\n        // Indicate that booting is in progress to background fw loaders, etc.\n        close(open(\"/dev/.booting\", O_WRONLY | O_CREAT | O_CLOEXEC, 0000));\n        //初始化属性相关资源\n        property_init();//1\n        process_kernel_dt();\n        process_kernel_cmdline();\n        export_kernel_boot_props();\n    }\n ...\n    //启动属性服务\n    start_property_service();//2\n    const BuiltinFunctionMap function_map;\n    Action::set_function_map(&function_map);\n    Parser& parser = Parser::GetInstance();\n    parser.AddSectionParser(\"service\",std::make_unique<ServiceParser>());\n    parser.AddSectionParser(\"on\", std::make_unique<ActionParser>());\n    parser.AddSectionParser(\"import\", std::make_unique<ImportParser>());\n    //解析init.rc配置文件\n    parser.ParseConfig(\"/init.rc\");//3\n   ...\n       while (true) {\n        if (!waiting_for_exec) {\n            am.ExecuteOneCommand();\n            restart_processes();\n        }\n        int timeout = -1;\n        if (process_needs_restart) {\n            timeout = (process_needs_restart - gettime()) * 1000;\n            if (timeout < 0)\n                timeout = 0;\n        }\n        if (am.HasMoreCommands()) {\n            timeout = 0;\n        }\n        bootchart_sample(&timeout);\n        epoll_event ev;\n        int nr = TEMP_FAILURE_RETRY(epoll_wait(epoll_fd, &ev, 1, timeout));\n        if (nr == -1) {\n            ERROR(\"epoll_wait failed: %s\\n\", strerror(errno));\n        } else if (nr == 1) {\n            ((void (*)()) ev.data.ptr)();\n        }\n    }\n    return 0;\n}\n\n```\n\n\n---\n\n**system/core/rootdir/init.zygote64.rc**\n```bash\nservice zygote /system/bin/app_process64 -Xzygote /system/bin --zygote --start-system-server\n    class main\n    socket zygote stream 660 root system\n    onrestart write /sys/android_power/request_state wake\n    onrestart write /sys/power/state on\n    onrestart restart audioserver\n    onrestart restart cameraserver\n    onrestart restart media\n    onrestart restart netd\n    writepid /dev/cpuset/foreground/tasks /dev/stune/foreground/tasks\n\n```\n\n## 初始化和启动属性服务\n property_init 对属性进行初始化\n start_property_service启动属性服务\n\nWindows平台上有一个注册表管理器，注册表的内容采用键值对的形式来记录用户、软件的一些使用信息。即使系统或者软件重启，它还是能够根据之前在注册表中的记录，进行相应的初始化工作。Android也提供了一个类似的机制，叫做属性服务。\n\n## Init 解析Service\n\n\n**system/core/init/service.cpp**\n\n```c\nbool ServiceParser::ParseSection(const std::vector<std::string>& args,\n                                 std::string* err) {\n    if (args.size() < 3) {\n        *err = \"services must have a name and a program\";\n        return false;\n    }\n    const std::string& name = args[1];\n    if (!IsValidName(name)) {\n        *err = StringPrintf(\"invalid service name '%s'\", name.c_str());\n        return false;\n    }\n    std::vector<std::string> str_args(args.begin() + 2, args.end());\n    service_ = std::make_unique<Service>(name, \"default\", str_args);//1\n    return true;\n}\n\nbool ServiceParser::ParseLineSection(const std::vector<std::string>& args,\n                                     const std::string& filename, int line,\n                                     std::string* err) const {\n    return service_ ? service_->HandleLine(args, err) : false;\n}\n\nvoid ServiceParser::EndSection() {\n    if (service_) {\n        ServiceManager::GetInstance().AddService(std::move(service_));\n    }\n}\n\nvoid ServiceManager::AddService(std::unique_ptr<Service> service) {\n    Service* old_service = FindServiceByName(service->name());\n    if (old_service) {\n        ERROR(\"ignored duplicate definition of service '%s'\",\n              service->name().c_str());\n        return;\n    }\n    services_.emplace_back(std::move(service));//1\n}\n\n```\n\n根据参数创建出service对象，然后根据选项域的内容填充service对象，最后将service对象加入到vector类型的services链表中。\n\n## init启动Service(包括zygote)\n\n**system/core/rootdir/init.rc**\n```bash\n...\non nonencrypted\n    # A/B update verifier that marks a successful boot.\n    exec - root -- /system/bin/update_verifier nonencrypted\n    class_start main\n    class_start late_start\n...\n```\n\nclass_start 对应的函数是 do_class_start\n```cpp\nstatic int do_class_start(const std::vector<std::string>& args) {\n        /* Starting a class does not start services\n         * which are explicitly disabled.  They must\n         * be started individually.\n         */\n    ServiceManager::GetInstance().\n        ForEachServiceInClass(args[1], [] (Service* s) { s->StartIfNotDisabled(); });\n    return 0;\n}\n```\n\n**system/core/init/service.cpp**\n```cpp\nbool Service::StartIfNotDisabled() {\n    if (!(flags_ & SVC_DISABLED)) {\n        return Start();\n    } else {\n        flags_ |= SVC_DISABLED_START;\n    }\n    return true;\n}\n```\n\n```cpp\nbool Service::Start() {\n    flags_ &= (~(SVC_DISABLED|SVC_RESTARTING|SVC_RESET|SVC_RESTART|SVC_DISABLED_START));\n    time_started_ = 0;\n    if (flags_ & SVC_RUNNING) {//如果Service已经运行，则不启动\n        return false;\n    }\n    bool needs_console = (flags_ & SVC_CONSOLE);\n    if (needs_console && !have_console) {\n        ERROR(\"service '%s' requires console\\n\", name_.c_str());\n        flags_ |= SVC_DISABLED;\n        return false;\n    }\n  //判断需要启动的Service的对应的执行文件是否存在，不存在则不启动该Service\n    struct stat sb;\n    if (stat(args_[0].c_str(), &sb) == -1) {\n        ERROR(\"cannot find '%s' (%s), disabling '%s'\\n\",\n              args_[0].c_str(), strerror(errno), name_.c_str());\n        flags_ |= SVC_DISABLED;\n        return false;\n    }\n\n...\n    pid_t pid = fork();//1.fork函数创建子进程\n    if (pid == 0) {//运行在子进程中\n        umask(077);\n        for (const auto& ei : envvars_) {\n            add_environment(ei.name.c_str(), ei.value.c_str());\n        }\n        for (const auto& si : sockets_) {\n            int socket_type = ((si.type == \"stream\" ? SOCK_STREAM :\n                                (si.type == \"dgram\" ? SOCK_DGRAM :\n                                 SOCK_SEQPACKET)));\n            const char* socketcon =\n                !si.socketcon.empty() ? si.socketcon.c_str() : scon.c_str();\n\n            int s = create_socket(si.name.c_str(), socket_type, si.perm,\n                                  si.uid, si.gid, socketcon);\n            if (s >= 0) {\n                PublishSocket(si.name, s);\n            }\n        }\n...\n        //2.通过execve执行程序\n        if (execve(args_[0].c_str(), (char**) &strs[0], (char**) ENV) < 0) {\n            ERROR(\"cannot execve('%s'): %s\\n\", args_[0].c_str(), strerror(errno));\n        }\n\n        _exit(127);\n    }\n...\n    return true;\n}\n\n```\n调用fork函数来创建子进程\n在子进程中调用execve执行system/bin/app_process\n**frameworks/base/cmds/app_process/app_main.cpp**\n```cpp\nint main(int argc, char* const argv[])\n{\n    ...\n    if (zygote) {\n        runtime.start(\"com.android.internal.os.ZygoteInit\", args, zygote);//1\n    } else if (className) {\n        runtime.start(\"com.android.internal.os.RuntimeInit\", args, zygote);\n    } else {\n        fprintf(stderr, \"Error: no class name or --zygote supplied.\\n\");\n        app_usage();\n        LOG_ALWAYS_FATAL(\"app_process: no class name or --zygote supplied.\");\n        return 10;\n    }\n}\n\n```\n\n调用runtime(AppRuntime)的start来启动zygote。\n\n## AppRuntime启动Zygote\n\n\ninit启动zygote时主要是调用app_main.cpp的main函数中的AppRuntime的start来启动zygote进程\n\n**frameworks/base/cmds/app_process/app_main.cpp**\n```cpp\nint main(int argc, char* const argv[])\n{\n...\n\n    AppRuntime runtime(argv[0], computeArgBlockSize(argc, argv));\n   ...\n     Vector<String8> args;\n    if (!className.isEmpty()) {\n        args.add(application ? String8(\"application\") : String8(\"tool\"));\n        runtime.setClassNameAndArgs(className, argc - i, argv + i);\n    } else {\n        // We're in zygote mode.\n        maybeCreateDalvikCache();\n        if (startSystemServer) {\n            args.add(String8(\"start-system-server\"));//1\n        }\n        char prop[PROP_VALUE_MAX];\n        if (property_get(ABI_LIST_PROPERTY, prop, NULL) == 0) {\n            LOG_ALWAYS_FATAL(\"app_process: Unable to determine ABI list from property %s.\",\n                ABI_LIST_PROPERTY);\n            return 11;\n        }\n        String8 abiFlag(\"--abi-list=\");\n        abiFlag.append(prop);\n        args.add(abiFlag);\n        for (; i < argc; ++i) {\n            args.add(String8(argv[i]));\n        }\n    }\n    if (!niceName.isEmpty()) {\n        runtime.setArgv0(niceName.string());\n        set_process_name(niceName.string());\n    }\n    if (zygote) {\n        runtime.start(\"com.android.internal.os.ZygoteInit\", args, zygote);//2\n    } else if (className) {\n        runtime.start(\"com.android.internal.os.RuntimeInit\", args, zygote);\n    } else {\n        fprintf(stderr, \"Error: no class name or --zygote supplied.\\n\");\n        app_usage();\n        LOG_ALWAYS_FATAL(\"app_process: no class name or --zygote supplied.\");\n        return 10;\n    }\n}\n\n```\n\nruntime指的就是AppRuntime，AppRuntime声明也在app_main.cpp中，它继承AndroidRuntime\n调用start其实是调用AndroidRuntime的start函数\n\n**frameworks/base/core/jni/AndroidRuntime.cpp**\n```cpp\nvoid AndroidRuntime::start(const char* className, const Vector<String8>& options, bool zygote)\n{\n    ...\n    /* start the virtual machine */\n    JniInvocation jni_invocation;\n    jni_invocation.Init(NULL);\n    JNIEnv* env;\n    if (startVm(&mJavaVM, &env, zygote) != 0) {//1\n        return;\n    }\n    onVmCreated(env);\n    if (startReg(env) < 0) {//2\n        ALOGE(\"Unable to register all android natives\\n\");\n        return;\n    }\n    jclass stringClass;\n    jobjectArray strArray;\n    jstring classNameStr;\n\n    stringClass = env->FindClass(\"java/lang/String\");\n    assert(stringClass != NULL);\n    //创建数组\n    strArray = env->NewObjectArray(options.size() + 1, stringClass, NULL);\n    assert(strArray != NULL);\n    //从app_main的main函数得知className为com.android.internal.os.ZygoteInit\n    classNameStr = env->NewStringUTF(className);\n    assert(classNameStr != NULL);\n    env->SetObjectArrayElement(strArray, 0, classNameStr);\n\n    for (size_t i = 0; i < options.size(); ++i) {\n        jstring optionsStr = env->NewStringUTF(options.itemAt(i).string());\n        assert(optionsStr != NULL);\n        env->SetObjectArrayElement(strArray, i + 1, optionsStr);\n    }\n    char* slashClassName = toSlashClassName(className);\n    jclass startClass = env->FindClass(slashClassName);\n    if (startClass == NULL) {\n        ALOGE(\"JavaVM unable to locate class '%s'\\n\", slashClassName);\n        /* keep going */\n    } else {\n    //找到ZygoteInit的main函数\n        jmethodID startMeth = env->GetStaticMethodID(startClass, \"main\",\n            \"([Ljava/lang/String;)V\");//3\n        if (startMeth == NULL) {\n            ALOGE(\"JavaVM unable to find main() in '%s'\\n\", className);\n            /* keep going */\n        } else {\n        //通过JNI调用ZygoteInit的main函数\n            env->CallStaticVoidMethod(startClass, startMeth, strArray);//4\n\n#if 0\n            if (env->ExceptionCheck())\n                threadExitUncaughtException(env);\n#endif\n        }\n    }\n  ...\n}\n\n```\n\n调用startVm函数来创建JavaVm\n调用startReg函数用来为JavaVm注册JNI\n找到ZygoteInit的main函数\nstartClass从app_main的main函数得知为com.android.internal.os.ZygoteInit\n通过JNI调用ZygoteInit的main函数\n\n通过JNI调用ZygoteInit的main函数后，Zygote便进入了Java框架层，此前没有任何代码进入过Java框架层，换句换说**Zygote开创了Java框架层**。\n\n## Zygote Init\n在Android系统中，JavaVM(Java虚拟机)、应用程序进程以及运行系统的关键服务的SystemServer进程都是由Zygote进程来创建的，我们也将它称为孵化器。\n\n通过fock(复制进程)的形式来创建应用程序进程和SystemServer进程\n由于Zygote进程在启动时会创建JavaVM，因此通过fock而创建的应用程序进程和SystemServer进程可以在内部获取一个JavaVM的实例拷贝。\n\n\n- **发生时间**：`init` 进程启动后。\n- **功能**：\n    1. Zygote 是一个特殊的虚拟机进程，负责预加载系统核心库和资源。\n    2. 提供共享内存机制，支持应用快速启动，减少资源消耗。\n    3. 启动时完成以下步骤：\n        - 加载 `ZygoteInit` 类（源码路径：`<android source>/frameworks/base/core/java/com/android/internal/os/ZygoteInit.java`）。\n        - 注册 Zygote 套接字（用于接收命令）。\n        - 预加载类文件（`<android source>/frameworks/base` 下的预加载列表）。\n        - 预加载资源（如主题、布局等）。\n    4. 启动系统服务。\n\n\n**frameworks/base/core/java/com/android/internal/os/ZygoteInit.java**\n```java\n public static void main(String argv[]) {\n       ...\n        try {\n         ...\n            //注册Zygote用的Socket\n            registerZygoteSocket(socketName);//1\n           ...\n           //预加载类和资源\n           preload();//2\n           ...\n            if (startSystemServer) {\n            //启动SystemServer进程\n                startSystemServer(abiList, socketName);//3\n            }\n            Log.i(TAG, \"Accepting command socket connections\");\n            //等待客户端请求\n            runSelectLoop(abiList);//4\n            closeServerSocket();\n        } catch (MethodAndArgsCaller caller) {\n            caller.run();\n        } catch (RuntimeException ex) {\n            Log.e(TAG, \"Zygote died with exception\", ex);\n            closeServerSocket();\n            throw ex;\n        }\n    }\n\n```\n\n通过registerZygoteSocket函数来创建一个Server端的Socket，这个Socket用来等待ActivityManagerService来请求Zygote来创建新的应用程序进程\n预加载类和资源\n启动SystemServer进程，这样系统的关键服务也会由SystemServer进程启动起来\n调用runSelectLoop函数来等待客户端请求\n\n## **6. System Services（系统服务）**\n## SyetemServer进程的启动\nZygote进程启动了SyetemServer进程\n```java\n private static boolean startSystemServer(String abiList, String socketName)\n            throws MethodAndArgsCaller, RuntimeException {\n     ...\n        if (pid == 0) {\n            if (hasSecondZygote(abiList)) {\n                waitForSecondaryZygote(socketName);\n            }\n            handleSystemServerProcess(parsedArgs);\n        }\n        return true;\n    }\n\n```\n\n在startSystemServer函数中调用handleSystemServerProcess来启动SystemServer进程。\n```java\n  private static void handleSystemServerProcess(\n            ZygoteConnection.Arguments parsedArgs)\n            throws ZygoteInit.MethodAndArgsCaller {\n        closeServerSocket();//1\n      ...\n        if (parsedArgs.invokeWith != null) {\n           ...\n        } else {\n            ClassLoader cl = null;\n            if (systemServerClasspath != null) {\n                cl = createSystemServerClassLoader(systemServerClasspath,\n                                                   parsedArgs.targetSdkVersion);\n                Thread.currentThread().setContextClassLoader(cl);\n            }\n            RuntimeInit.zygoteInit(parsedArgs.targetSdkVersion, parsedArgs.remainingArgs, cl);//2\n        }\n    }\n\n```\n- SystemServer进程是复制了Zygote进程的地址空间，因此也会得到Zygote进程创建的Socket，这个Socket对于SyetemServer进程没有用处，因此，需要注释1处的代码来关闭该Socket。\n**frameworks/base/core/java/com/android/internal/os/RuntimeInit.java**\n```java\npublic static final void zygoteInit(int targetSdkVersion, String[] argv, ClassLoader classLoader)\n            throws ZygoteInit.MethodAndArgsCaller {\n        if (DEBUG) Slog.d(TAG, \"RuntimeInit: Starting application from zygote\");\n        Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, \"RuntimeInit\");\n        redirectLogStreams();\n        commonInit();\n        nativeZygoteInit();//1\n        applicationInit(targetSdkVersion, argv, classLoader);//2\n    }\n\n```\n\n\n## SyetemServer进程的工作\n1.启动Binder线程池，这样就可以与其他进程进行通信。\n2.创建SystemServiceManager用于对系统的服务进行创建、启动和生命周期管理。\n3.启动各种系统服务。\n\n- 核心服务：\n\t1. **Activity Manager**：管理应用生命周期。\n\t2. **Package Manager**：管理应用安装和卸载。\n\t3. **Power Manager**：管理设备电源状态。\n\t4. **Window Manager**：负责窗口和视图的渲染。\n\t5. **Sensor Service**：管理传感器。\n- 其他服务：\n\t- 蓝牙服务、通知管理、剪贴板服务、音频服务等。\n\n\n## **7. Boot Completed（启动完成）**\n\n- **发生时间**：系统服务全部启动后。\n- **功能**：\n    - 系统广播 `ACTION_BOOT_COMPLETED` 通知其他进程和应用启动完成。\n    - 设备显示主屏（Home Screen），用户可以开始交互。\n\n---\n\n## Launcher\n最后一步是启动一个Home应用程序, 叫做Launcher.\n\n显示系统中已经安装的应用程序, 用户可以通过点击这些快捷图标来启动相应的应用程序\n\n> 请求PackageManagerService返回系统中已经安装的应用程序的信息，并将这些信息封装成一个快捷图标列表显示在系统屏幕上\n\nSyetemServer进程在启动的过程中会启动PackageManagerService，PackageManagerService启动后会将系统中的应用程序安装完成。在此前已经启动的ActivityManagerService会将Launcher启动起来。\n\n**frameworks/base/services/java/com/android/server/SystemServer.java**\n```java\n private void startOtherServices() {\n ...\n  mActivityManagerService.systemReady(new Runnable() {\n            @Override\n            public void run() {\n                Slog.i(TAG, \"Making services ready\");\n                mSystemServiceManager.startBootPhase(\n                        SystemService.PHASE_ACTIVITY_MANAGER_READY);\n\n...\n}\n...\n}\n\n```\n**frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java**\n```java\npublic void systemReady(final Runnable goingCallback) {\n...\nsynchronized (this) {\n           ...\n            mStackSupervisor.resumeFocusedStackTopActivityLocked();\n            mUserController.sendUserSwitchBroadcastsLocked(-1, currentUserId);\n        }\n    }\n\n```\n\n详细的Launcher启动过程见: https://juejin.cn/post/6844903471645196302#heading-2\n## Thanks\nhttps://copperhead.co/blog/android-boot-process/\nhttps://juejin.cn/post/6844903470634369032\nhttps://juejin.cn/post/6844903470881832968\nhttps://juejin.cn/post/6844903471146074126\nhttps://juejin.cn/post/6844903471645196302\n\nChatGPT\n"
}
