0%

(04)2021.12.16-AMS的核心原理讲解--leo老师

ZygoteInit.main 方法执行会进入 Java 层

forkSystemServer 方法:

在 fork 之前会给一些 args ,比如很有意思的一个名字 –nice-name ,就是指的进程名,这里的值时 : system_server 。

Zygote.forkSystemServer 返回值问题:因为 fork 操作返回的就是 子进程的 pid ,所以,在父进程(Zygote 进程)中,返回的是 SystemServer 这个进程的 id ,假如是 6000 (反正肯定是 大于0的);而在 SystemServer 中而言,由于它没有子进程,所以它返回的是 0 。

所以,在 Zygote 执行 Zygote.forkSystemServer 之后,需要判断 if (pid == 0) 去区分当前是 SystemServer 进程,然后才执行 handleSystemServer 这个方法,这里面会执行 SystemServer 进程的 main 方法。

还记得前面说的,所有的进程开始执行的时候都是执行其 main 方法的

handleSystemServer 最终会调用到 ZygoteInit.java 类中的 zygoteInit 方法:

1
public static final Runnable zygoteInit(int targetSdkVersion, long[] disabledCompatChanges, String[] argv, ClassLoader classLoader)

在这个方法里面会执行 ZygoteInit.nativeZygoteInit(); 方法去启动 Binder 线程池,在 native 层最终执行的代码是这样的:

1
proc -> startThreadPool();

这也从侧面说明了, Zygote 进程 fork 出来的进程都会去创建 Binder 线程池。

获取到 SystemServer 的 Class ,然后通过反射调用其 main() 方法。这样就把 SystemServer 进程给启动起来了。

在 SystemServer 的 main 方法中,主要执行其 run 方法,主要操作是:

  • 创建 SystemServiceManager 对象

  • startBootstrapServices //启动引导服务 —— AMS 等

  • startCoreService //核心服务

  • startOtherService //其他服务,如 WMS 等

一个 App 可以有多个进程?那肯定可以,我们平时一个 App 就可以开启多个进程; 那么一个进程可以有多个 App 吗? 答案当然也是可以!我们可以用 sharedId 去实现 。

在 SystemServer 的 main 方法中,最终会创建 ActivityThread 对象,看到这里我蒙了。。。不是只有 App 的进程才会创建 ActivityThread 对象么? 不过呢,我们能从 ActivityThread 的 attach 方法中看到端倪,在里面会判断是否是 system(也就是是否是系统),在 SystemServer.main 里面这种情况下,我们肯定是 system 的:

1
2
3
4
5
6
7
8
9
//ActivityThread
private void attach(boolean system, long startSeq) {
if (!system) {

} else {

}
//省略无关代码
}

SystemServer 的main 方法执行的时候,会有创建和创建 Application 的 Context 以及创建 ActivityThread 的操作,和我们的 App 进程创建有点类似,老师的解释是,SystemServer 进程中有 App ,至于这个 App 是什么 App ,老师也说不知道。

SystemServerManager

startService

四大组件管理者以前说的都是 AMS ,但是 ANdroid 10 之后,这么说就不准确的,新增了一个 ATMS (ActivityTaskManagerService), 其中 ATMS 专门管理 Activity , AMS 管理其他三个以及其他的。

这里要注意 2 个概念, SystemServerManager 和 ServiceManager 的区别:

  • SystemServerManager : 主要负责 Service 的生命周期,比如 Service 的 onCreate、onStart 等

  • ServiceManager : 负责 Service 的管理,Service 创建后,要添加到 ServiceManager 中来,也就是注册。

SystemServer 中 startOtherService 中有几个值得注意的:

  • mActivityManagerService.systemReady 方法会启动 Launcher

  • startSystemUi 方法

ActivityStater.execute 里面会执行到 executeRequest 方法,这些方法非常重要,我们说的是 Activity 的栈管理 就是在 ActivityStarter 这个类里面。启动 Activity 的时候,一般会有 2 个 AcitivityRecord ,一个是启动 Activity 的信息,另一个是待启动的 Activity 的信息,比如 Activity A 启动 Activity B 。

Activity 启动过程中,会经过 ActivityStackSupervisor.java 的 startSpecificActivity 方法,这个方法很关键,会在里面判断是否存在目标Activity 所在的进程,如果存在才执行 realStartActivityLocked ;否则,启动 App 的进程(AMS 通过 socket 通知 zygote 创建进程)。

有个 主 zygote 和 从 zygote 的概念,这个需要理解下,因为之前我们讲过系统启动的时候,有几种配置,是 32 位 或者 64位,还是说32_64 (先尝试32位不行再 64位),以及 64_32(先尝试64位不行再 32位)

启动 Launcher 的时候,会执行到 ActivityThread.main 方法(其实和普通的App一样,Launcher也是个 App),在 ActivityThread.main 方法中也会调用到 attachApplication 方法,这是将App 的句柄发送给AMS,方便后续 AMS 向 App 发送消息。这个句柄是 ApplicationThread ,他是个 Binder 。

一定要自己去看源码,画时序图和流程图:

  • 时序图,哪个类的方法到哪个类的方法

  • 流程图: 整个过程做的重要事情

谢谢你的鼓励