理解ActivityManagerService

一、AMS在Android7.0和Android8.0之后的差异

Android7.0之前的AMS家族

在Android7.0之前客户端进程想和AMS进行通信都是通过ActivityManagerNative(以下简称AMN)getDefault()获取的ActivityManagerProxy(以下简称AMP)来进行通讯的。

Android7.0 ActivityManagerService是AMN的一个子类,AMP是AMN的代理类,从而间接的实现通过AMP跨进程和AMS直接通讯。



Android8.0之后的AMS家族

在Android8.0之后,AMS家族中不再有AMP和AMN,取而代之的是IActivityManager。使用了AIDL进程间通信技术,服务端AMS继承IActivityManager.Stub。

二、AMS的的启动过程

通过之前的文章Android系统启动过程,我们可以知道AMS的启动在SystemServer进程初始化的时候启动的。这里就从SystemServer的main函数开始逐步解析。



AMS属于系统引导服务,所以会在上述startBoostrapServices()里进行初始化,我们继续来看startBoostrapServices函数。



到这里我们可以清楚的看到,AMS会通过SystemServiceManager的实例调用startService方法初始化并启动

三、AMS与应用程序进程

在之前的文章Android四大组件的工作过程,我们可以知道AMS在App启动的过程中扮演了重要的角色,这里就不在过多的赘述。可以参考之前的文章,AMS与应用程序的关联主要有下面2点:

  • 启动应用程序时AMS会检查这个应用程序有没有启动,进程是否存在
  • 如果将要启动的应用程序进程不存在,则请求Zygote进程去fork出一个应用进程出来

你可能感兴趣的:(理解ActivityManagerService)