孤舟蓑笠翁,独钓寒江雪

Android AMS 与 APP 进程通信

概述

在 Android 中,APK 运行在 App 进程,而 AMS 运行在 system_server 进程,AMS 承担着对 Activity 的生命周期的管理等工作,而 Activity 生命周期函数的回调又是在 App 进程中进行的,App 进程需要频繁的和 AMS 进程进行通信。那么理解 AMS 进程和 App 进程之间的通信就对 Activity 的启动流程的理解有很好的铺垫作用。因此在介绍 Activity 的启动流程之前我们先来学习一下 AMS 进程和 App 进程之间是如何通信的。
提起到 Android 进程间通信,我们自然就想到了 Binder。是的,AMS 和 APP 之间肯定也是通过 Binder 进行通信的。下面进行详细的介绍。
本文涉及到的类包含:

1
2
3
4
5
6
frameworks/base/core/java/android/app/ActivityManagerNative.java
frameworks/base/core/java/android/app/ActivityManagerNative$ActivityManagerProxy.java
frameworks/base/core/java/android/app/ApplicationThreadNative.java
frameworks/base/core/java/android/app/ApplicationThreadNative$ApplicationThreadProxy.java
frameworks/base/core/java/android/app/ActivityThread.java
frameworks/base/core/java/android/app/ActivityThread$ApplicationThread.java

相关类关系图

效果图

进程间通信

下面通过一个图来表示一下 AMS 和 APP 的通信,该图片摘自Weishu Note,描述的很好,直接拿来用来。

效果图

在 App 进程侧,App 进程作为Binder的客户端当发起启动 Activity 时,通过作为服务端的代理对象的 ActivityManagerProxy 来发起远程调用,此时 system 进程作为服务端,ActivityManagerNative 作为 Binder 本地对象收到远程调用后,由它的实现类 ActivityManagerService 完成相应的生命周期管理以及任务栈管理后,会把控制权交给App进程,让App进程完成Activity类对象的创建,以及生命周期回调。
接下来的调用 system 进程作为客户端,App 进程作为服务端,通过system进程作为服务端的代理对象的 ApplicationThreadProxy 发起调用,ApplicationThread 作为服务端的 Binder 本地对象收到远程调用后,通过 Handler 发送消息由 ActivityThread (也就是UI线程 )处理。
了解了这些知识后再看Android startActivity 流程分析的流程图,会有助于理解。