原址

在这篇博客中,给大家带来AMS的技术分享。AMS(ActivityManagerService)是贯穿Android系统组件的核心服务,负责了系统中四大组件的启动、切换、调度以及应用进程管理和调度工作。因此想要了解Android的内部工作机制,就必须先了解�AMS的工作原理。在本文中,我将尽可能用通俗的语言去描述AMS涉及到的知识点帮助大家理解。

AMS的内部实现

AMS原理模型

1. ActivityManager

/frameworks/base/core/java/android/app/ActivityManager.java

ActivityManager是客户端用来管理系统中正在运行的所有Activity包括Task、Memory、Service等信息的工具。但是这些这些信息的维护工作却不是又ActivityManager负责的。在ActivityManager中有大量的get()方法,那么也就说明了他只是提供信息给AMS,由AMS去完成交互和调度工作。

2. AMS

/frameworks/base/services/java/com/android/server/am/ActivityManagerService.java

AMS是作为管理Android系统组件的核心服务,他在SystemServer执行run()方法的时候被创建,并运行在独立的进程中。具体来说就是SystemServer管理着Android中所有的系统服务,这些系统服务的生命周期回调都由SystemServer去调度负责。

    private void startBootstrapServices() {...Installer installer = mSystemServiceManager.startService(Installer.class);// Activity manager runs the show.mActivityManagerService = mSystemServiceManager.startService(ActivityManagerService.Lifecycle.class).getService();mActivityManagerService.setSystemServiceManager(mSystemServiceManager);mActivityManagerService.setInstaller(installer);...}

在SystemServer调用run()方法中开启必要的系统服务,并将这些服务注册和添加到管理列表中,并执行这些服务在进程中的生命周期。ActivityManagerService作为一个重要的核心服务就是在这里被初始成功的。

AMS与ActivityManager的通信实现

AMS与ActivityManager通信流程

我们知道AMS和ActivityManager之间通信需要利用Binder来完成,那么我们接下来分析一下这个通信机制是如何实现的。
ActivityManagerNative(AMN)中实现的代码是运行在Android应用程序的进程空间内,可直接使用的对象,Intent会由应用程序通过这个类将方法对应的Binder命令发送出去。ActivityManagerNative(AMN)是一个抽象的类,他包含了如下特点:
(1)继承Binder类
(2)实现IActivityManager接口
由于继承了Binder类,他就拥有了远程通信的条件。实现了IActivityManager接口,他能够得到ActivityManager管理关于内存、任务等内部信息。那么AMS作为AMN的子类也就自然享有了这些特性。

我们再回过头来看看ActivityManager中的方法是如何被调用的,举个栗子:

    public List<ActivityManager.AppTask> getAppTasks() {ArrayList<AppTask> tasks = new ArrayList<AppTask>();List<IAppTask> appTasks;try {appTasks = ActivityManagerNative.getDefault().getAppTasks(mContext.getPackageName());} catch (RemoteException e) {throw e.rethrowFromSystemServer();}...return tasks;}

我们在代码中发现,类似的get()方法的调用逻辑都是先通过ActivityManagerNative.getDefault()来获得ActivityManager的代理接口对象。getDefault()到底做了什么?

    /*** Retrieve the system's default/global activity manager.*/static public IActivityManager getDefault() {return gDefault.get();}
    private static final Singleton<IActivityManager> gDefault = new Singleton<IActivityManager>() {protected IActivityManager create() {IBinder b = ServiceManager.getService("activity");if (false) {Log.v("ActivityManager", "default service binder = " + b);}IActivityManager am = asInterface(b);if (false) {Log.v("ActivityManager", "default service = " + am);}return am;}};

ServiceManager是系统提供的服务管理类,所有的Service都通过他被注册和管理,并且通过getService()方法能够得到ActivityManager与AMS的远程通信Binder对象。

    /*** Cast a Binder object into an activity manager interface, generating* a proxy if needed.*/static public IActivityManager asInterface(IBinder obj) {if (obj == null) {return null;}IActivityManager in =(IActivityManager)obj.queryLocalInterface(descriptor);if (in != null) {return in;}return new ActivityManagerProxy(obj);}

得到了AMS的Binder对象之后,也就相当于拿到了与ActivityManager远程通信的许可证。接着,在asInterface()这个方法中,这个许可证的使用权利被移交给了ActivityManagerProxy,那么ActivityManagerProxy就成为了ActivityManager与AMS远程通信的代理。

ActivityManagerProxy也实现了IActivityManager接口。当客户端(ActivityManager)发起向服务端(AMS)的远程请求时,客户端提供的数据参数信息被封装打包,然后由ActivityManager的远程通信binder对象通过transact()方法把数据提交,然后再把数据写出返回给binder对象。

    public int startActivity(IApplicationThread caller, String callingPackage, Intent intent,String resolvedType, IBinder resultTo, String resultWho, int requestCode,int startFlags, ProfilerInfo profilerInfo, Bundle options) throws RemoteException {Parcel data = Parcel.obtain();Parcel reply = Parcel.obtain();data.writeInterfaceToken(IActivityManager.descriptor);data.writeStrongBinder(caller != null ? caller.asBinder() : null);data.writeString(callingPackage);intent.writeToParcel(data, 0);data.writeString(resolvedType);data.writeStrongBinder(resultTo);data.writeString(resultWho);data.writeInt(requestCode);data.writeInt(startFlags);if (profilerInfo != null) {data.writeInt(1);profilerInfo.writeToParcel(data, Parcelable.PARCELABLE_WRITE_RETURN_VALUE);} else {data.writeInt(0);}if (options != null) {data.writeInt(1);options.writeToParcel(data, 0);} else {data.writeInt(0);}mRemote.transact(START_ACTIVITY_TRANSACTION, data, reply, 0);reply.readException();int result = reply.readInt();reply.recycle();data.recycle();return result;}

通过这种方式,AMS在自己的进程中就能获得ActivityManager进程发来的数据信息,从而完成对于Android系统组件生命周期的调度工作。

Android (AMS)ActivityManagerService源码分析相关推荐

  1. CTS(11)---android自动化测试CTS源码分析之一

    android自动化测试CTS源码分析之一 1, 概述 CTS(Compatibility Test Suite)全名兼容性测试,主要目的就是让Android设备开发商能够开发出兼容性更好的andro ...

  2. android agps,Android应用开发Android GPS ——AGPS源码分析及配置

    本文将带你了解Android应用开发Android GPS --AGPS源码分析及配置,希望本文对大家学Android有所帮助. " Android Framework GPS --AGPS ...

  3. android gps源码分析,Android编程之Android GPS ——AGPS源码分析及配置

    本文主要介绍了Android编程的Android GPS --AGPS源码分析及配置,通过具体的分析以及源码,向大家展示了这些,希望对大家学习Android编程有所帮助. 1:冷启动指令: locat ...

  4. android6.0源码分析之AMS服务源码分析

    activitymanagerservice服务源码分析 1.ActivityManagerService概述 ActivityManagerService(以下简称AMS)作为Android中最核心 ...

  5. android(cm11)状态栏源码分析(一)

    版权声明:您好,转载请留下本人博客的地址,谢谢 https://blog.csdn.net/hongbochen1223/article/details/50216563 (一):写在前面 最近由于工 ...

  6. Android 7.0 源码分析项目一期竣工啦

    从 Android 入行开始,因为工作需求和解决疑难bug的原因陆陆续续的看过一些源码,但都不成系统,从2016年年底开始,在Github上建了一个Android Open Source Projec ...

  7. Android之HandlerThread源码分析和简单使用(主线程和子线程通信、子线程和子线程通信)

    1.先熟悉handler方式实现主线程和子线程互相通信方式,子线程和子线程的通信方式 如果不熟悉或者忘记了,请参考我的这篇博客     Android之用Handler实现主线程和子线程互相通信以及子 ...

  8. Android之AsyncTask源码分析(第五篇:execute方法只能执行一次的原因)

    (注意:本文基于API 28的源码分析,API 29上或其他平台的源码略有不同) 前言 当你调用AsyncTask对象的execute()方法时,突然发生崩溃--内心充满不解:java.lang.Il ...

  9. Android——RIL 机制源码分析

    Android 电话系统框架介绍 在android系统中rild运行在AP上,AP上的应用通过rild发送AT指令给BP,BP接收到信息后又通过rild传送给AP.AP与BP之间有两种通信方式: 1. ...

最新文章

  1. 没学过python、但是还是有公司要-学习python 基础都会了 为什么还是做不出项目呢?...
  2. hdu 2112 HDU Today 最短路(Dijkstra算法)
  3. 线程间操作无效 progressBar2线程不能被访问
  4. python中等高线填充颜色_Python matplotlib等高线图对数颜色
  5. HTML5中的标记方法
  6. bubbo调用Failed to invoke remote method异常解决
  7. 华为哪款手表支持鸿蒙,华为Watch 3最早或于5月发布 采用鸿蒙系统并支持eSIM
  8. 非名校毕业,如何在六天面试六家顶尖科技公司,并拿到全部Offer?
  9. 有趣的算法(一):如何让有情人终成眷属
  10. Android 高效开发调试神器 JRebel
  11. java链式语法_javaScript链式调用原理以及加法实现
  12. 新年礼物第二弹,热升华机械键盘免费抽
  13. 软考 2015年下半年卷 错题知识点记录
  14. wordpress中如何正确书写robots.txt
  15. Mac下Tomcat下载及使用
  16. 微软ad域服务器 管理用户,威联通NAS助企业解决Windows AD域账户管理
  17. 二进制、八进制、十六进制的写法
  18. 修改rpg maker mv的几种上限2020-05-25
  19. Java SE核心I
  20. 小甲鱼python入门_python基础笔记(非系统/自用/参考小甲鱼的零基础入门学习python)上...

热门文章

  1. widow下svn上传项目时的文件可执行权限问题
  2. Linux常用命令汇总--cat
  3. spring 操作对象写入mongo去除_class列
  4. [K/3Cloud] 调用其他界面时通过Session传递对象参数
  5. java遍历文件夹并复制文件到指定目录
  6. RISC-V架构指令集开源
  7. 在线编程网站收集-备用
  8. Javascript语法基础 - Javascript核心(一)
  9. php 什么时候使用单例,php什么时候使用单例模式
  10. windows下安装TensorFlow(Win8 + Anaconda4.4 python3.6)