Android Framework- AMS 之 Activity启动代码梳理

346 阅读6分钟

基础代码流程

Activity.class ::startActivity()
    -->startActivityForResult()  //往下传的参数 IBinder 是当前 mMainThread.getApplicationThread() 和mtoken 
-->Instrumentation.class ::execStartActivity(Context who, IBinder contextThread, IBinder token, Activity target,Intent intent, int requestCode, Bundle options)
-->ActityManangerService.class ::startActivity()//这里传递了ApplicationThread
      -->startActivityAsUser()
      -->ActivityStarter.class ::execute()//设置进去了IApplicationThread 和Intent 给mRequest 这里也涉及到了权限的提升和充值
        --> executeRequest()//  mService.getProcessController(caller); 这里找到对应app  构建 ActivityRecord 将找到的app (WindowProcessController)塞入进去
         -->startActivityUnchecked()
         -->startActivityInner()//setInitialState() 将 r 给了mStartActivity
        //这里还调用了startActivityLocked() 将对应的activity开始构建挂载 挂载的task 还会将activityRecord 挂到最上层
        RootWindowContainer.class::resumeFocusedTasksTopActivities()
          -->  Task.class:: resumeTopActivityUncheckedLocked
               -->resumeTopActivityInnerLocked()
              -->ActivityTaskSupervisor.class::startSpecificActivity();//假设需要创建页面
​
​
        

到这里分2个分支 一种进程存在,一种进程不存在

