AMS

作者: WellsCai | 来源:发表于2023-08-15 12:32 被阅读0次

    本文用于记录AMS的相关知识总结。

    AMS(ActivityManagerService)主要负责系统中四大组件的启动、切换、调度及应用进程的管理和调度等工作。

    1. Activity的启动

    在我们平常的调用中,我们在Activity中调用startActivity(Intent intent),实际调用的代码的层次是Activity → Instrumentation → ActivityManager → IActivityManager (AMS),Instrumentation作为一个中转站,或者是切入面,来通知AMS去实现对应的功能。

    ① Activity

    这个没啥好说的,Activity的启动函数。需要注意的是,实际上的启动过程跳转到mInstrumentation,也就是Instrumentation类中。

    @Override
    public void startActivity(Intent intent) {
        this.startActivity(intent, null);
    }
    
    @Override
    public void startActivity(Intent intent, @Nullable Bundle options) {
        if (options != null) {
            startActivityForResult(intent, -1, options);
        } else {
            // Note we want to go through this call for compatibility with
            // applications that may have overridden the method.
            startActivityForResult(intent, -1);
        }
    }
    
    public void startActivityForResult(@RequiresPermission Intent intent, int requestCode,
                @Nullable Bundle options) {
        if (mParent == null) {
            ...
            // 委托给 Instrumentation
            Instrumentation.ActivityResult ar =
                mInstrumentation.execStartActivity(
                    this, mMainThread.getApplicationThread(), mToken, this,
                    intent, requestCode, options);
            ....
        }
        ...
    }
    
    ② Instrumentation

    Instrumentation的启动是交给ActivityManager.getService(),实际上也就是AMS了。

    public ActivityResult execStartActivity(
              Context who, IBinder contextThread, IBinder token, Activity target,
              Intent intent, int requestCode, Bundle options) {
        ...
        try {
            ...
            // 找到 AMS 告知要启动 Activity
            int result = ActivityManager.getService()
                .startActivity(whoThread, who.getBasePackageName(), intent,
                        intent.resolveTypeIfNeeded(who.getContentResolver()),
                        token, target != null ? target.mEmbeddedID : null,
                        requestCode, 0, null, options); 
            ...             
        }
        ...
    }
    
    ③ ActivityManager

    ActivityManager.getService() 会获取 IActivityManager,它是一个 binder 代理对象。从代码可以看出,当使用 ActivityManager.getService() 对象调用方法时,实际上已经在做跨进程通信,由 binder 代理对象和 AMS 通信,通信所在的进程是 system_server。

    public static IActivityManager getService() {
        return IActivityManagerSingleton.get();
    }
    
    private static final Singleton<IActivityManager> IActivityManagerSingleton =
            new Singleton<IActivityManager>() {
                @Override
                protected IActivityManager create() {
                    // 通过 ServiceManager 获取 AMS 服务
                    // IActivityManager 是 binder 代理
                    final IBinder b = ServiceManager.getService(Context.ACTIVITY_SERVICE);
                    final IActivityManager am = IActivityManager.Stub.asInterface(b);
                    return am; 
                }
            };
    
    App 的启动过程

    ① 调用 startActivity() 时,实际会走到 Instrumentation,由它与 AMS 通信
    Instrumentation 会找 ServiceManager 获取 AMS(实际是获取 binder 代理)调用 startActivity()。在 9.0 之前是获取 AMS,9.0 之后是获取 ATMS。

    ② AMS 找到 PMS 获取启动的 Activity 信息。

    ③ 然后判断需要启动的 Activity 所在进程是否已存在,不存在 AMS 通过 socket 通知 Zygote fork 进程,然后反射调用 ActivityThread 的 main(),创建 Instrumentation、Application 和 Activity 以及走生命周期流程。

    相关文章

      网友评论

          本文标题:AMS

          本文链接:https://www.haomeiwen.com/subject/orqntdtx.html