转载前言

AMS在Android中算是比较重要的一个知识点,不管是binder的源码还是Serveice的源码,都是涉及到AMS的,因此理解“AMS是什么”对一个Android开发者来说还是很有必要的。

笔者之前也有分析过相关的源码:bindService 源码解析(为什么是异步)

已经有博主总结的比较好了,因此就不重开篇幅了。

原文地址:https://github.com/xiangjiana/Android-MS/blob/master/android/ams.md

概述

ActivityManagerService是Framework层的核心服务之一,ActivityManagerService是Binder的子类,它的功能主要以下三点:

  • 四大组件的统一调度
  • 进程管理
  • 内存管理

四大组件的统一调度

ActivityManagerService最主要的功能就是统一的管理者activity,service,broadcast,provider的创建,运行,关闭.我们在应用程序中启动acitivity,关闭acitiviy等操作最终都是要通过ams来统一管理的.这个过程非常的复杂,不是一下子可以讲的清楚的,我这里推荐老罗的博客来讲解四大组件的启动过程:

  • Android应用程序内部启动Activity过程(startActivity)的源代码分析
  • Android系统在新进程中启动自定义服务过程(startService)的原理分析
  • Android应用程序注册广播接收器(registerReceiver)的过程分析
  • Android应用程序发送广播(sendBroadcast)的过程分析
  • Android应用程序组件Content Provider简要介绍和学习计划

AMS中的进程管理

前面曾反复提到,Android平台中很少能接触到进程的概念,取而代之的是有明确定义的四大组件。但是作为运行在Linux用户空间内的一个系统或框架,Android不仅不能脱离进程,反而要大力利用Linux OS提供的进程管理机制和手段,更好地为自己服务。作为Android平台中组件运行管理的核心服务,ActivityManagerService当仁不让地接手了这方面的工作。目前,AMS对进程的管理仅涉及两个方面:

  • 调节进程的调度优先级和调度策略。
  • 调节进程的OOM值。

App的Crash处理总结

应用进程进行Crash处理的流程。

内存管理

我们知道当一个进程中的acitiviy全部都关闭以后,这个空进程并不会立即就被杀死.而是要等到系统内存不够时才会杀死.但是实际上ActivityManagerService并不能够管理内存,android的内存管理是Linux内核中的内存管理模块和OOM进程一起管理的.Android进程在运行的时候,会通过Ams把每一个应用程序的oom_adj值告诉OOM进程,这个值的范围在-16-15,值越低说明越重要,越不会被杀死.当发生内存低的时候,Linux内核内存管理模块会通知OOm进程根据AMs提供的优先级强制退出值较高的进程.因此Ams在内存管理中只是扮演着一个提供进程oom_adj值的功能.真正的内存管理还是要调用OOM进程来完成.下面通过调用Activity的finish()方法来看看内存释放的情况.

当我们手动调用finish()方法或者按back键时都是会关闭activity的,在调用finish的时候只是会先调用ams的finishActivityLocked方法将当前要关闭的acitiviy的finish状态设置为true,然后就会先去启动新的acitiviy,当新的acitiviy启动完成以后就会通过消息机制通知Ams,Ams在调用activityIdleInternalLocked方法来关闭之前的acitiviy.

startService流程

总结
在整个startService过程,从进程角度看服务启动过程

  • Process A进程:是指调用startService命令所在的进程,也就是启动服务的发起端进程,比如点击桌面App图标,此处Process A便是Launcher所在进程。
  • system_server进程:系统进程,是java framework框架的核心载体,里面运行了大量的系统服务,比如这里提供ApplicationThreadProxy(简称ATP),ActivityManagerService(简称AMS),这个两个服务都运行在system_server进程的不同线程中,由于ATP和AMS都是基于IBinder接口,都是binder线程,binder线程的创建与销毁都是由binder驱动来决定的,每个进程binder线程个数的上限为16。
  • Zygote进程:是由init进程孵化而来的,用于创建Java层进程的母体,所有的Java层进程都是由Zygote进程孵化而来;
  • Remote Service进程:远程服务所在进程,是由Zygote进程孵化而来的用于运行Remote服务的进程。主线程主要负责Activity/Service等组件的生命周期以及UI相关操作都运行在这个线程; 另外,每个App进程中至少会有两个binder线程 ApplicationThread(简称AT)和ActivityManagerProxy(简称AMP),当然还有其他线程,这里不是重点就不提了。

图中涉及3种IPC通信方式:Binder、Socket以及Handler,在图中分别用3种不同的颜色来代表这3种通信方式。一般来说,同一进程内的线程间通信采用的是 Handler消息队列机制,不同进程间的通信采用的是binder机制,另外与Zygote进程通信采用的Socket。

