ActivityManagerService 你了解多少?

在這篇文章中,給大家帶來AMS的技術分享。AMS(ActivityManagerService)是貫穿Android系統組件的核心服務,負責了系統中四大組件的啟動、切換、調度以及應用進程管理和調度工作。因此想要了解Android的內部工作機制,就必須先了解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之間通信需要利用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系統組件生命周期的調度工作。

 

來自:http://www.jianshu.com/p/194a37755fea

 

 本文由用戶 RapSchaeffe 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!