android lmkd启动过程,Android启动过程

本篇文章主要对于Android启动过程做简单介绍,之前从网上看到两张比较清晰,一目了然的图片,可以更好的了解Android系统的全貌,在此整合梳理划重点并和大家一起分享

0686e27f60b9

上图是以进程的视角分层来诠释系统的启动过程,启动过程由下往上,下面开始划重点:

swapper进程:

该进程又称为idle进程, 系统初始化过程Kernel由无到有开创的第一个进程, 用于初始化进程管理、内存管理,加载Display Driver ,Camera Driver,Binder Driver等相关工作;

kthreadd进程:

kthreadd进程是所有内核进程的鼻祖

kthreadd进程会创建内核工作线程kworkder,软中断线程ksoftirqd,thermal等内核守护进程

init进程:

init进程是所有用户进程的鼻祖

init进程fork出多个用户守护进程

- 如 mountd:设备安装 Daemon,负责设备安装及状态通知

- debuggerd:启动 debug system,处理调试进程的请求

- rild:启动 radio interface layer daemon 服务,处理电话相关的事件和请求

- ueventd、logd、healthd、installd、adbd、lmkd等;

init进程启动ServiceManager(binder服务管家)、bootanim(开机动画)等重要服务;

init进程fork出Zygote进程,即进程孵化器,启动 Android Java Runtime 和启动 systemserver,负责 Android 应用进程的孵化工作

init进程fork出Media Server进程(包含AudioFlinger,MediaPlayerService, Camera Service等服务,负责多媒体播放相关的功能,包括音视频解码)

Zygote进程:

Zygote进程是Android系统的第一个Java进程(即虚拟机进程),是所有Java进程的父进程。

Zygote进程fork出System Server进程;

所有的App进程都是由Zygote进程fork生成的;

Zygote进程孵化出的第一个App进程是Launcher(桌面App);

System Server进程:

System Server进程是Zygote fork的第一个进程。

System Server负责启动和管理整个Java framework,包含ActivityManagerService,PowerManagerService, WindowManagerService等服务.

通过对上述进程的了解,我们根据下面这张图再对具体启动过程做下补充和梳理

0686e27f60b9

Boot ROM: 当手机处于关机状态时,长按Power键开机,引导芯片开始从固化在ROM里的预设代码开始执行,然后加载引导程序到RAM;

Boot Loader:系统启动加载器,就是启动Android系统之前的引导程序, 它类似于 BIOS(Basic Input/Output System),在系统加载前,用于检查RAM,初始化硬件设备,建立内存空间的映像图,为最终调用系统内核准备好环境

Boot Loader会读取 ROM 找到操作系统并将 Linux 内核加载到 RAM 中。

对于ROM, 主要有以下几个分区:

/boot:存放引导程序,包括内核和内存操作程序

/system:存放Android系统及系统应用

/recovery:恢复分区,可以进入该分区进行系统恢复

/data:用户数据区,包含了用户的数据:联系人、短信、设置、用户安装的程序

/cache:安卓系统缓存区,保存系统最常访问的数据和应用程序

/misc:包含一些杂项内容,如系统设置和系统功能启用禁用设置

/sdcard:用户自己的存储区,可以存放照片,音乐,视频等文件

当Linux 内核启动后会初始化各种软硬件环境,加载驱动程序,挂载根文件系统,Linux 内核加载的最后阶段会启动执行第一个用户空间进程 init 进程

init进程fork其他进程是通过解析init.rc文件生成的,其中init.rc文件是 Android 系统的重要配置文件,位于 /system/core/rootdir/ 目录中。

其中SurfaceFlinger进程 也是init进程创建的,负责图像绘制,是应用 UI 的核心,其功能是合成所有 Surface 并渲染到显示设备。SurfaceFlinger 进程主要是启动 FrameBuffer,初始化显示系统。