启动流程

  1. Process A进程采用Binder IPC向system_server进程发起startService请求;
  2. system_server进程接收到请求后,向zygote进程发送创建进程的请求;
  3. zygote进程fork出新的子进程Remote Service进程;
  4. Remote Service进程,通过Binder IPC向sytem_server进程发起attachApplication请求;
  5. system_server进程在收到请求后,进行一系列准备工作后,再通过binder IPC向remote Service进程发送scheduleCreateService请求;
  6. Remote Service进程的binder线程在收到请求后,通过handler向主线程发送CREATE_SERVICE消息;
  7. 主线程在收到Message后,通过发射机制创建目标Service,并回调Service.onCreate()方法。
    到此,服务便正式启动完成。当创建的是本地服务或者服务所属进程已创建时,则无需经过上述步骤2、3,直接创建服务即可。

Android ActivityManagerService (AMS)总结相关推荐

  1. Android ActivityManagerService(AMS)的Activity管理

    对于AMS来讲,Activity管理是它的核心工作,前面两篇文章都是讲AMS的启动流程和进程的管理,这两篇文章其实是为本文做铺垫的,只有理解了前面两篇文章才能更好地理解AMS的activity管理.在 ...

  2. Android FrameWork(AMS,WMS,PMS等)的概念及解析,获取系统服务

    Framework API: Activity Manager/Window Manager/Content Providers/View System/Notification Manager/Pa ...

  3. Android中AMS工作原理,Android AMS启动详解

    启动 在Android系统启动流程中中我们提到过,AMS是在system_service中启动的, //frameworks/base/services/java/corri/android/serv ...

  4. 透视Android系统AMS、PMS和WMS,了解开发中的重要角色

    原理 在Android系统中,AMS(Activity Manager Service).PMS(PackageManager Service)和WMS(Window Manager Service) ...

  5. android7.0 ActivityManagerService(AMS)启动流程

  6. 【Android 启动过程】Activity 启动源码分析 ( AMS -> ActivityThread、AMS 线程阶段 )

    文章目录 一.Activity 启动源码分析 ( AMS | ActivityManagerService ) 1.Instrumentation 调用 AMS 方法 2.ActivityStarte ...

  7. [深入理解Android卷二 全文-第六章]深入理解ActivityManagerService

    由于<深入理解Android 卷一>和<深入理解Android卷二>不再出版,而知识的传播不应该因为纸质媒介的问题而中断,所以我将在CSDN博客中全文转发这两本书的全部内容 第 ...

  8. Android 10.0 系统服务之ActivityMnagerService-AMS启动流程-[Android取经之路]

    摘要:上一节我们讲完了SystemServer的启动过程,这一节接着上一节的步骤,来讲解ActivityManagerService的启动过程. ActivityManagerService简称AMS ...

  9. 【Android 启动过程】Android 应用启动流程 | Activity 启动流程

    文章目录 一.Android 系统启动流程 二.Activity 启动流程 一.Android 系统启动流程 打开 Android 手机电源键后 , 先运行 BootLoader , 然后使用 Boo ...

最新文章

  1. linux亲和性,两种亲和性
  2. Python只需要三十行代码,打造一款简单的人工语音对话
  3. 查看与其他计算机是否连接网络,电脑的网络连接情况要如何的查看和管理
  4. php7 void,2.10.PHP7.1 女神级教程-女神的私人信息 -【PHP 函数】
  5. 用年轻人的压力赚钱,解压馆是门好生意吗?
  6. 带父节点的平衡二叉树_平衡二叉树 通俗易懂
  7. 如何修改wampserver中mysql中字符编码的解决方案
  8. 使用ld的wrap选项替换已有库函数
  9. python中类的实例化_python类的实例化
  10. 趣谈网络协议(二)传输层
  11. 被黑多年的WPS上市,背后:雷军拒绝收购,死磕微软 31 年
  12. win7序列号(可激活所有版本)
  13. 偏差(variation)的分类
  14. android通过代码设置铃声_更接地气的定制 ROM,还有哪些特性可以向原生 Android 借鉴?
  15. PnP-AdaNet学习笔记
  16. 塑胶材料的各种特性,热塑性塑料详解
  17. 任务四:Crypto学习
  18. 益聚星荣:阿里巴巴的“电商帝国”正走向衰落
  19. 倩女手游经验计算机,倩女幽魂手游卡级屯经验指南 短期反超成吨经验
  20. linux 服务器之间共享目录

热门文章

  1. mac电脑显示隐藏文件方法
  2. php 游戏开发swoole,《基于 Swoole 的对战游戏实践》开课啦
  3. java int类型 BigDecimal类型转成汉字金额大写
  4. 聚观早报 | 苹果被曝开发16英寸iPad;5.5G已经取得关键进展
  5. python菜鸟教程mac安装_Python菜鸟教程 | 多平台安装
  6. Windows无法安装到GPT格式磁盘的根本解决办法 - 初学者系列 - 学习者系列文章...
  7. 直播回放:巧用Webpack、Eui Compiler
  8. python编程怎么画三角形的外接圆_python画出三角形外接圆和内切圆的方法
  9. ROS学习笔记之——robot_localization包
  10. Android开发拍照图片旋转