Android ActivityManagerService 笔记

ActivityManagerService(简称AMS)是Android系统中最为核心的服务之一,它运行在SystemServer进程中,如同Android世界的"大管家",负责所有应用组件(Activity、Service、BroadcastReceiver、ContentProvider)的生命周期管理、进程管理和任务调度。理解AMS的工作机制,是深入Android内核的必经之路。

下面,我将从AMS的启动流程、核心功能、内部架构以及与应用的通信方式这几个维度,为你详细讲解。

一、AMS的启动:SystemServer中的核心引导

AMS的启动发生在Android系统启动的早期阶段,由SystemServer进程负责创建和初始化。

  1. 启动入口 :SystemServer的main()方法调用run()方法,在这里会创建SystemServiceManager,它是管理系统服务的核心类。
  2. 创建AMS实例 :通过SystemServiceManager的startService()方法,传入ActivityManagerService.Lifecycle.classLifecycle是AMS的一个内部类,继承自SystemService。通过反射创建Lifecycle实例时,其构造函数会同时创建AMS的实例
  3. 注册与启动LifecycleonStart()方法会调用AMS的start()方法,至此,AMS正式启动,开始履行其职责。

二、AMS的核心功能:不止于Activity管理

虽然名字叫ActivityManagerService,但它的职责远不止管理Activity,而是涵盖了应用层面的所有核心组件。

  • 组件管理 :统一调度所有应用的Activity、Service、BroadcastReceiver和ContentProvider的启动、停止、暂停等生命周期操作。
  • 进程管理 :维护一个正在运行的应用进程列表 (ProcessRecord)。当启动应用时,检查其进程是否存在,若不存在则请求Zygote进程孵化新进程。同时,在系统内存不足时,根据LRU算法等规则决定杀死哪些进程以回收资源。
  • 任务和返回栈管理 :管理TaskRecordActivityStack。TaskRecord记录了用户执行一系列操作的Activity顺序,AMS负责将Activity正确地压入或弹出返回栈,确保用户按下返回键时能回到正确的上一个界面。
  • 内存管理:通过智能的回收机制,在系统内存紧张时,引导应用释放不必要的资源(如缓存Activity),提高系统的稳定性和响应速度。

三、AMS的"左膀右臂":核心数据结构

为了完成上述复杂功能,AMS内部维护了一系列关键的数据结构,它们共同协作,精确记录着每个应用、每个进程、每个Activity的状态。

  • ProcessRecord进程记录的"档案"。每当一个应用进程被创建,AMS就会为其创建一个ProcessRecord。它记录了该进程的所有信息,如进程ID(PID)、用户ID(UID)、当前运行的组件、优先级等。AMS通过ProcessRecord来管理和调度这个进程。
  • ActivityRecordActivity实例的"身份证"。每当一个Activity被启动,AMS就会创建一个ActivityRecord。它包含了该Activity的所有信息,如所属的包名、启动模式(Launch Mode)、Intent等。它代表了一个Activity在AMS中的存在。
  • TaskRecord任务栈的"容器" 。它代表一个任务栈,内部维护一个List<ActivityRecord>,按顺序记录了属于该任务的所有Activity。通常,我们按Home键后再次点击应用图标,看到的就是一个TaskRecord。
  • ActivityStackActivity堆栈的"管理员"。它负责管理一组TaskRecord。在较新版本的Android中,ActivityStackSupervisor负责管理多个ActivityStack(例如,一个栈对应前台应用,一个栈对应后台应用),以支持多窗口模式等复杂场景。

它们的关系可以简单理解为: 一个进程 (ProcessRecord)可以包含多个任务栈 (TaskRecord),每个任务栈 (TaskRecord)可以包含多个Activity (ActivityRecord)。而ActivityStack 则负责管理这些任务栈(TaskRecord)的整体行为。

四、AMS的"触手":与应用进程的通信

