一、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出一个应用进程出来