Activity啓動源碼分析-基於Android10(二)


總流程圖
在這裏插入圖片描述

  • Instrumentation
    負責調用Activity和Application生命週期。
  • ActivityTaskManagerService
    負責Activity管理和調度等工作。android10中新增的
  • ActivityManagerService
    負責管理四大組件和進程,包括生命週期和狀態切換。
  • ActivityTaskManagerInternal
    ActivityTaskManagerService對外提供的一個抽象類,真正的實現在ActivityTaskManagerService#LocalService
  • ActivityThread
    管理應用程序進程中主線程的執行
  • ActivityStackSupervisor
    負責所有Activity棧的管理
  • TransactionExecutor
    主要作用是執行ClientTransaction
  • ClientLifecycleManager
    生命週期的管理調用

客戶端和服務端IPC通信

1.基於Android10的IPC

上篇文章Activity啓動流程-基於Android10(一)已經講到了 Instrumentation的execStartActivity方法。其實Android10版本和之前版本的代碼是有區別。

execStartActivity:

frameworks\base\core\java\android\app\Instrumentation.java

	@UnsupportedAppUsage
    public ActivityResult execStartActivity(
            Context who, IBinder contextThread, IBinder token, String resultWho,
            Intent intent, int requestCode, Bundle options, UserHandle user) {
   //...省略部分代碼
   try {
            intent.migrateExtraStreamToClipData();
            intent.prepareToLeaveProcess(who);
            // 重要代碼
            int result = ActivityTaskManager.getService()
                .startActivityAsUser(whoThread, who.getBasePackageName(), intent,
                        intent.resolveTypeIfNeeded(who.getContentResolver()),
                        token, resultWho,
                        requestCode, 0, null, options, user.getIdentifier());
            checkStartActivityResult(result, intent);
        } catch (RemoteException e) {
            throw new RuntimeException("Failure from system", e);
        }
        return null;
   //...省略部分代碼

代碼調用了ActivityTaskManager的getService方法,讓我們看下里面的邏輯處理

frameworks\base\core\java\android\app\ActivityTaskManager.java

	/** @hide */
    public static IActivityTaskManager getService() {
        return IActivityTaskManagerSingleton.get();
    }

    @UnsupportedAppUsage(trackingBug = 129726065)
    private static final Singleton<IActivityTaskManager> IActivityTaskManagerSingleton =
            new Singleton<IActivityTaskManager>() {
                @Override
                protected IActivityTaskManager create() {
                    final IBinder b = ServiceManager.getService(Context.ACTIVITY_TASK_SERVICE);
                    return IActivityTaskManager.Stub.asInterface(b);
                }
            };

(關於Singleton類的講解可以參考我的這篇文章Android源碼隨心看系列:Singleton)
通過代碼可以看出getService是獲取了IActivityTaskManager.aidl接口,那麼是哪個類實現了這個接口呢?答案是ActivityTaskManangerService。代碼如下:

frameworks\base\services\core\java\com\android\server\wm\ActivityTaskManagerService.java

// ActivityTaskManagerService繼承IActivityTaskManager.Stub
// IActivityTaskManager.Stub是Android根據aidl文件生成的java代碼
public class ActivityTaskManagerService extends IActivityTaskManager.Stub {
    private static final String TAG = TAG_WITH_CLASS_NAME ? "ActivityTaskManagerService" : TAG_ATM;
    private static final String TAG_STACK = TAG + POSTFIX_STACK;
    private static final String TAG_SWITCH = TAG + POSTFIX_SWITCH;
    private static final String TAG_IMMERSIVE = TAG + POSTFIX_IMMERSIVE;
    private static final String TAG_FOCUS = TAG + POSTFIX_FOCUS;
    private static final String TAG_VISIBILITY = TAG + POSTFIX_VISIBILITY;
    private static final String TAG_LOCKTASK = TAG + POSTFIX_LOCKTASK;
    private static final String TAG_CONFIGURATION = TAG + POSTFIX_CONFIGURATION;
    //...省略部分代碼
    int startActivityAsUser(IApplicationThread caller, String callingPackage,
            Intent intent, String resolvedType, IBinder resultTo, String resultWho, int requestCode,
            int startFlags, ProfilerInfo profilerInfo, Bundle bOptions, int userId,
            boolean validateIncomingUser) {
        enforceNotIsolatedCaller("startActivityAsUser");

        userId = getActivityStartController().checkTargetUser(userId, validateIncomingUser,
                Binder.getCallingPid(), Binder.getCallingUid(), "startActivityAsUser");

        // TODO: Switch to user app stacks here.
        return getActivityStartController().obtainStarter(intent, "startActivityAsUser")
                .setCaller(caller)
                .setCallingPackage(callingPackage)
                .setResolvedType(resolvedType)
                .setResultTo(resultTo)
                .setResultWho(resultWho)
                .setRequestCode(requestCode)
                .setStartFlags(startFlags)
                .setProfilerInfo(profilerInfo)
                .setActivityOptions(bOptions)
                .setMayWait(userId)
                .execute();

    }
    //...省略部分代碼

最後調用的是ActivityTaskManagerService中的startActivityAsUser方法。通過分析可以知道了IActivityTaskManager.aidl就是Activity和ActivityTaskManagerService之間的橋樑。Activity的startActivity最終是調用了ActivityTaskManagerService中的startActivityAsUser方法

簡化流程示意圖:
Activity .javaIActivityTaskManager.aidl\xRightarrow{IActivityTaskManager.aidl}ActivityTaskManagerService.java

2.基於Android10以下的IPC

以上講的是基於Android10的IPC,低於Android10的版本的IPC在細節上有些不一樣,但是本質上是相同的。
還是回到execStartActivity方法:

frameworks\base\core\java\android\app\Instrumentation.java

    public ActivityResult execStartActivity(
            Context who, IBinder contextThread, IBinder token, Activity target,
            Intent intent, int requestCode, Bundle options) {
        ...
        try {
            intent.migrateExtraStreamToClipData();
            intent.prepareToLeaveProcess(who);
            // 重要代碼
            int result = ActivityManager.getService()
                .startActivity(whoThread, who.getBasePackageName(), intent,
                        intent.resolveTypeIfNeeded(who.getContentResolver()),
                        token, target != null ? target.mEmbeddedID : null,
                        requestCode, 0, null, options);
            checkStartActivityResult(result, intent);
        } catch (RemoteException e) {
            throw new RuntimeException("Failure from system", e);
        }
        return null;
    }

老版本用的是ActivityManager類,但是代碼結構和Android10的ActivityTaskManager是一致。

ActivityManager:

platform\frameworks_base\core\java\android\app\ActivityManager.java

	/**
     * @hide
     */
    @UnsupportedAppUsage
    public static IActivityManager getService() {
        return IActivityManagerSingleton.get();
    }

    private static IActivityTaskManager getTaskService() {
        return ActivityTaskManager.getService();
    }

    @UnsupportedAppUsage
    private static final Singleton<IActivityManager> IActivityManagerSingleton =
            new Singleton<IActivityManager>() {
                @Override
                protected IActivityManager create() {
                // 這裏的IBinder其實是IActivityManager.aidl接口
                    final IBinder b = ServiceManager.getService(Context.ACTIVITY_SERVICE);
                    final IActivityManager am = IActivityManager.Stub.asInterface(b);
                    return am;
                }
            };

老版本用的是IActivityManager.aidl做IPC通訊的。大名鼎鼎的ActivityManagerService繼承IActivityManger.aidl接口。所以老版本(Android 8.0及其以上)用IActivityManger做爲IPC接口

簡化流程示意圖:
Activity .javaIActivityManager.aidl\xRightarrow{IActivityManager.aidl}ActivityManagerService.java

下一篇:Activity啓動源碼分析-基於Android10(三)

參考文章:Activity的啓動流程-基於Android10源碼

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章