AMS运行在SystemServer进程,而应用运行在自己的进程中。它们之间的沟通桥梁是Android的跨进程通信机制------Binder

  • Client-Server架构:AMS作为服务的提供者(Server端),运行在SystemServer中。每个应用进程作为Client端,通过Binder机制向AMS请求服务。
  • 代理模式:IActivityManager :系统定义了IActivityManager接口。在Android 8.0之后,AMS直接继承自IActivityManager.Stub,成为一个Binder服务端。而在客户端(应用进程),通过IActivityManager.Stub.asInterface()方法获取到一个Binder代理对象。这个代理对象在应用端被称为ActivityManagerProxy(AMP,在8.0之前是独立类,之后合并为IActivityManager的内部逻辑),它封装了Binder通信的细节。应用调用AMP.startActivity(),实际上就是通过Binder驱动向AMS发送了一个START_ACTIVITY_TRANSACTION的调用请求。
  • 双向通信 :不仅应用需要调用AMS,AMS也经常需要回调应用,比如通知应用去启动一个Activity。为此,每个应用进程在启动时都会创建一个ApplicationThread 对象(它也是一个Binder对象),并将其传递给AMS。AMS则持有这个ApplicationThread的代理对象ApplicationThreadProxy (ATP)。当AMS需要控制应用时(例如,调用scheduleLaunchActivity),它就会通过ATP向应用进程的ApplicationThread发送请求。

五、全景透视:一次Activity的启动过程

理论结合实践,我们以点击Launcher图标启动一个应用为例,串联起上述所有概念,看看AMS是如何实际运作的。

  1. 发起请求 :Launcher应用调用startActivity(),该方法通过Binder代理(IActivityManager)向SystemServer进程中的AMS发起启动请求。
  2. 处理请求(AMS端)
    • AMS收到请求后,首先解析Intent,检查权限和目标Activity信息。
    • 它为该Activity创建一个ActivityRecord ,并根据其启动模式确定要放入哪个TaskRecord ,再由ActivityStack将其调整到前台。
    • AMS检查目标Activity所属的应用进程是否存在。由于是冷启动,进程不存在。
  3. 创建进程 :AMS通过Socket向Zygote进程 发送创建新进程的请求。Zygote收到请求后,fork自身,创建一个新的应用进程
  4. 初始化进程 :新进程进入ActivityThreadmain()方法。它通过Binder向AMS报告"我已就绪",并传递一个非常重要的Binder对象------ApplicationThread(用于AMS回调应用)。
  5. AMS回调 :AMS保存这个应用进程的ProcessRecord 和ApplicationThread的代理对象(ATP)。随后,AMS通过ATP向该应用进程发送"启动Activity"的指令。
  6. 启动Activity :应用进程的ApplicationThread 接收到指令,通过内部的H(Handler) 将消息切换到主线程(UI线程),最终通过Instrumentation 创建目标Activity的实例,并调用其onCreate()onStart()onResume()等生命周期方法。
  7. 完成启动:Activity界面显示,启动完成。用户终于看到了应用的界面。

总结

ActivityManagerService作为Android系统的核心枢纽,其设计体现了中央集权管理高效跨进程通信的思想。它通过维护精细的内部状态(ProcessRecord, ActivityRecord等),利用Binder机制与各应用进程进行双向通信,从而有条不紊地管理着整个系统的应用组件和进程资源。对于开发者而言,理解AMS的工作原理,不仅能帮助写出更健壮的代码,也是深入理解Android系统设计哲学的关键一步。

相关推荐
shalou29012 小时前
mysql-connector-java 和 mysql-connector-j的区别
android·java·mysql
aaajj2 小时前
【Android】手机蜘蛛魔术的简易app例子
android
qw102482 小时前
MySQL-mysql zip安装包配置教程
android·mysql·adb
小飞学编程...2 小时前
【Java相关八股文(一)】
android·java·开发语言
QCzblack2 小时前
第五周作业
android
c***03232 小时前
Mysql之主从复制
android·数据库·mysql
火焰中舞蹈的小孩2 小时前
Unity和Android Studio相互调用 CH340在unity中调用
android·ide·android studio
不是AI2 小时前
【Unity开发】一、在安卓设备上运行Unity项目
android·unity·游戏引擎
p***19942 小时前
MySQL Workbench菜单汉化为中文
android·数据库·mysql