Android中四种进程的重要顺序

本文详细介绍了Android系统的进程管理策略,包括前台进程、可见进程、次要服务、后台进程及空进程等不同类型的进程及其重要性排序。同时探讨了进程管理的不同策略,如何平衡应用启动速度与资源消耗。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前台进程(foreground)

目前正在屏幕上显示的进程和一些系统进程。举例来说,Dialer Storage,Google Search等系统进程就是前台进程;再举例来说,当你运行一个程序,如浏览器,当浏览器界面在前台显示时,浏览器属于前台进程(foreground),但一旦你按home回到主界面,浏览器就变成了后台程序(background)。 我们最不希望终止的进程就是前台进程

可见进程(visible)

可见进程是一些不在前台,但用户依然可见的进程,举个例来说:widget、输入法等,都属于visible。这部分进程虽然不在前台,但与我们的使用也密切相关,我们也不希望它们被终止(你肯定不希望时钟、天气,新闻等widget被终止,那它们将无法同步,你也不希望输入法被终止,否则你每次输入时都需要重新启动输入法)

次要服务(secondary server)

目前正在运行的一些服务(主要服务,如拨号等,是不可能被进程管理终止的,故这里只谈次要服务),举例来说:谷歌企业套件,Gmail内部存储,联系人内部存储等。这部分服务虽然属于次要服务,但很一些系统功能依然息息相关,我们时常需要用到它们,所以也太希望他们被终止

后台进程(hidden)

虽然用了hidden这个词,但实际即是后台进程(background),就是我们通常意义上理解的启动后被切换到后台的进程,如浏览器,阅读器等。当程序显示在屏幕上时,他所运行的进程即为前台进程(foreground),一旦我们按home返回主界面(注意是按home,不是按back),程序就驻留在后台,成为后台进程(background)。

后台进程的管理策略有多种

有较为积极的方式,一旦程序到达后台立即终止,这种方式会提高程序的运行速度,但无法加速程序的再次启动;也有较消极的方式,尽可能多的保留后台程序,虽然可能会影响到单个程序的运行速度,但在再次启动已启动的程序时,速度会有所提升。这里就需要用户根据自己的使用习惯找到一个平衡点

内容供应节点(content provider)

没有程序实体,仅仅提供内容供别的程序去用的,比如日历供应节点,邮件供应节点等。在终止进程时,这类程序应该有较高的优先权 

空进程(empty)

没有任何东西在内运行的进程,有些程序,比如BTE,在程序退出后,依然会在进程中驻留一个空进程,这个进程里没有任何数据在运行,作用往往是提高该程序下次的启动速度或者记录程序的一些历史信息。 这部分进程无疑是应该最先终止的。

补充

系统会对进程的重要性进行评估,并将重要性以“oom_adj”这个数值表示出来,赋予各个进程;(系统会根据“oom_adj”来判断需要结束哪些进程,一般来说,“oom_adj”的值越大,该进程被系统选中终止的可能就越高)

前台程序的“oom_adj”值为0,这意味着它不会被系统终止,一旦它不可访问后,会获得个更高的“oom_adj”,推测“oom_adj”的值是根据软件在LRU列表中的位置所决定的; Android不同于Linux,有一套自己独特的进程管理模块,这个模块有更强的可定制性,可根据“oom_adj”值的范围来决定进程管理策略,比如可以设定“当内存小于X时,结束“oom_adj”大于Y的进程”。这给了进程管理脚本的编写以更多的选择。

结论

重要性依次是:前台进程,可见进程,服务进程,后台进程和空进程;所以销毁的顺序是逆方向
<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、付费专栏及课程。

余额充值