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.class。Lifecycle是AMS的一个内部类,继承自SystemService。通过反射创建Lifecycle实例时,其构造函数会同时创建AMS的实例。
  3. 注册与启动 :Lifecycle的onStart()方法会调用AMS的start()方法,至此,AMS正式启动,开始履行其职责。

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

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

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

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

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

  • ProcessRecord :进程记录的"档案"。每当一个应用进程被创建,AMS就会为其创建一个ProcessRecord。它记录了该进程的所有信息,如进程ID(PID)、用户ID(UID)、当前运行的组件、优先级等。AMS通过ProcessRecord来管理和调度这个进程。
  • ActivityRecord :Activity实例的"身份证"。每当一个Activity被启动,AMS就会创建一个ActivityRecord。它包含了该Activity的所有信息,如所属的包名、启动模式(Launch Mode)、Intent等。它代表了一个Activity在AMS中的存在。
  • TaskRecord :任务栈的"容器" 。它代表一个任务栈,内部维护一个List<ActivityRecord>,按顺序记录了属于该任务的所有Activity。通常,我们按Home键后再次点击应用图标,看到的就是一个TaskRecord。
  • ActivityStack :Activity堆栈的"管理员"。它负责管理一组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. 初始化进程 :新进程进入ActivityThread 的main()方法。它通过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系统设计哲学的关键一步。

相关推荐
千里马学框架5 天前
一起学 Android 14:ShellTransition 屏幕旋转过程深度剖析
android·智能手机·性能优化·framework·性能·屏幕旋转·rotation
美狐美颜SDK开放平台5 天前
开发直播APP时如何接入视频美颜SDK?开发流程与注意事项
android·人工智能·计算机视觉·音视频·直播美颜sdk
AFinalStone5 天前
Android7 SystemUI源码解析(七)Keyguard锁屏模块深度解析
android·systemui
致远ccc5 天前
Google Play 上架前如何测试 App?多国家 Android 环境测试
android·app测试·googleplay·多国家应用测试
ttyyttemo5 天前
Kotlin 协程中的 Job 结构化并发与取消
android
sun0077005 天前
tbox 4g/5g切换,导致wan ip 改变,导致车机旧网络不可用。需要重启车机才行
android
其实防守也摸鱼5 天前
内网穿透与反向代理:原理、工具与实战指南
android·大数据·运维·安全·网络安全·自动化·渗透
AFinalStone5 天前
Android7 SystemUI 源码解析(四)NavigationBar 导航栏与 SystemBars
android·systemui
JMchen5 天前
属性动画原理与高级动画实现
android·kotlin·canvas
AFinalStone5 天前
Android7 SystemUI 源码解析(二)启动流程深度解析
android·systemui