Init进程启动 —Zygote进程启动 —SystemServer进程启动 —Launcher启动Init 进程启动BootROM电源按下时执行固化代码ROM将 BootLoader 加载到 RAM。BootLoader将 Linux 内核加载到内存并启动。Linux Kernel完成缓存、驱动、根文件系统等初始化然后在用户空间启动第一个进程init。init 进程创建和挂载启动所需的文件目录例如 /dev 设备节点 /proc 进程信息等虚拟文件系统。初始化和启动属性服务一种全局键值对配置机制可以看做Windows的注册表记录用户、软件的一些使用信息即使系统、软件重启也能够根据记录进行相应的初始化。解析Init.rc配置文件并启动Zygote进程Zygote 进程启动1. init 启动 ZygoteAndroid 启动过程中init会解析init.rc配置文件在启动脚本里会定义zygote服务 找到service zygote配置节执行对应的可执行文件/system/bin/app_process并传入特定的参数-Xzygote /system/bin --zygote --start-system-serverinit根据这个配置 forkZygote2. app_process 进入 ZygoteInit native层zygote服务对应的可执行入口通常是app_process对应app_main文件app_process的main()函数中创建AndroidRuntime实例调用start()方法启动 Dalvik / ART 虚拟机。注册 JNI 函数register_jni_procs。通过 JNI 调用ZygoteInit.java的main()方法由Java语言编写之前为C/C从Native层进入Java框架层。3. Zygote 初始化Java 层ZygoteInit.main()核心工作注册 Zygote 的 Socket 服务端/dev/socket/zygote用于接收 AMS 的 fork 请求。预加载系统资源耗时但一次完成所有子进程共享预加载类preloadClasses读取preloaded-classes文件预加载资源preloadResourcesframework-res.apk预加载 OpenGL、WebView、系统库等。启动SystemServer通过forkSystemServer()创建子进程运行系统核心服务如 AMS、PMS。4. 进入循环监听ZygoteInit.main()完成上述工作后Zygote调用runSelectLoop()进入无限循环。通过 Socket 监听 AMS 发来的 fork 请求,为后续应用进程的创建做好准备。调用Zygote.forkAndSpecialize()克隆自身然后在新进程中执行目标应用的main()方法如ActivityThread.main()。SystemServer 进程启动1. 进程创建Zygote 中 forkSystemServer()ZygoteInit 在完成预加载后通过forkSystemServer()创建子进程。(底层是fork())子进程初始化关闭Zygote进程继承的Socket调用handleSystemServerProcess():启动 Binder 线程池进入SystemServer的main方法2. 入口函数SystemServer.main()首先设置当前进程名Process.setArgV0(system_server)。配置环境准备系统时间、语言、设置虚拟机低内存阈值、加载 动态库libandroid_servers.so。创建SystemServiceManager对系统服务进行创建、启动和生命周期管理启动系统服务分为三个类别在run()中先启动引导服务startBootstrapServices()这些服务之间依赖较少启动较早Installer系统安装APK时的服务类完成之后才能启动其他服务启动ActivityManagerService、PowerManagerService、PackageManagerService等服务。启动核心服务startCoreServices()BatteryService电池管理服务、WebViewUpdateService等。启动其他服务startOtherServices()如输入法、定位管理等服务最后调用AMS.systemReady()完成启动Launcher3. 进入消息循环最后调用Looper.loop()进入消息循环持续处理系统级 Binder 调用和内部消息。Launcher 启动系统启动的最后一步是启动一个应用程序用来显示系统中已经安装的应用程序这个应用程序就叫做Launcher两个功能作为 Android 系统的启动器用于启动应用程序作为 Android 系统的桌面用于显示和管理应用程序的快捷图标或者其他桌面组件触发SystemServer在startOtherServices()方法最后调用AMS.systemReady()标志着系统核心服务已就绪开始启动用户可见界面。构建 IntentAMS.systemReady()内部执行startHomeOnAllDisplays()创建隐式 IntentACTION_MAINCATEGORY_HOME从PackageManagerService查询匹配的 Launcher 组件。创建进程AMS 向 Zygote 发送 fork 请求Zygote fork出 Launcher 子进程并调用ActivityThread.main()初始化主线程最终执行Launcher的onCreate()加载桌面布局。。界面加载Launcher的Activity完成布局渲染后用户可见桌面图标及小部件系统启动流程至此完成从Init进程到Launcher启动init进程→Zygote进程→forkSystemServer→SystemServer.main()→startBootstrapServices()启动AMS、PMS等→startOtherServices()→AMS.systemReady()→startHomeActivityLocked()→ 构建CATEGORY_HOME Intent → Zygote fork Launcher进程 → Launcher.onCreate()加载应用列表并显示桌面。