一、概括

系统启动架构图:

上图在Android系统-开篇中有讲解,是从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必然相同,否则就是子进程,如下图:

图中红色圈起来的便是子线程,其他都是子进程。

可见Zygote的子线程如下:

线程名 解释
ReferenceQueueD 引用队列的守护线程
FinalizerDaemon 析构的守护线程
FinalizerWatchd 析构监控的守护线程
HeapTrimmerDaem 堆整理的守护线程
GCDaemon 执行GC的守护线程

这5个线程都是与虚拟机息息相关的线程,之后所有由Zygote直接或间接孵化的子进程,都会包含这5个线程,那么就在其线程说明中,不再重复,而是以“用于GC”的字样来表示。后续有空会专门针对Android的虚拟机展开讨论。

3.2 system_server 子线程

Java Framework中的service都运行在system_server进程中,system_server内的子线程很多,统计了下自己身边的手机有system_server有122个线程。下面列举部分子线程:

线程名 解释
system_server 包含4个此同名线程
Heap thread poo 异步的HeapWorker, 包含5个
Signal Catcher 捕捉Kernel信号,比如SIGNAL_QUIT
JDWP 虚拟机调试的线程
ReferenceQueueD 用于GC
FinalizerDaemon 用于GC
FinalizerWatchd 用于GC
HeapTrimmerDaem 用于GC
GCDaemon 用于GC
Binder_ IPC线程, 包含16个
Thread_ 普通线程,包含若干个
AsyncTask # 异步任务,包含若干个
RenderThread 渲染线程,可以包含若干个
ActivityManager ActivityManagerService线程
PerformanaceCont system_server专有
FileObserver system_server专有
CpuTracker 统计进程CPU信息
PowerManagerSer system_server专有
PackageManager system_server专有
watchdog system_server专有
WifiMonitor system_server专有
UEventObserver system_server专有

ActivityManagerService线程是一个ServerThread线程。进程结构体task_struct的comm字段是一个长度为16的char型,故进程名最长为15个字符。

3.3 mediaserver 子线程

mediaserver 子线程,如下:

线程名
mediaserver
ApmTone
ApmAudio
ApmOutput
Safe Speaker Th
AudioOut_2
FastMixer
AudioOut_4
FastMixer
AudioOut_6
Binder_1
Binder_2

每个线程的作用,后续再补上

3.4 app 子线程

此处以settings为例

线程名 解释
com.android.settings settings进程
Heap thread poo 异步的HeapWorker, 包含5个
Signal Catcher 捕捉Kernel信号,比如SIGNAL_QUIT
JDWP 虚拟机调试的线程
ReferenceQueueD 用于GC
FinalizerDaemon 用于GC
FinalizerWatchd 用于GC
HeapTrimmerDaem 用于GC
GCDaemon 用于GC
Binder_1 用于IPC
Binder_2 用于IPC
pool-m-thread-n 线程池m中的第n个线程,包含若干个
AsyncTask #1 异常任务
RenderThread 会有若干个
WifiManager 管理wifi的线程

一般地,每个apk都会产生2或3个Binder线程,Apk运行的Activity或service都会产生2个Binder线程。

关于Binder问题

  • 主线程是由 Zygote母体生成的;
  • 线程池:首次创建第一个Binder线程A,然后监听BR_SPAWN_LOOPER事件,收到后创建第二个Binder线程B,线程B继续监听BR_SPAWN_LOOPER事件,收到后创建第三个Binder线程C。总共创建3个Bindr线程,这是Binder协议决定。根据系统处理器数目以及应用程序的负载强度,线程池的线程数目可以动态调整,这是Binder优化需要考虑的。

四、进程统计

下面以一台基于Android 5.1.1的手机为例,统计以“父进程”作为PPID的进程个数统计表:

父进程 个数 解释
0 2 分别为init, kthreadd
init 55 用户进程
kthreadd 303 内核进程
zygote64 41 64位zygote
zygote 3 32位zygote
qseecomd 1 高通安全执行环境
adbd 2 打开了2个adb窗口
sh 2 分别为ps, grep

图中zygote64/zygote/qseecomd/adbd的父进程都是init进程,而sh的父进程是adbd,而adb和qseecomd的父进程都是init进程。

手机总计:407个进程,1575个线程。(该数据仅供参考,让大家对手机当前的进程和线程的数量级有个大概的感观)

