翻开android studio,你能够看到在logcat工具栏有一个process的下拉菜单,翻开之后能够看到当时安卓设备的一切进程

初学安卓framework系列 四 (系统中的那些进程)

除了安装的第三方app之外,会有很多体系自带的进程,最重要的莫过于system server地点的process,长这个样子

今天我打算用一章节来稍微聊聊安卓中的进程,内容包括:

  1. 安卓中的体系进程的方位
  2. 安卓system server发动体系进程的阶段phase
  3. 同享进程

各个进程的代码在哪?

安卓最重要的体系进程当然是system_process. 这个进程是zygote孵化的第一个进程,它办理着安卓体系中各种大大小小的体系service的完成(SystemService)。也便是下面图中各种manager的server端完成(安卓的C/S 架构)。

初学安卓framework系列 四 (系统中的那些进程)

除此之外,其他的体系进程很多处于这个方位:

platform/packages/

以apps开头的肯定都是独立的1st party app。以services开头的某些是独立进程。

比方Telephony进程,它的姓名对应安卓中的phone进程 (看它的manifest文件)

初学安卓framework系列 四 (系统中的那些进程)

翻开logcat也能够看到这个进程

初学安卓framework系列 四 (系统中的那些进程)

有些是和其他package同享进程的,比方Telecom.

初学安卓framework系列 四 (系统中的那些进程)

能够看到这个进程和另外一个叫system的进程share user id,他们最终会进入到同一个进程中。而这个system进程便是大名鼎鼎的system_process….

android.googlesource.com/platform/fr…

初学安卓framework系列 四 (系统中的那些进程)

也便是说,Telephony和Telecom这两个package虽然是独立的package(从代码的散布来说,可是在运转时跑在不同的进程,而且两个package一个是具有自己的独立进程,另一个会最终跑在体系服务进程。

初学安卓framework系列 四 (系统中的那些进程)

翻开logcat,filter到system_process进程的log,你能够搜到Telecom的log。证明Telecom这个package的确是跑在体系进程上了。

体系进程的发动

system_process作为第一个孵化出来的java service进程,除了要负责发动在system_process里边的体系服务之外

比方:

android.googlesource.com/platform/fr…

初学安卓framework系列 四 (系统中的那些进程)

PS:android开发团队自己也觉得这样hardcode service name不太好, 想通过读取体系构建的某些文件来做。。。可是一直没改 :( 。

还需要发动的其他的体系进程。

当体系进程的关键性服务都发动好了之后,ActivityManagerService就会开端发动被符号为direct boot aware 的进程,中文叫直接发动形式

当设备已开机但用户没有解锁设备时,Android 7.0 将在安全的“直接发动”形式下运转

初学安卓framework系列 四 (系统中的那些进程)

要让当时进程(package )成为直接发动形式的进程, 只需要像上面截图相同把directBootAware 符号为true就行了。

ActivityManagerService在体系进程发动结束一切的必要service之后,就开端发动direct boot aware的package了。

android.googlesource.com/platform/fr…

初学安卓framework系列 四 (系统中的那些进程)

比方上文介绍到的Telephony package便是被符号成一个direct boot aware的app。

android.googlesource.com/platform/pa…

这里有个文档的坑,要想一个app成为直接发动形式的app(也便是Application class oncreate会被调用)的话还需要多加一个persistent=true的符号。可是文档里边没有详细写。。。。

初学安卓framework系列 四 (系统中的那些进程)

这个package的application class会在体系服务发动结束之后立刻被创建,onCreate会被调用

初学安卓framework系列 四 (系统中的那些进程)

所以在安卓发动的过程中,有三个重要的阶段

  1. 发动体系进程服务阶段, critical service phase
  2. 发动完step 1,开端发动其他重要的进程,可是在用户还没解锁屏幕之前,这个阶段叫direct boot phase. 这个阶段发动的进程都是用户在没有解锁屏幕之前能做的,比方说打紧急电话.(所以Telephony进程必须在direct boot 阶段发动)
  3. 用户解锁结束,这个阶段叫boot complete phase

同享进程的package

上面介绍过某些package能够同享进程。比方Telecom的代码明明有自己独立的manifest,还有自己独立的package name

package="com.android.server.telecom"

可是最终其实代码还是跑在system_process里边。

原因是在办理一切体系进程的类ProcessList里边,当要发动的package是体系进程的时候,安卓会在现已launch的进程中挑选第一个作为体系进程的那个process。

初学安卓framework系列 四 (系统中的那些进程)

所以简单来总结一下,安卓体系在发动过程中做了如下几件事情

初学安卓framework系列 四 (系统中的那些进程)

安卓framework中的面向对象

最终提一嘴,安卓framework代码中的面向对象规划做得很好。基本上一切的实际中的实例都有在代码中一一对应。

比方设备中每一个package在代码中笼统成PackageInfo.java, 这个类中一切的field都一一对应着一个安卓package manifest 文件中的tag。比方android:sharedUserId,便是一个PackageInfo.java中 的 public String sharedUserId;

再比方一个进程,在安卓的framework中的java代码也就叫Process.java ,发动进程,杀死进程等等操作都被笼统成Process.java中的API (比方发动当时进程 -> 对应Process#start()方法 )

这些笼统对开发者或许源代码阅读者都带来了极大的便当。比方想查找某一个manifest的tag是怎样被运用的,能够翻开PackageInfo.java 类,搜索该tag在类中对应的field,在代码中进行大局搜索就行了。