Android 7系统休眠唤醒(二)开机全链路—Boot ROM到Launcher
系列目录第一篇电源管理架构全景图 |第二篇开机全链路—BootROM到Launcher| 第三篇关机/重启全链路—ShutdownThread到kernel_power_off | 第四篇休眠唤醒与开关机—核心差异深度对比 | 第五篇休眠全链路—PMS到Kernel Suspend | 第六篇唤醒全链路—Kernel Resume到屏幕点亮 | 第七篇内核层—wakelock与autosleep机制 | 第八篇内核层—Alarm定时唤醒与硬件唤醒源 | 第九篇Native层—libsuspend与Power HAL | 第十篇实战调试与问题排查一、为什么要理解开机流程要理解休眠唤醒为什么快必须先理解正常开机有多慢。开机流程是一套从零开始重建整个世界的完整链路涵盖硬件初始化、内核启动、用户空间进程孵化、系统服务启动、应用启动等六大阶段。当你遇到以下问题时理解开机流程是关键“为什么开机要 30 秒以上”——ZygoteInit.preloadClasses()需要从/system/etc/preloaded-classes预加载数千个类这是最耗时的单步操作“为什么某些系统服务在开机后不可用”——该服务可能在startBootstrapServices阶段创建但在systemReady()阶段才完全就绪“为什么 BOOT_COMPLETED 广播收到时某些服务还没初始化完”——BOOT_COMPLETED在AMS.systemReady()中发送但startOtherServices中的服务可能尚未完成systemReady()二、开机流程全景概览Android 开机可划分为六个阶段每个阶段依赖于前一阶段的完成形成严格的串行依赖链BootROM → BootLoader → Linux Kernel → init → Zygote → SystemServer → Launcher (硬件) (硬件) (内核) (init) (Java孵化) (框架服务) (桌面)三、阶段一BootROM — 芯片上电的第一段代码BootROM 是固化在 SoC 内部 ROM 中的代码不可修改上电后由硬件自动执行。它的职责非常单一初始化最基本的硬件时钟、栈指针、少量 SRAM从预设的存储介质eMMC / UFS / NAND中加载 BootLoader 的第一阶段SPLSecondary Program Loader到内部 SRAM验证 SPL 的签名secure boot 使能时跳转到 SPL 执行BootROM 代码由芯片厂商提供不在 AOSP 开源范围内。不同 SoC 厂商实现差异很大但职责相同。四、阶段二BootLoader — 板级初始化与内核加载4.1 LK (Little Kernel) 与 U-BootAndroid 设备常见的 BootLoader 有两种LK (Little Kernel)高通、MTK 等多数厂商使用U-Boot部分芯片厂商或开发板使用以 LK 为例源码路径bootable/bootloader/lk/LK 的核心启动路径_start (arch/arm/crt0.S) → kmain() (kernel/main.c) → platform_early_init() — 板级早期初始化时钟、DDR、UART → apps_init() — 启动 LK 内建应用 → aboot_init() (app/aboot/aboot.c) → boot_linux() — 加载并启动 Linux 内核4.2 boot.img 的结构BootLoader 需要从存储分区中读取boot.img。Android 的boot.img包含三部分----------------- | boot header | 页大小、kernel大小、ramdisk大小等元信息 ----------------- | kernel | 压缩后的 Linux 内核镜像 (Image.gz) ----------------- | ramdisk | cpio/gzip 压缩的初始根文件系统 ----------------- | dtb (可选) | Device Tree Blob硬件描述信息 -----------------源码路径system/core/mkbootimg/mkbootimg.c4.3 加载内核LK 的boot_linux()函数完成将 kernel 解压到内存指定位置将 ramdisk 加载到内存设置内核启动参数cmdline如consolettyMSM0、androidboot.hardwareqcom等设置 ATAGs 或 Device Tree跳转到内核入口点交出控制权五、阶段三Linux Kernel 启动5.1 内核启动流程内核入口为架构相关的汇编代码arch/arm/kernel/head.SARM32或arch/arm64/kernel/head.SARM64。核心 C 入口源码路径init/main.cstart_kernel() → setup_arch() — 架构相关初始化解析 Device Tree → mm_init() — 内存管理子系统初始化 → sched_init() — 调度器初始化 → init_IRQ() — 中断子系统初始化 → console_init() — 控制台初始化 → rest_init() → kernel_thread(kernel_init) — 创建 init 内核线程 → kernel_thread(kthreadd) — 创建内核守护线程 → cpu_startup_entry() — 进入 idle loop5.2 kernel_init — 挂载根文件系统并启动 initkernel_init()的核心工作do_basic_setup()— 初始化设备驱动模型、加载内建驱动挂载根文件系统通常是从 ramdisk 挂载执行/init——这是用户空间的第一个进程PID 1关键kernel_init启动/init后控制权正式从内核态转移到用户态。此时内核已完成全部初始化但用户空间的进程、服务、ART 虚拟机都还未创建。六、阶段四init 进程 — 用户空间的创世进程6.1 init 入口源码路径system/core/init/init.cppinit 进程的核心职责挂载基础文件系统/proc、/sys、/dev、/dev/pts创建/dev/kmsg并重定向标准输入输出初始化属性服务property_service解析init.rc配置文件按阶段执行on early-init/on init/on late-init/on boot进入事件循环监听 property 变化、子进程退出等6.2 init.rc — 系统初始化的剧本源码路径system/core/rootdir/init.rcinit.rc使用 Android Init LanguageAIL编写定义了系统启动的完整蓝图on early-init— 设置内核参数、启动 ueventdon init— 创建目录结构、设置文件权限和 SELinux 上下文、挂载文件系统on late-init— 串行触发trigger early-fs— 挂载早期文件系统trigger fs— 挂载主要文件系统trigger post-fs— 文件系统就绪后的初始化trigger post-fs-data— /data 分区可写后的初始化trigger load_system_props_action— 加载系统属性trigger boot— 进入 boot 阶段on boot— 启动核心守护进程servicemanager、vold、surfaceflinger、netd、logd、healthd、installd、mediaserver等6.3 属性服务属性系统是 Android 进程间共享配置的关键机制源码路径system/core/init/property_service.cpp属性以 key-value 形式存储key 前缀决定权限ro.只读persist.持久化属性变更可触发 init.rc 中的触发器关键属性示例ro.boot.hardware硬件平台、sys.boot_completed启动完成标志、ro.build.version.sdkSDK 版本七、阶段五Zygote — Java 世界的孵化器7.1 Zygote 的设计思想Zygote 是 Android 中几乎所有 Java 进程的父进程。它先预加载常用类和资源然后通过 fork 创建新进程。利用 COWCopy-on-Write机制子进程共享预加载的内存页大幅减少启动开销。7.2 Zygote 启动Zygote 在 init.rc 中定义源码路径system/core/rootdir/init.zygote32.rcservice zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-serverapp_process入口源码路径frameworks/base/cmds/app_process/app_main.cppintmain(intargc,char*constargv[]){AppRuntimeruntime(argv[0],computeArgBlockSize(argc,argv));if(strcmp(arg,--zygote)0){runtime.start(com.android.internal.os.ZygoteInit,args,zygote);}}关键设计AppRuntime继承自AndroidRuntimeruntime.start()内部启动 ART 虚拟机然后通过 JNI 回调到 Java 层的ZygoteInit.main()——这是 C 到 Java 世界的关键跨越点。AndroidRuntime.start()启动 ART 虚拟机并调用ZygoteInit.main()源码路径frameworks/base/core/jni/AndroidRuntime.cpp7.3 ZygoteInit.main() — 核心初始化源码路径frameworks/base/core/java/com/android/internal/os/ZygoteInit.javapublicclassZygoteInit{publicstaticvoidmain(String[]argv){// 1. 创建 zygote socket监听 AMS 的 fork 请求registerZygoteSocket(socketName);// 2. 预加载最耗时的阶段preloadClasses();// 从 /system/etc/preloaded-classes 加载数千个类preloadResources();// 系统资源主题、颜色、字符串preloadOpenGL();// EGL/OpenGL 共享库// 3. fork SystemServer 进程if(argv[1].equals(start-system-server)){startSystemServer(abiList,socketName);}// 4. 进入事件循环等待 AMS 的 fork 请求runSelectLoop(abiList);}}关键设计preloadClasses()是最耗时的单步操作——它需要加载数千个 Java 类。但正是因为 Zygote 在 fork 前完成预加载每个 App 进程启动时无需重复这个过程利用 COW 机制共享内存页启动时间从数秒降至数百毫秒。八、阶段六SystemServer — 框架服务的总管家8.1 fork SystemServer源码路径frameworks/base/core/java/com/android/internal/os/ZygoteInit.javaZygote 通过Zygote.forkSystemServer()创建 SystemServer 进程子进程执行handleSystemServerProcess()最终调用SystemServer.main()。8.2 SystemServer.run() — 三阶段启动源码路径frameworks/base/services/java/com/android/server/SystemServer.javapublicfinalclassSystemServer{privatevoidrun(){Looper.prepareMainLooper();System.loadLibrary(android_servers);createSystemContext();startBootstrapServices();// 第一阶段引导服务startCoreServices();// 第二阶段核心服务startOtherServices();// 第三阶段其他服务Looper.loop();}}关键设计三阶段启动确保服务间的依赖关系——startBootstrapServices创建 AMS/PMS/PKMS 等基础服务startCoreServices创建依赖它们的服务startOtherServices创建所有剩余服务。任何阶段的服务创建失败都会导致后续阶段无法启动。8.3 startBootstrapServices() — 引导服务最基础的服务后续服务依赖它们服务功能源码路径Installer与 installd 通信负责 APK 安装frameworks/base/services/core/java/com/android/server/pm/Installer.javaActivityManagerService四大组件管理、进程管理frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.javaPowerManagerService功耗管理、休眠唤醒状态机frameworks/base/services/core/java/com/android/server/power/PowerManagerService.javaLightsService通知灯、背光灯控制frameworks/base/services/core/java/com/android/server/lights/LightsService.javaDisplayManagerService显示设备管理frameworks/base/services/core/java/com/android/server/display/DisplayManagerService.javaPackageManagerService包管理、权限管理frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.javaUserManagerService多用户管理frameworks/base/services/core/java/com/android/server/pm/UserManagerService.javaAMS 和 PKMS 此时创建但尚未完全就绪systemReady()在第三阶段调用。8.4 startCoreServices() — 核心服务服务功能源码路径BatteryService电池状态监测frameworks/base/services/core/java/com/android/server/BatteryService.javaUsageStatsService应用使用统计frameworks/base/services/core/java/com/android/server/usage/UsageStatsService.javaWebViewUpdateServiceWebView 组件更新frameworks/base/services/core/java/com/android/server/webkit/WebViewUpdateService.java8.5 startOtherServices() — 其他服务所有剩余服务在此阶段启动主要包括服务功能源码路径WindowManagerService窗口管理、输入事件分发frameworks/base/services/core/java/com/android/server/wm/WindowManagerService.javaConnectivityService网络连接管理frameworks/base/services/core/java/com/android/server/ConnectivityService.javaAlarmManagerServiceAlarm 定时器管理frameworks/base/services/core/java/com/android/server/AlarmManagerService.javaNotificationManagerService通知管理frameworks/base/services/core/java/com/android/server/notification/NotificationManagerService.javaBluetoothService蓝牙管理frameworks/base/services/core/java/com/android/server/BluetoothManagerService.javaInputMethodManagerService输入法管理frameworks/base/services/core/java/com/android/server/InputMethodManagerService.javaAudioService音频管理frameworks/base/services/core/java/com/android/server/audio/AudioService.java8.6 systemReady() 回调链所有服务创建后依次调用systemReady()AMS.systemReady()— 启动 Launcher、恢复栈顶 Activity、发送BOOT_COMPLETED广播PKMS.systemReady()— 完成待处理的包操作WMS.systemReady()— 显示系统 UIPMS.systemReady()— 初始化完成启用自动休眠九、Launcher 启动 — 用户可见的第一屏源码路径frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.javaAMS 在systemReady()中调用startHomeActivityLocked()启动 LauncherbooleanstartHomeActivityLocked(intuserId,Stringreason){IntentintentgetHomeIntent();// 构造 Intent.CATEGORY_HOMEActivityInfoaInforesolveActivityInfo(intent,...);// 启动 Launcher 的 main ActivitymActivityStarter.startHomeActivityLocked(intent,aInfo,reason);}Launcher 启动后AMS 发送Intent.ACTION_BOOT_COMPLETED广播——这是 App 开发者可接收的开机完成信号。关键设计BOOT_COMPLETED广播在 Launcher 启动后才发送但此时startOtherServices中的部分服务可能尚未完成systemReady()。对于需要在开机后立即执行的任务注册BOOT_COMPLETED广播是最可靠的时机而非依赖 Launcher 的可见性。十、开机流程完整时序图时间 → BootROM (硬编码上电自动执行) │ ▼ BootLoader (LK/U-Boot) │ 初始化 DDR、UART、存储 │ 加载 boot.img → kernel ramdisk │ ▼ Linux Kernel (start_kernel) │ 架构初始化、内存管理、调度器、中断 │ 挂载 ramdisk → 执行 /init │ ▼ init 进程 (PID 1) │ 解析 init.rc按阶段执行 │ 启动 servicemanager、vold、surfaceflinger 等守护进程 │ ▼ Zygote (app_process) │ 启动 ART预加载类/资源/共享库 │ fork SystemServer 进程 │ ▼ SystemServer │ startBootstrapServices → AMS, PMS, PKMS... │ startCoreServices → BatteryService... │ startOtherServices → WMS, Bluetooth, Telephony... │ systemReady() → 启动 Launcher │ ▼ Launcher 启动 → BOOT_COMPLETED 广播 → 用户可操作十一、关键源码文件索引文件路径本文涉及内容init.cppsystem/core/init/init 进程入口、属性服务init.rcsystem/core/rootdir/系统初始化脚本app_main.cppframeworks/base/cmds/app_process/Zygote 入口ZygoteInit.javaframeworks/base/core/java/com/android/internal/os/预加载类、fork SystemServerSystemServer.javaframeworks/base/services/java/com/android/server/三阶段服务启动ActivityManagerService.javaframeworks/base/services/core/java/com/android/server/am/Launcher 启动、BOOT_COMPLETED十二、小结开机流程本质上是一个全量初始化的过程。从 BootROM 的第一条指令到 Launcher 显示桌面中间经历了多层抽象、数十个进程的创建、上百个系统服务的初始化。阶段核心工作耗时占比BootROM → BootLoader硬件初始化、加载内核~5%Kernel 启动架构初始化、驱动加载~10%init 进程解析 init.rc、启动守护进程~10%Zygote预加载类/资源最耗时~30%SystemServer启动上百个系统服务~40%Launcher启动桌面~5%这一过程之所以漫长核心原因在于状态必须从零开始重建——每一个数据结构、每一个内存映射、每一个服务状态都必须从配置文件或持久化存储中重新加载并初始化。理解这一点之后再看休眠唤醒就会发现休眠唤醒的快本质上是因为跳过了这整个重建过程——内核保持初始化完成的状态、进程只被冻结而非杀死、ART 虚拟机堆内存完整保留、系统服务无需重新启动。下一篇Android 7系统休眠唤醒三关机/重启全链路—ShutdownThread到kernel_power_off — 如果开机是从零开始重建世界关机就是有秩序地拆除这个世界。关机流程与开机形成镜像完成全量销毁的闭环。

相关新闻

Unity插件合集实战指南:从工具选型到高效集成的全流程解析

Unity插件合集实战指南:从工具选型到高效集成的全流程解析

1. 项目概述:一个Unity开发者的“瑞士军刀”工具箱如果你是一个Unity开发者,无论是刚入门的新手,还是已经奋战多年的老兵,我相信你都经历过这样的时刻:为了实现一个看似简单的功能,比如让角色平滑地上下斜坡…

2026/7/24 1:14:51 阅读更多 →
大模型部署实战:从蒸馏技术到完整工程生态的VRAM优化方案

大模型部署实战:从蒸馏技术到完整工程生态的VRAM优化方案

最近大模型圈有个很有意思的现象:大家都在讨论"蒸馏"技术,好像谁掌握了蒸馏谁就能在开源大模型领域称王。但Stability AI创始人Emad最近的观点却给我们泼了一盆冷水——蒸馏只是开源优势的冰山一角,真正让西方开源实验室领先的&…

2026/7/24 1:13:51 阅读更多 →
计算机毕业设计之基于C#的车辆管理系统的设计与实现

计算机毕业设计之基于C#的车辆管理系统的设计与实现

随着中国经济的发展,人民的生活质量逐渐提高,于是对网络的依赖性也越来越高,通过网络处理的事务越来越多。特别是随着移动互联网与大数据时代的到来,更是让人们随时享受着网络和新技术给带来了前所未有的用户体验,但是…

2026/7/24 1:13:50 阅读更多 →

最新新闻

LVDS接口PCB布局布线实战:从信号完整性基础到高速设计要点

LVDS接口PCB布局布线实战:从信号完整性基础到高速设计要点

1. 项目概述与核心挑战在高速数字电路设计的江湖里,信号完整性(SI)是决定一个系统成败的“内功心法”。我接触过不少项目,从早期的百兆以太网到如今动辄数Gbps的SerDes接口,一个深刻的体会是:原理图设计只是…

2026/7/24 1:23:53 阅读更多 →
具身交互智能数字人×青年大学习:红厅智播系统从配置到上线

具身交互智能数字人×青年大学习:红厅智播系统从配置到上线

本文分享了基于具身交互智能数字人技术,为青年大学习打造AI数字人宣讲平台"红厅智播"的完整实战经验。从魔珐星云控制台配置数字人形象、音色、场景,到编写青年大学习SSML宣讲脚本,再到搭建Flask网站嵌入生成视频,全流程…

2026/7/24 1:23:53 阅读更多 →
TPS53311EVM-561主从同步降压转换器评估模块深度解析与应用指南

TPS53311EVM-561主从同步降压转换器评估模块深度解析与应用指南

1. 项目概述与核心价值在嵌入式系统、网络设备和服务器主板的电源设计中,工程师们常常面临一个经典难题:如何在有限的空间内,为多个核心负载(如CPU内核、内存、I/O芯片组)提供高效、稳定且低噪声的电源轨。传统的多路独…

2026/7/24 1:23:53 阅读更多 →
基于GEE与无监督聚类的武汉水体识别技术

基于GEE与无监督聚类的武汉水体识别技术

1. 项目背景与核心思路武汉作为长江经济带核心城市,其水体分布监测对城市规划、生态保护和水资源管理具有重要意义。传统水体识别方法通常依赖单一光谱指数(如NDWI)或监督分类,存在季节性变化敏感、人工标注成本高等痛点。本项目创…

2026/7/24 1:23:53 阅读更多 →
MSPM0L时钟系统实战:从架构解析到低功耗配置与调试

MSPM0L时钟系统实战:从架构解析到低功耗配置与调试

1. 项目概述与核心价值在嵌入式开发,尤其是基于MSPM0L这类低功耗MCU的项目里,时钟配置往往是项目启动后第一个需要啃下的硬骨头。很多开发者,尤其是刚从标准库或HAL库转向直接操作寄存器的新手,面对数据手册里复杂的时钟树和一堆缩…

2026/7/24 1:23:53 阅读更多 →
IDCNN模型在命名实体识别中的高效应用与优化

IDCNN模型在命名实体识别中的高效应用与优化

1. IDCNN模型在NER任务中的核心价值命名实体识别(NER)作为自然语言处理的基础任务,其核心挑战在于如何有效捕捉文本中的长距离依赖关系。传统CNN模型受限于固定感受野,在处理这类问题时往往力不从心。IDCNN(Iterated D…

2026/7/24 1:22:53 阅读更多 →

日新闻

用Highcharts 创建可拖拽三维散点立方体3D图表

用Highcharts 创建可拖拽三维散点立方体3D图表

该案例基于Highcharts scatter3d 三维散点图实现空间立方体散点可视化,核心特色:三维 X/Y/Z 三轴空间,所有散点分布在 0~10 立方体空间内;散点使用径向渐变实现立体 3D 圆球质感;支持鼠标 / 触屏拖拽画布,…

2026/7/24 0:00:29 阅读更多 →
AppCertDlls:进程创建路径上的 DLL 入口

AppCertDlls:进程创建路径上的 DLL 入口

AppCertDlls:进程创建路径上的 DLL 入口 AppCertDlls 位于 HKLM\System\CurrentControlSet\Control\Session Manager\AppCertDlls。本文的程序功能是只读列出这个键在 64 位和 32 位注册表视图中的全部值,并显示每条值的来源、名称、类型和可安全显示的数…

2026/7/24 0:00:29 阅读更多 →
我的编程之路:第一篇博客

我的编程之路:第一篇博客

大家好,我是一名编程初学者,同时这也是我编程学习之路上的第一篇博客。在这里,我想要向大家介绍我的一些想法和规划。a.自我介绍我是一个刚刚接触编程的新手,目前在学习c语言,我对编程世界充满了强烈的好奇。当然&…

2026/7/24 0:00:29 阅读更多 →

周新闻

Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/22 8:58:19 阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/24 1:23:39 阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/23 17:49:47 阅读更多 →

月新闻