Launcher的启动过程

所有涉及的代码基于 Android 10 API 29

Zygote启动

Init进程启动后读取init.rc脚本, 启动Zygote进程, Zygote进程启动过程中会fork一个SystemServer的子进程出来,Zygote进程之后会创建一个Socket连接,进入runSelectLoop等待其他进程连接,在processOneCommand方法中处理连接请求(其他应用程序fork子进程的请求)

SystemServer进程启动

Zygote进程启动过程中会去启动SystemServer进程,SystemServer在其main方法中依次通过startBootstrapServicesstartCoreServicesstartOtherServices来启动系统相关的核心服务

AMS启动

AMS在startBootstrapServices方法中启动, 运行在SystemServer进程中, 有一个独立的 HandlerThread来处理消息, AMS启动完成后在 startOtherServices 中会调用 systemReady 方法来启动Launcher

AMS#systemReady

systemReady 中通过 startHomeOnAllDisplays 启动 Launcher, 最终经过复杂的调用过程, 请求 Zygote fork 出 Launcher 进程

Zygote fork Launcher子进程

Zygote fork 出 Launcher 的子进程后会通过反射调用 ActivityThreadmain 方法完成应用程序的启动

ActivityThread#main

ActivityThreadmain方法中掉用 attach 方法, 通过 IPC 调用 AMS 的 attachApplication 方法

AMS#attachApplication

调用 attachApplicationLocked方法, 通过下面两个步骤分别创建 Application 和根 Activity

  1. thread.bindApplication: thread 为 IApplicationThread 类型, 是Binder对象, 通过 IPC 最终调用到应用程序 ApplicationThread 的 bindApplication 方法, 最终通过主线程的 Handler H 发送一个 BIND_APPLICATION 的消息, 主线程通过 handleBindApplication 方法进行处理,最终通过 InstrumentationcallApplicationOnCreate 调用的 Application 对象的 onCreate 方法
  2. mAtmInternal.attachApplication: mAtmInternal 为 ATMS 的 LocalService 类型, 其会调用到 RootActivityContainerattachApplication, 最终调用 ActivityStackSupervisorrealStartActivityLocked 完成根 Activity 的启动流程

Activity的启动

接上面 ActivityStackSupervisor#realStartActivityLocked 方法,创建 ClientTransaction 对象, 该类实现了Parcelable接口可以跨进程传递, 并添加 LaunchActivityItem 的 Callback, 最终调用ClientLifecycleManager#scheduleTransaction(ClientTransaction)进行处理

void scheduleTransaction(ClientTransaction transaction) throws RemoteException {
    final IApplicationThread client = transaction.getClient();
    transaction.schedule();
    if (!(client instanceof Binder)) {
        transaction.recycle();
    }
}

// ClientTransaction#schedule
public void schedule() throws RemoteException {
    // mClient 是 IApplicationThread 类型
    mClient.scheduleTransaction(this);
}
复制代码

最终转回到应用程序的 ApplicationThread 中

public void scheduleTransaction(ClientTransaction transaction) throws RemoteException {
    ActivityThread.this.scheduleTransaction(transaction);
}
复制代码

ActivityThread 继承 ClientTransactionHandler

void scheduleTransaction(ClientTransaction transaction) {
    transaction.preExecute(this);
    // 利用 ActivityThread 的 Handler 发了一条消息
    sendMessage(ActivityThread.H.EXECUTE_TRANSACTION, transaction);
}
// Handler H 中的处理
case EXECUTE_TRANSACTION:
    final ClientTransaction transaction = (ClientTransaction) msg.obj;
    // 通过 executor 执行 transaction
    mTransactionExecutor.execute(transaction);
    if (isSystem()) {
        transaction.recycle();
    }
    break;
复制代码

TransactionExecutorexecute里面会执行executeCallbacks(transaction);, 这里会执行上面添加的 LaunchActivityItem Callback

public void execute(ClientTransactionHandler client, IBinder token,
    PendingTransactionActions pendingActions) {
    ActivityClientRecord r = new ActivityClientRecord(token, mIntent, mIdent, mInfo,
        mOverrideConfig, mCompatInfo, mReferrer, mVoiceInteractor, mState, mPersistentState,
        mPendingResults, mPendingNewIntents, mIsForward,
        mProfilerInfo, client, mAssistToken);
    // 启动 Activity
    client.handleLaunchActivity(r, pendingActions, null /* customIntent */);
}
复制代码

这里的 client 为 ClientTransactionHandler 类型 (ActivityThread的父类), 最终调用到 ActivityThread 的 handleLaunchActivity, 进一步调用到 performLaunchActivity, 该方法中会创建 ContextImpl实例, 并调用 Activity#attach方法

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享