从任意进程starActivity开始,先上图
![](https://img-blog.csdnimg.cn/img_convert/7d294a4c159a0e718e7691c31ccfa5ac.png)
X进程的先从SystemServerManager拿到ATMS对象
通过ATMS 的 startActivityAsUser 启动
中间经过ActivityStarter RootWindowContainer (Activity栈计算,生命周期计算,参数解析,构建事务) 最终进入ActivityStackSupervisor 执行 startSpecificActivity
void startSpecificActivity(ActivityRecord r, boolean andResume, boolean checkConfig) {
// Is this activity's application already running?
final WindowProcessController wpc =
mService.getProcessController(r.processName, r.info.applicationInfo.uid);
boolean knownToBeDead = false;
if (wpc != null && wpc.hasThread()) {
try {
realStartActivityLocked(r, wpc, andResume, checkConfig);
return;
} catch (RemoteException e) {
Slog.w(TAG, "Exception when starting activity "
+ r.intent.getComponent().flattenToShortString(), e);
}
// If a dead object exception was thrown -- fall through to
// restart the application.
knownToBeDead = true;
}
r.notifyUnknownVisibilityLaunchedForKeyguardTransition();
final boolean isTop = andResume && r.isTopRunningActivity();
mService.startProcessAsync(r, knownToBeDead, isTop, isTop ? "top-activity" : "activity");
}
这时窗口已经黑白屏,做个判断,要启动的ActivityRecord的进程已经存在直接启动act,否则启动进程,这里就当没有进程。
ATMS 的startProcessAsync -》 AMS 的starProcess开始启动进程。
启动进程ProcessList (startProcess) -》Process(start)-> Zygote(start),这当中开启socket,准备新进程的参数,构建回调的返回类;打开一个流写入消息
此时在ZyGote(ZygoteServer)的进程里有个无限循环读取请求命令,满足条件后通过jni 调用fork一个新进程
此时通过反射拿到Application进程的类,找到main函数执行。
// Remaining arguments are passed to the start class's static main
return findStaticMain(args.startClass, args.startArgs, classLoader);
把app进程的binder对象给AMS ,attachApplicationLocked-》
// Make app active after binding application or client may be running requests (e.g
// starting activities) before it is ready.
app.makeActive(thread, mProcessStats);
调用ATMS 的 attachApplication 启动Activity