进程存在

 ActivityTaskSupervisor::realStartActivityLocked(){
  
                final ClientTransaction clientTransaction = ClientTransaction.obtain(
                        proc.getThread(), r.appToken);
   
   //基本上是基于事件去驱动了
   
    if (andResume) {
                    lifecycleItem = ResumeActivityItem.obtain(isTransitionForward);
                } else {
                    lifecycleItem = PauseActivityItem.obtain();
                }
  
   //在callBack 里设置 LaunchActivityItem()
   clientTransaction.addCallback(LaunchActivityItem.obtain(new Intent(r.intent),
                        System.identityHashCode(r), r.info,
                     
                        mergedConfiguration.getGlobalConfiguration(),
                        mergedConfiguration.getOverrideConfiguration(), r.compat,
                        r.launchedFromPackage, task.voiceInteractor, proc.getReportedProcState(),
                        r.getSavedState(), r.getPersistentSavedState(), results, newIntents,
                        r.takeOptions(), isTransitionForward,
                        proc.createProfilerInfoIfNeeded(), r.assistToken, activityClientController,
                        r.createFixedRotationAdjustmentsIfNeeded(), r.shareableActivityToken,
                        r.getLaunchedFromBubble()));
     
      //ClientTransaction 中的 client 其实就是appThread
       mService.getLifecycleManager().scheduleTransaction(clientTransaction);
       
 }
 -->ClientLifecycleManager.java::scheduleTransaction(){
    final IApplicationThread client = transaction.getClient();
   -->
  ClientTransaction.java::schedule();
   { //其实就是AppThread  就是上面一路传递过来的
      mClient.scheduleTransaction(this);
​
 }
-----------------------
 回调 ActitvityThread 中的ApplicationThread 的scheduleTransaction
  public void scheduleTransaction(ClientTransaction transaction) throws RemoteException {
            ActivityThread.this.scheduleTransaction(transaction);
 }
// 回调 ActivityThread 的scheduleTransaction()  因为  ActivityThread 继承  ClientTransactionHandler 走 父类方法
 ClientTransactionHandler.class ::scheduleTransaction(){
     sendMessage(ActivityThread.H.EXECUTE_TRANSACTION, transaction);
 }  
   //查看 消息响应
   
   handleMessage(){
      case EXECUTE_TRANSACTION:
    final ClientTransaction transaction = (ClientTransaction) msg.obj;
        mTransactionExecutor.execute(transaction);
       break;
   }
 -->TransactionExecutor.java:: execute(){
     executeCallbacks(transaction);
   {
      final List<ClientTransactionItem> callbacks = transaction.getCallbacks();
        final ClientTransactionItem item = callbacks.get(i);
      //LaunchActivityItem 上面传入的
      item.execute(mTransactionHandler, token, mPendingActions);
   } 
      
 }
--->  LaunchActivityItem.class ::execute(){
     ActivityClientRecord r = client.getLaunchingActivity(token);
      // 回调 ActivityThread.handleLaunchActivity
        client.handleLaunchActivity(r, pendingActions, null /* customIntent */);
        
}
   -->
    ActivityThread.class::handleLaunchActivity(){
        final Activity a = performLaunchActivity(r, customIntent);//反射构建 调用剩下生命周期
      
    }
 

进程不存在

    
ActivityTaskSupervisor.class::startSpecificActivity(){
  //省略。。。。
    mService.startProcessAsync(r, knownToBeDead, isTop, isTop ? "top-activity" : "activity");
}
ActivityTaskManagerService.class::startProcessAsync();{
  
   final Message m = PooledLambda.obtainMessage(ActivityManagerInternal::startProcess,
                    mAmInternal, activity.processName, activity.info.applicationInfo, knownToBeDead,
                    isTop, hostingType, activity.intent.getComponent());
            mH.sendMessage(m);
}
-->ActivityManagerInternal::startProcess()
  -->startProcess()
  -->startProcessLocked()
  ProcessList.class::startProcessLocked()
    -->startProcess()
    -->Process.class ::start()
      -->ZygoteProcess.class::start()
        -->startViaZygote()//拼装启动参数argsForZygote
        -->zygoteSendArgsAndGetResult(openZygoteSocketIfNeeded(abi),//该方法打开和zygote的套接字
                                              zygotePolicyFlags,
                                              argsForZygote)
        
        -->
        //将参数拼接字符串后 io操作
        attemptZygoteSendArgsAndGetResultI(zygoteState, msgStr){
        
        
         final BufferedWriter zygoteWriter = zygoteState.mZygoteOutputWriter;
            final DataInputStream zygoteInputStream = zygoteState.mZygoteInputStream;
            zygoteWriter.write(msgStr);
            zygoteWriter.flush();
            Process.ProcessStartResult result = new Process.ProcessStartResult();
            result.pid = zygoteInputStream.readInt();
            result.usingWrapper = zygoteInputStream.readBoolean();
​
      }
​

备注:

zygoteProcess 里面 public static final String PRIMARY_SOCKET_NAME = "zygote";` `public static final String SECONDARY_SOCKET_NAME = "zygote_secondary";

在调用 openZygoteSocketIfNeeded() 调用 attemptConnectionToPrimaryZygote(); 会和zygote 进行socket 链接, 而链接的端口的启动 是在zygoteInit.class里面 main() 里构建了ZygoteServer() 在他的构造方法里 构建了 这两个端口

总结:

总结:将构建参数通过socket 传递给zygote 事先知道了zygoye的地址 在Android系统中,usap_pool_primary是一个UNIX域套接字(LocalSocket),它扮演着Zygote进程与其他系统组件之间通信桥梁的角色,尤其是与SystemServer相关的通信。Zygote在启动时会创建两个主要的socket:一个是众所周知的zygote socket,另一个就是usap_pool_primary

zygote socket主要用于孵化新的应用程序进程,当系统需要创建一个新的App进程时,会通过这个socketZygote发送请求。而usap_pool_primary socket的存在目的稍微特殊一些,它是用来支持所谓的“预先创建的进程池”(pre-forked process pool)机制的一个部分。

预先创建的进程池是一种优化策略,旨在减少进程创建的延迟。在这个机制下,Zygote会在启动时预先fork出一定数量的子进程,并让这些子进程保持空闲状态,监听在usap_pool_primary socket上。当系统有快速启动服务或进程的需求时,比如启动System Server或者是其他需要快速响应的系统组件,就可以直接从这个进程池中挑选一个进程来使用,而无需经历完整的进程创建过程。这样可以显著加快这些关键服务的启动速度。

简而言之,usap_pool_primary socket是Android系统为了提高某些关键服务启动效率而设计的一个通信通道,它辅助实现了进程预创建和快速分配,是系统性能优化的一部分。

进入zygote

ZygoteInit.class::main(){
  caller = zygoteServer.runSelectLoop(abiList);
   caller.run();
}
-->ZygoteServer.class::runSelectLoop();//while ture 等待传递的数据
 //构建出来 ZygoteConnection 并将传递过来的参数赋值进去
--> //这里返回的是一个Runnable 下面的代码追踪都是为了返回该Runnable
ZygoteConnection.class::processCommand(this, multipleForksOK);
-->handleChildProc(parsedArgs, childPipeFd,parsedArgs.mStartChildZygote);
--> ZygoteInit.class::zygoteInit();
-->RuntimeInit.calss::applicationInit(); 
   -->findStaticMain()//其实就是反射构建对应类 并构建main 方法后返回 这里构建的是ActivityThread ,下图断点
 
  
​

image-20240519233450336.png

进入 ActivityThread

ActivityThread.class::main(){
 ActivityThread thread = new ActivityThread();//构建thread
        thread.attach(false, startSeq);
}
​
::attach(){
  // 获取Ams  让他管理当前应用
   final IActivityManager mgr = ActivityManager.getService();
   mgr.attachApplication(mAppThread, startSeq);
}
​
-->ActivityManagerService::attachApplication()
--> attachApplicationLocked(thread, callingPid, callingUid, startSeq){
 
 thread.bindApplication () // 调用了ActivityThread.bindApplication  这里包含了application的构建和基本参数的设定。
 
  mAtmInternal.attachApplication(app.getWindowProcessController())
}
  -->attachApplication()
--> RootWindowContainer.class::attachApplication()//通过 ATMS 启动根 Activity
   -->startActivityForAttachedApplicationIfNeeded()
   -->mTaskSupervisor.realStartActivityLocked()// 承接我们编写好的进程存在的页面启动流程
  

备注

在应用桌面点击 其实会调用到

Laucher.class::startActivitySafely()

->BaseDraggingActivity.class::startActivitySafely --> Activity.class:: startActivity(intent, optsBundle);

一个页面的启动 其实会涉及多个生命周期,我们只是单纯的抓个一个走到底,真正开发的时候还是需要多去打堆栈去观察,多思考。

其实某种程度来说 ,在wms的角度看,其实就是挂载层级的的window 向前挪和向后挪。

之前好奇 Task的构建过程 ,其实是在ActivityStarterstartActivityInner 中构建的新的task

if (newTask) {
            final Task taskToAffiliate = (mLaunchTaskBehind && mSourceRecord != null)
                    ? mSourceRecord.getTask() : null;
            setNewTask(taskToAffiliate);
        } else if (mAddingToTask) {
            addOrReparentStartingActivity(targetTask, "adding to task");
        }

一个Activity 在启动的过程中,涉及到前一个页面的隐藏,这个逻辑简单记录一下

ActivityStarter.startActivityInner()
  --> mRootWindowContainer.resumeFocusedTasksTopActivities(
                        mTargetRootTask, mStartActivity, mOptions, mTransientLaunch);
  -->RootWindowContainer.resumeFocusedTasksTopActivities()
    -->Task.resumeTopActivityUncheckedLocked()
     -->resumeTopActivityInnerLocked()
      -->  boolean pausing = !deferPause && taskDisplayArea.pauseBackTasks(next);
     -->pauseBackTasks()
       -->task.startPausingLocked()
     {
       //这里构建了 暂停的item
         mAtmService.getLifecycleManager().scheduleTransaction(prev.app.getThread(),
                            prev.appToken, PauseActivityItem.obtain(prev.finishing, userLeaving,
                                    prev.configChangeFlags, pauseImmediately));
     }

再次做总结:

从类型转变上来说可以是核心 构建ActivityRecord 因为 继承windowToken,

在ActivityStarer.executeRequest() 构建 一个新的 ActivityRecord 包含跳转的页面的所有参数, 在startActivityInner()里面 setInitialState 先进行赋值活动,然后

判断是否是 task 挂载问题,涉及到栈顶等问题,这里会有多种情况,挂载现有,挂载到最上层显示的,挂载到root上等, 然后会将该页面开始启动挂载流程, 然后 在 RootWindowContainer 调用 resumeFocusedTasksTopActivities()调用taskresumeTopActivityUncheckedLocked 构建 ClientTransaction 构建 然后塞进去了 ActivityLifecycleItem ,最后调用执行,最后会调用binder 执行到ActivityThread,

ApplicationThreadscheduleTransaction ,最后基于消息 会调用到 基于消息 开始调用生命周期 performLaunchActivity() 等 反射构建Activity , 检查对应的Application进程是否存在,然后反射调用启动

,然后反射调用attach 构建phoneWindow 等 最后 基于生命周期不断的推进状态,然后开始调用onCreat()onResumeoncreat() 里面 构建出对应开始对布局进行解析, 构建decorview, 并将构建出来的布局 挂载到decoviewidcontentview 上,

onResume() 里面做的就比较多了 在 执行 执行 resumeActivityItem 会调用到 handleResumeActivity()的时候 会调用WindowManagerImp.addView() 构建 ViewRootImpl并将原来构建好的view 设置进去。 并加入 mRoots

ViewRootImpl 是核心类, 构造函数构建出了 第一构造了windowSession, 构建了W类 可以 传递给wms,可以监听wms 的回调 setview ()构建了inputchannel。 构建了 InputQueueWindowInputEventReceiver 保证了触摸事件的回调。

然后 触发了 requestLayout(); 会进行状态的推进。

关于Activitytoken的构建,其实是依赖于Intent构建出来的。

image-20240808234912843.png

image-20240808234931307.png