所有涉及的代码基于 Android 10 API 29
Zygote启动
Init进程启动后读取init.rc
脚本, 启动Zygote进程, Zygote进程启动过程中会fork一个SystemServer的子进程出来,Zygote进程之后会创建一个Socket连接,进入runSelectLoop
等待其他进程连接,在processOneCommand
方法中处理连接请求(其他应用程序fork子进程的请求)
SystemServer进程启动
Zygote进程启动过程中会去启动SystemServer进程,SystemServer
在其main
方法中依次通过startBootstrapServices
、startCoreServices
、startOtherServices
来启动系统相关的核心服务
AMS启动
AMS在startBootstrapServices
方法中启动, 运行在SystemServer进程中, 有一个独立的 HandlerThread
来处理消息, AMS启动完成后在 startOtherServices
中会调用 systemReady
方法来启动Launcher
AMS#systemReady
systemReady
中通过 startHomeOnAllDisplays
启动 Launcher, 最终经过复杂的调用过程, 请求 Zygote fork 出 Launcher 进程
Zygote fork Launcher子进程
Zygote fork 出 Launcher 的子进程后会通过反射调用 ActivityThread
的 main
方法完成应用程序的启动
ActivityThread#main
ActivityThread
的main
方法中掉用 attach
方法, 通过 IPC 调用 AMS 的 attachApplication
方法
AMS#attachApplication
调用 attachApplicationLocked
方法, 通过下面两个步骤分别创建 Application 和根 Activity
- thread.bindApplication: thread 为 IApplicationThread 类型, 是Binder对象, 通过 IPC 最终调用到应用程序 ApplicationThread 的
bindApplication
方法, 最终通过主线程的 HandlerH
发送一个BIND_APPLICATION
的消息, 主线程通过handleBindApplication
方法进行处理,最终通过Instrumentation
的callApplicationOnCreate
调用的 Application 对象的onCreate
方法- mAtmInternal.attachApplication: mAtmInternal 为 ATMS 的 LocalService 类型, 其会调用到
RootActivityContainer
的attachApplication
, 最终调用ActivityStackSupervisor
的realStartActivityLocked
完成根 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;
复制代码
TransactionExecutor
在execute
里面会执行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
方法