Android进程总结
来源:互联网 发布:ubuntu文件vi编辑命令 编辑:程序博客网 时间:2024/06/05 12:15
一、概括
系统启动架构图:
上图在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的深蓝色块。下面列举常见的内核进程:
内核进程都不存在子进程与子线程,并且所有内核进程的用户都是root.
每个内核进程的作用,后续再补上
2.2 init子进程
init
进程(1号进程),是Linux系统的用户空间进程,或者说是Android的第一个用户空间进程。
下面列举常见的由init进程孵化而来的用户进程:
servicemanager,作为Binder架构的一个大管家,所有注册服务、获取服务,都需要经过servicemanager,更多关于servicemanager查看Binder系列文章。
2.3 Zygote子进程
Zygote本身是一个Native的应用程序,刚开始的名字为“app_process”,运行过程中,通过系统调用将自己名字改为Zygote。是所有上层Java进程的父进程,android系统中还有另一个Zygote64进程,用于孵化64位的应用进程。
在图中的红色线,便是Zygote fork出来的进程,所有的App进程都是由Zygote fork产生的。
下面列举Zyogte进程
孵化的部分子进程
三、线程
3.1 Zygote 子线程
在adb shell
终端,输入:
ps -t | grep -E "NAME| 497 "
解释: -E "NAME| 497 "
是输出时能多显示NAME
的那一行,方便查看每一列代表的具体含义,497
是Zygote的进程号。
共享父进程的地址空间的便是子线程,即VSIZE必然相同,否则就是子进程,如下图:
图中红色圈起来的便是子线程,其他都是子进程。
可见Zygote的子线程如下:
这5个线程都是与虚拟机息息相关的线程,之后所有由Zygote直接或间接孵化的子进程,都会包含这5个线程,那么就在其线程说明中,不再重复,而是以“用于GC”的字样来表示。后续有空会专门针对Android的虚拟机展开讨论。
3.2 system_server 子线程
Java Framework中的service都运行在system_server进程中,system_server内的子线程很多,统计了下自己身边的手机有system_server有122个线程。下面列举部分子线程:
ActivityManagerService线程是一个ServerThread线程。进程结构体task_struct的comm字段是一个长度为16的char型,故进程名最长为15个字符。
3.3 mediaserver 子线程
mediaserver 子线程,如下:
每个线程的作用,后续再补上
3.4 app 子线程
此处以settings为例
一般地,每个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的进程个数统计表:
图中zygote64/zygote/qseecomd/adbd的父进程都是init进程,而sh的父进程是adbd,而adb和qseecomd的父进程都是init进程。
手机总计:407
个进程,1575
个线程。(该数据仅供参考,让大家对手机当前的进程和线程的数量级有个大概的感观)
转自http://www.cnblogs.com/android-blogs/p/5632549.html
- android 多进程总结
- 总结android中的进程
- Android进程总结
- Android进程总结
- android 结束进程方法总结
- android结束进程方法总结
- Android 进程保活总结
- Android进程及管理总结
- Android进程及管理总结
- Android进程保活总结
- Android多进程全总结
- Android 进程与线程总结
- android保活进程总结--双进程保活策略
- android 杀死进程的方法总结
- Android四种类型进程总结
- Android 的进程与线程总结
- Android 的进程与线程总结
- Android 的进程与线程总结
- git
- 调试脚本报错:error--memory violation:exception ACCESS_VIOLATION received
- 系统集成项目管理工程师学习笔记
- Tensorflow Ubuntu16.04上安装及CPU运行Tensorboard、CNN、RNN图文教程
- SVN如何迁移到Git?
- Android进程总结
- 解决position:fixed受虚拟键盘的影响
- Python2 & Python3
- 语义分割DeepLab v2--DeepLab: Semantic Image Segmentation with Deep Convolutional Nets, Atrous Convolut
- 人脸特征检测--基于DLIB库
- SharePoint 服务器端对象迁移文件夹
- 欧拉函数
- IDEA 安装
- 辩论1受身详解