您可以捐助,支持我们的公益事业。

1元 10元 50元





认证码:  验证码,看不清楚?请点击刷新验证码 必填



  求知 文章 文库 Lib 视频 iPerson 课程 认证 咨询 工具 讲座 Modeler   Code  
会员   
 
   
 
 
     
   
 订阅
  捐助
Android进程整理
 
 来源:www.cnblogs.com 发布于: 2016-12-9
  1626  次浏览      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个线程。(该数据仅供参考,让大家对手机当前的进程和线程的数量级有个大概的感观)

失败是什么?没有什么,只是更走近成功一步;成功是什么?就是走过了所有通向失败的路,只剩下一条路,那就是成功的路。

   
1626 次浏览       15
 
相关文章

手机软件测试用例设计实践
手机客户端UI测试分析
iPhone消息推送机制实现与探讨
Android手机开发(一)
 
相关文档

Android_UI官方设计教程
手机开发平台介绍
android拍照及上传功能
Android讲义智能手机开发
相关课程

Android高级移动应用程序
Android系统开发
Android应用开发
手机软件测试
最新课程计划
信息架构建模(基于UML+EA)3-21[北京]
软件架构设计师 3-21[北京]
图数据库与知识图谱 3-25[北京]
业务架构设计 4-11[北京]
SysML和EA系统设计与建模 4-22[北京]
DoDAF规范、模型与实例 5-23[北京]

android人机界面指南
Android手机开发(一)
Android手机开发(二)
Android手机开发(三)
Android手机开发(四)
iPhone消息推送机制实现探讨
手机软件测试用例设计实践
手机客户端UI测试分析
手机软件自动化测试研究报告
更多...   


Android高级移动应用程序
Android应用开发
Android系统开发
手机软件测试
嵌入式软件测试
Android软、硬、云整合


领先IT公司 android开发平台最佳实践
北京 Android开发技术进阶
某新能源领域企业 Android开发技术
某航天公司 Android、IOS应用软件开发
阿尔卡特 Linux内核驱动
艾默生 嵌入式软件架构设计
西门子 嵌入式架构设计
更多...