美文网首页
APP启动流程 基于android 11

APP启动流程 基于android 11

作者: 路人甲1234 | 来源:发表于2020-11-30 21:03 被阅读0次

    相关类
    Activity 管理UI
    ActivityThread:进程入口,管理进程的相关事件处理。主线程入口。
    包括许多内部类,其中H类是Handler类,控制了所有的应用程序事件:


    image.png

    LoadedApk : packageInfo

    ApplicationThread:这是ActivityThread的内部类,它继承了binder.是ActivityThread与AMS通信的桥梁。


    image.png

    这里可以可以看到APP启动的大致流程,下面我们会对这个流程中的单个流程大致分析。

    image.png

    上图中主要是对启动流程图的第一步再细化
    1-2从Launcher到Activity的方法调用都没什么好说的。最后传到Activity里面调用startAxtivityForResult()就是传入了一个intent。
    3中startAxtivityForResult()里面主要做了两步,一步是4-5,通过binder调用AMS startActivity(),这里首先是调用Instrumentation.execStarActivitity(),

        public void startActivityForResult(@RequiresPermission Intent intent, int requestCode,
                @Nullable Bundle options) {
            if (mParent == null) {
                options = transferSpringboardActivityOptions(options);
                Instrumentation.ActivityResult ar =
                    mInstrumentation.execStartActivity(
                        this, mMainThread.getApplicationThread(), mToken, this,
                        intent, requestCode, options);
                if (ar != null) {
                    mMainThread.sendActivityResult(
                        mToken, mEmbeddedID, requestCode, ar.getResultCode(),
                        ar.getResultData());
                }
    

    execStartActivity()里面调用ActivityTaskManager.getService()获取到IActivityTaskManager,IActivityTaskManager通过binder然后就请求到AMS

      public ActivityResult execStartActivity(
      ......
            try {
                intent.migrateExtraStreamToClipData(who);
                intent.prepareToLeaveProcess(who);
                int result = ActivityTaskManager.getService().startActivity(whoThread,
                        who.getBasePackageName(), who.getAttributionTag(), 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;
        }
    

    另一步6后面再说。到此就完成了launcher到AMS的请求。下面是AMS的server端处理

    下图是AMS端的调用流程


    image.png

    executeRequest()这个方法很长,做了很多事,首先看到注释对此方法的描述


    image.png

    这个方法里面主要会对ActivityRecord和Task进行初始化或取用

    关于ActivityRecord 和Task相关不再这里详述,参考下图和相关连接

    ActivityRecord及相关数据结构,类的关系图:


    image.png

    ActivityRecord、TaskRecord、ActivityStack的相关知识点
    https://www.jianshu.com/p/94816e52cd77
    https://juejin.cn/post/6856298463119409165

    最后

    相关文章

      网友评论

          本文标题:APP启动流程 基于android 11

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