Android进程整理的更多相关文章

  1. 【朝花夕拾】Android性能篇之(六)Android进程管理机制

    前言        Android系统与其他操作系统有个很不一样的地方,就是其他操作系统尽可能移除不再活动的进程,从而尽可能保证多的内存空间,而Android系统却是反其道而行之,尽可能保留进程.An ...

  2. 理解Android进程创建流程(转)

    /frameworks/base/core/java/com/android/internal/os/ - ZygoteInit.java - ZygoteConnection.java - Runt ...

  3. Android进程永生技术终极揭秘:进程被杀底层原理、APP应对技巧

    1.引言 上个月在知乎上发表的由“袁辉辉”分享的关于TIM进程永生方面的文章(即时通讯网重新整理后的标题是:<史上最强Android保活思路:深入剖析腾讯TIM的进程永生技术>),短时间内 ...

  4. 【腾讯Bugly干货分享】Android进程保活招式大全

    本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/57ac4a0ea374c75371c08ce8 作者:腾讯——张兴华 目前市面上 ...

  5. Android进程间通讯

    最近研究了一下Android进程间通讯,原来只是会用,但是只是会用是不行滴,就来研究一下. 刚开始看的时候,我的头是这么大,看了一夜的时候,头就变成这样了,,吓得宝宝赶紧上床休息了,. 先喝喝茶讲个故 ...

  6. Android进程保活

    Android进程回收机制 Low Memory Killer原理 微信团队原创分享:Android版微信后台保活实战分享(网络保活篇) 微信团队原创分享:Android版微信后台保活实战分享(进程保 ...

  7. Android 进程常驻(使用第三方MarsDaemon)(虽然不可用,但是还是保留下。)

    github地址: https://github.com/Marswin/MarsDaemon 原理分析: Android 进程常驻(0)----MarsDaemon使用说明 Android 进程常驻 ...

  8. Android 进程常驻----开机广播的简单守护以及总结

    这是一个轻量级的库,配置几行代码,就可以实现在Android上实现进程常驻,也就是在系统强杀下,以及360获取root权限下,clean master获取root权限下都无法杀死进程 支持系统2.3到 ...

  9. Android进程间的通信之AIDL

    Android服务被设计用来执行很多操作,比如说,可以执行运行时间长的耗时操作,比较耗时的网络操作,甚至是在一个单独进程中的永不会结束的操作.实现这些操作之一是通过Android接口定义语言(AIDL ...

随机推荐

  1. iOS 直播-获取音频(视频)数据

    iOS 直播-获取音频(视频)数据 // // ViewController.m // capture-test // // Created by caoxu on 16/6/3. // Copyri ...

  2. linux版基金看板

    程序员的吊丝们,还在害怕上班时偷偷看基金被老板发现吗?今天你们的福利来了,专属程序员吊丝一族的礼物,linux版基金看板. 优点: 1.自定义设置关注基金 2.linux系统,让别人可以以为你一直都在 ...

  3. 如何在 ASP.NET 4.6 与 IIS10 中运用 HTTP/2 ?

    在过去十年中,Web 技术已经取得了种种进展.从基本的 HTML 开始,网页发展出更丰富的外观和感觉,变得更加直观,对用户更加友好并且越来越大放异彩.这些变化的关键贡献来自于一些新的和翻新技术,且借力 ...

  4. DPA/Ignite由于DNS问题导致连接不上被监控的数据库服务器

    问题描述: 在DPA(Ignite)的管理监控界面发现有两台SQL Server数据库服务器连接不上,截图如下所示,检查其日志内容 具体错误日志如下所示, Notice:日志里面具体的服务器名称被我用 ...

  5. Linq专题之提高编码效率—— 第一篇 Aggregate方法

    我们知道linq是一个很古老的东西,大家也知道,自从用了linq,我们的foreach少了很多,但有一个现实就是我们在实际应用中使用到的却是屈指可数 的几个方法,这个系列我会带领大家看遍linq,好的 ...

  6. C++常见问题: 字符串分割函数 split

    C++标准库里面没有字符分割函数split ,这可太不方便了,我已经遇到>3次如何对字符串快速分割这个问题了.列几个常用方法以备不时之需. 方法一: 利用STL自己实现split 函数(常用,简 ...

  7. 配置tomcat https

    生成安全证书 打开命令窗口 Windows键+r,输入cmd 切换当前目录到tomcat的conf目录下 生成证书 红色字体标识的参数按实际需要修改 keytool -genkey -alias to ...

  8. 005.nginx配置文件

    1.替换nginx主配置文件 通过前面的配置,LNMP的环境已经搭建完成,现在我们替换nginx配置文件: [root@huh ~]# cd /usr/local/nginx/conf/[root@h ...

  9. DIV+CSS 图文混排的图片居中办法

    不少人为了让 Div 图文混排的图片可以居中,给 IMG 套各式各样的 SPAN.DIV.LI 等等,以便于使用 text-align来进行居中. <div>图文混排 <br> ...

  10. [django]django xlrd处理xls中日期转换问题

    xlrd会把xls文件中比如20160--03-01类型的时间转换成整数,那么我们如何保证xlrd读取进来的时间为2016-03-01格式呢? 使用xlrd中的xldate_as_tuple函数 代码 ...