整理 Android 手机,核心进程和线程情况
一、概括
系统启动架构图:
本文是从进程/线程的视角来分析该问题。
1.1 父进程
在所有进程中,以父进程的姿态存在的进程(即图中的浅红色项),如下:
kthreadd进程: 是所有内核进程的父进程
init进程 : 是所有用户进程的父进程(或者父父进程)
zygote进程 : 是所有上层Java进程的父进程,另外zygote的父进程是init进程。
1.2 重量级进程
在Android进程中,有3个非常重要的进程(即图中的深紫色项),如下:
system_server:是由zygote孵化而来的,是zygote的首席大弟子,托起整个Java framework的所有service,比如ActivityManagerService, PowerManagerService等等。
mediaserver:是由init孵化而来的,托起整个C++ framework的所有service,比如AudioFlinger, MediaPlayerService等等。
servicemanager:是由init孵化而来的,是整个Binder架构(IPC)的大管家,所有大大小小的service都需要先请示servicemanager。
二、进程
Android进程从大类来划分,可分为内核进程和用户进程。
2.1 kthreadd子进程
kthreadd进程(2号进程),是Linux系统的内核进程,是所有内核进程的鼻祖。
由Kthreadd孵化出来的内核守护进程,这些进程位于系统启动架构图中的kernel的深蓝色块。下面列举常见的内核进程:
进程名
解释
ksoftirqd/0
kworkder/0:0H
migration/0
watchdog/0
binder
rcu_sched
perf
netns
rpm-smd
mpm
writeback
system
irq/261-msm_iom
mdss_dsi_event
kgsl-events
spi
therm_core:noti
msm_thermal:hot
...
...
内核进程都不存在子进程与子线程,并且所有内核进程的用户都是root.
每个内核进程的作用,后续再补上
2.2 init子进程
init进程(1号进程),是Linux系统的用户空间进程,或者说是Android的第一个用户空间进程。
下面列举常见的由init进程孵化而来的用户进程:
进程名
进程文件
作用
zygote
/system/bin/app_process
Java界的第一个进程,分32位和64位
servicemanager
/system/bin/servicemanager
Binder的守护进程
media
/system/bin/mediaserver
多媒体服务的进程
ueventd
/sbin/ueventd
uevent守护进程
healthd
/sbin/healthd
电池的守护进程
logd
/system/bin/logd
log的守护进程
adbd
/sbin/adbd
adbd进程(Socket IPC)
lmkd
/system/bin/lmkd
lowmemorykiller守护进程
console
/system/bin/sh
控制台
vold
/system/bin/vold
volume守护进程
netd
/system/bin/netd
network守护进程
debuggerd
/system/bin/debuggerd
用于调试程序异常退出
debuggerd64
/system/bin/debuggerd64
用于调试程序异常退出
ril-daemon
/system/bin/rild
Radio Interface Layer的守护进程
installd
/system/bin/installd
安装的守护进程
surfaceflinger
/system/bin/surfaceflinger
UI帧相关的进程
...
...
servicemanager,作为Binder架构的一个大管家,所有注册服务、获取服务,都需要经过servicemanager,更多关于servicemanager查看Binder系列文章。
2.3 Zygote子进程
Zygote本身是一个Native的应用程序,刚开始的名字为“app_process”,运行过程中,通过系统调用将自己名字改为Zygote。是所有上层Java进程的父进程,android系统中还有另一个Zygote64进程,用于孵化64位的应用进程。
在图中的红色线,便是Zygote fork出来的进程,所有的App进程都是由Zygote fork产生的。
下面列举Zyogte进程孵化的部分子进程
进程名
解释
system_server
Java framework的各种services都依赖此进程
com.android.phone
电话应用进程
android.process.acore
通讯录进程
android.process.media
多媒体应用进程
com.android.settings
设置进程
com.android.wifi
Wifi应用进程
...
...
三、线程
3.1 Zygote 子线程
在adb shell终端,输入:
ps -t | grep -E "NAME| 497 "
解释: -E "NAME| 497 " 是输出时能多显示NAME的那一行,方便查看每一列代表的具体含义,497是Zygote的进程号。
共享父进程的地址空间的便是子线程,即VSIZE必然相同,否则就是子进程,如下图: