ActivityManagerService 你了解多少?

从这篇文章开始,我想把本身对于Framework源码的理解详细的进行分析和阐述,固然本身在阅读这些代码的时候也大量的进行了其余资料的阅读和学习。我但愿经过个人分享可以带给你们对于Android由浅入深的理解。java

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

AMS的内部实现


AMS原理模型

1. ActivityManager

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

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

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做为一个重要的核心服务就是在这里被初始成功的。spa

AMS与ActivityManager的通讯实现


AMS与ActivityManager通讯流程


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

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

public List getAppTasks() {
        ArrayList tasks = new ArrayList();
        List appTasks;
        try {
            appTasks = ActivityManagerNative.getDefault().getAppTasks(mContext.getPackageName());
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
        }
        ...
        return tasks;
    }复制代码

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

/**
     * Retrieve the system's default/global activity manager.
     */
    static public IActivityManager getDefault() {
        return gDefault.get();
    }复制代码
private static final Singleton gDefault = new Singleton() {
        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系统组件生命周期的调度工做。

相关文章
相关标签/搜索