翻开android studio,你能够看到在logcat工具栏有一个process的下拉菜单,翻开之后能够看到当时安卓设备的一切进程
除了安装的第三方app之外,会有很多体系自带的进程,最重要的莫过于system server地点的process,长这个样子
今天我打算用一章节来稍微聊聊安卓中的进程,内容包括:
- 安卓中的体系进程的方位
- 安卓system server发动体系进程的阶段phase
- 同享进程
各个进程的代码在哪?
安卓最重要的体系进程当然是system_process. 这个进程是zygote孵化的第一个进程,它办理着安卓体系中各种大大小小的体系service的完成(SystemService)。也便是下面图中各种manager的server端完成(安卓的C/S 架构)。
除此之外,其他的体系进程很多处于这个方位:
platform/packages/
以apps开头的肯定都是独立的1st party app。以services开头的某些是独立进程。
比方Telephony进程,它的姓名对应安卓中的phone进程 (看它的manifest文件)
翻开logcat也能够看到这个进程
有些是和其他package同享进程的,比方Telecom.
能够看到这个进程和另外一个叫system的进程share user id,他们最终会进入到同一个进程中。而这个system进程便是大名鼎鼎的system_process….
android.googlesource.com/platform/fr…
也便是说,Telephony和Telecom这两个package虽然是独立的package(从代码的散布来说,可是在运转时跑在不同的进程,而且两个package一个是具有自己的独立进程,另一个会最终跑在体系服务进程。
翻开logcat,filter到system_process进程的log,你能够搜到Telecom的log。证明Telecom这个package的确是跑在体系进程上了。
体系进程的发动
system_process作为第一个孵化出来的java service进程,除了要负责发动在system_process里边的体系服务之外
比方:
android.googlesource.com/platform/fr…
PS:android开发团队自己也觉得这样hardcode service name不太好, 想通过读取体系构建的某些文件来做。。。可是一直没改 :( 。
还需要发动的其他的体系进程。
当体系进程的关键性服务都发动好了之后,ActivityManagerService就会开端发动被符号为direct boot aware 的进程,中文叫直接发动形式。
要让当时进程(package )成为直接发动形式的进程, 只需要像上面截图相同把directBootAware 符号为true就行了。
ActivityManagerService在体系进程发动结束一切的必要service之后,就开端发动direct boot aware的package了。
android.googlesource.com/platform/fr…
比方上文介绍到的Telephony package便是被符号成一个direct boot aware的app。
android.googlesource.com/platform/pa…
这里有个文档的坑,要想一个app成为直接发动形式的app(也便是Application class oncreate会被调用)的话还需要多加一个persistent=true的符号。可是文档里边没有详细写。。。。
这个package的application class会在体系服务发动结束之后立刻被创建,onCreate会被调用
所以在安卓发动的过程中,有三个重要的阶段
- 发动体系进程服务阶段, critical service phase
- 发动完step 1,开端发动其他重要的进程,可是在用户还没解锁屏幕之前,这个阶段叫direct boot phase. 这个阶段发动的进程都是用户在没有解锁屏幕之前能做的,比方说打紧急电话.(所以Telephony进程必须在direct boot 阶段发动)
- 用户解锁结束,这个阶段叫boot complete phase
同享进程的package
上面介绍过某些package能够同享进程。比方Telecom的代码明明有自己独立的manifest,还有自己独立的package name
package="com.android.server.telecom"
可是最终其实代码还是跑在system_process里边。
原因是在办理一切体系进程的类ProcessList里边,当要发动的package是体系进程的时候,安卓会在现已launch的进程中挑选第一个作为体系进程的那个process。
所以简单来总结一下,安卓体系在发动过程中做了如下几件事情
安卓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,在代码中进行大局搜索就行了。