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系統組件生命週期的調度工做。

相關文章
相關標籤/搜索