<think>好的,我现在需要回答用户关于Android用户态进程启动顺序的问题。首先,我得回忆一下Android系统的启动流程,特别是用户态进程的部分。我记得Android启动过程大致分为几个阶段,比如Bootloader、Kernel启动、init进程、Zygote、系统服务等等,但用户态进程具体是怎么启动的呢? 用户问的是用户态进程的启动顺序,所以需要明确从内核启动完成之后,进入用户空间的部分。这时候,init进程应该是第一个用户态进程,对吧?因为Linux系统通常都是由init进程作为第一个用户进程,PID为1。Android可能也是类似的,但可能有自己的定制。 接下来,init进程会负责解析init.rc配置文件,启动各种守护进程和服务。这里可能需要详细说明init.rc的结构,以及各个阶段执行的动作。比如,早期阶段启动的服务可能包括ueventd、logd等底层服务,然后是Zygote进程的启动。 Zygote进程是Android中非常重要的部分,它负责孵化应用进程。我记得Zygote启动后会预加载类和资源,这样后续的应用启动可以更快。那么Zygote的启动是在init.rc中的哪个阶段呢?可能是在某个特定的触发条件之后,比如“zygote-start”这个触发器。 然后,Zygote会创建System Server进程,也就是系统服务进程。System Server会启动各种系统服务,比如ActivityManagerService、PackageManagerService等。这些服务应该是在System Server中逐个启动的,顺序可能有依赖关系,比如先启动基础服务,再启动其他服务。 用户态进程的启动顺序可能分为几个阶段:核心系统服务启动启动完成后的应用启动。比如,当系统服务都准备就绪后,会发送BOOT_COMPLETED广播,触发各种应用的启动,比如桌面Launcher、系统应用等。 不过,我需要确认这些步骤的正确顺序,是否有遗漏或者错误的地方。比如,是否还有其他重要的进程在init阶段启动,比如adbd(Android Debug Bridge Daemon)或者servicemanager(负责Binder通信的服务管理器)? 另外,关于Android启动阶段,可能有不同的运行级别(如early-init、init、early-fs、fs、post-fs等),每个阶段对应不同的服务和执行动作。比如,在early-init阶段可能挂载文件系统,启动关键守护进程;在post-fs阶段处理文件系统的权限设置等。 还有,像SurfaceFlinger这样的图形服务可能是在系统服务中启动的,属于比较早的部分,因为显示相关的基础服务需要尽早启动。而像MediaServer可能也是由init启动的独立进程。 需要整理出从init开始,按顺序启动的各个关键进程,并说明它们的作用。例如: 1. init进程启动,解析init.rc,执行各个阶段的命令。 2. 启动ueventd,负责设备节点的创建和权限设置。 3. 启动logd,日志系统。 4. 启动servicemanager,Binder IPC的核心组件。 5. 启动Zygote进程,分为主模式和WebView模式。 6. Zygote fork出System Server进程。 7. System Server启动各种服务,如Activity Manager、Power Manager等。 8. 系统服务启动完成后,启动Launcher应用。 9. 其他应用可能根据启动配置或广播被启动。 需要确保这个顺序是正确的,并且每个步骤的作用都解释清楚。可能还需要提到像bootanim(启动动画)进程的启动和终止时机,当系统服务准备好后,关闭启动动画。 此外,Android可能有不同的初始化语言,比如init.rc使用的是Android Init Language,它包含action、service、command等部分。不同的服务可能被不同的触发器启动,比如“on early-init”、“on init”、“on post-fs”等阶段。 可能还要提到安全相关的进程,比如keystore或者Gatekeeper,它们是否在早期启动? 总结起来,用户态进程的启动顺序大致是:init进程→关键守护进程(ueventd、logd、servicemanager)→Zygote→System Server→系统服务→Launcher和其他应用。需要详细描述每个步骤,并确保没有遗漏重要进程。 可能存在的疑问点:servicemanager是否由init启动?Zygote的启动触发条件是什么?System Server启动的具体服务顺序是否有官方文档支持? 需要查阅相关资料确认,比如Android官方文档或源码分析,确保回答的准确性。例如,init.rc中确实定义了启动zygote的服务,并可能在“zygote-start”触发时启动。而System Server的启动是由Zygote通过fork并执行SystemServer类开始的。 最后,回答的结构需要清晰,分步骤或分阶段介绍,每个阶段的关键进程及其作用,这样用户能够理解整个启动流程的顺序和逻辑。</think>Android 用户态进程的启动顺序是系统初始化的关键流程,大致分为以下几个阶段: --- ### 1. **Init 进程启动(PID=1)** - **作用**:首个用户态进程,解析启动脚本(`init.rc`),管理服务生命周期。 - **关键步骤**: - 挂载早期文件系统(如 `/dev`、`/proc`)。 - 启动 `ueventd` 守护进程,创建设备节点并设置权限。 - 启动 `logd` 日志服务。 --- ### 2. **核心服务启动(由 init.rc 触发)** - **`servicemanager`**: - **作用**:Binder IPC 的核心组件,管理跨进程通信。 - **启动阶段**:通常在 `init` 阶段的早期启动。 - **`healthd`**: - **作用**:电池状态监控。 - **`lmkd`(Low Memory Killer Daemon)**: - **作用**:内存不足时终止低优先级进程。 --- ### 3. **Zygote 进程孵化** - **启动条件**:`init.rc` 中定义的 `zygote-start` 触发器。 - **作用**: - 预加载 Java 类、资源(如主题、布局),提升应用启动速度。 - 分为 **主 Zygote**(`app_process`)和 **WebView Zygote**(专用于渲染 WebView)。 - **关键行为**: - 启动后监听 Socket,等待孵化新应用的请求。 --- ### 4. **System Server 进程启动** - **来源**:由 Zygote fork 并执行 `com.android.server.SystemServer`。 - **作用**:启动所有核心系统服务。 - **启动顺序**(依赖关系严格): 1. **引导服务**: - `ActivityManagerService`(AMS):管理应用生命周期。 - `PowerManagerService`:电源管理。 - `PackageManagerService`(PMS):应用安装与权限控制。 2. **核心服务**: - `WindowManagerService`(WMS):窗口管理。 - `DisplayManagerService`:显示设备管理。 3. **其他服务**: - `NotificationManagerService`:通知系统。 - `InputMethodManagerService`:输入法管理。 --- ### 5. **系统就绪与应用启动** - **阶段标志**:`SystemServer` 完成服务启动后发送 `BOOT_COMPLETED` 广播。 - **关键进程**: - **Launcher**:桌面应用,由 AMS 启动。 - **系统应用**:电话、短信等,通过 `Intent.ACTION_BOOT_COMPLETED` 自启。 - **后台服务**:账户同步、推送服务等。 --- ### 6. **守护进程与独立服务** - **独立进程**: - **`surfaceflinger`**:图形合成服务,由 `init` 直接启动。 - **`mediaserver`**:多媒体服务(音频、视频编解码)。 - **网络相关**: - `netd`:网络配置管理。 - `rild`:射频通信(电话模块)。 --- ### 启动流程图解 ```plaintext Bootloader → Kernel → Init → [ueventd, logd, servicemanager] → Zygote → System Server → [AMS, PMS, WMS...] → Launcher & Apps ``` --- ### 关键细节 - **安全隔离**:Zygote 通过 `fork` + `setuid` 隔离应用进程。 - **性能优化**:Zygote 的预加载机制减少应用启动开销。 - **依赖管理**:系统服务按层级启动,确保基础服务优先就绪。 如需深入分析特定服务(如 Binder 机制或系统服务依赖),可进一步探讨!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值