本文基于Android 11,主要分析应用程序的启动流程,会直接定位到ActivityStackSupervisor.startSpecificActivity
函数开始,因为该函数前面的内容主要在Activity的启动流程中,可以通过这部分的文章来阅读。
看源码流程,需要戒骄戒躁,心态好。配合源码使用,建议先收藏,夜深人静,心血来潮再看。
通过分析应用进程的启动流程,可以得到:
- 在Framework层,现在不止有AMS负责请求Zygote进程创建新进程,还有ATMS、ActivityStarter、ActivityTaskManger、ActivityTaskS在协助分担一些参数和逻辑的检查。
- 每个进程都是通过fork Zygote进程而来,且获得Java虚拟机。也就是说每一个应用进程都有自己的虚拟机。
- 应用进程是通过Soket去请求Zygote进程fork自己的。
- 每个进程都有自己的Binder线程池用于IPC。
- 每个应用进程的主线程在ActivityThread,其main函数会创建消息循环机制。
1、ActivityStackSupervisor.startSpecificActivity
ATMS有一个ProcessMap类型的mProcessNames ,用于存储封装了已启动进程信息ProcessRecord和窗口信息Windows的WindowProcessController实例。WindowProcessController用于协调ActivityManger管理ProcessReocrd和WindwManger管理WIndow和Activity的关系。
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()) {
realStartActivityLocked(r, wpc, andResume, checkConfig);
return;
...
knownToBeDead = true;
}
r.notifyUnknownVisibilityLaunchedForKeyguardTransition();
final boolean isTop = andResume && r.isTopRunningActivity();
mService.startProcessAsync(r, knownToBeDead, isTop, isTop ? "top-activity" : "activity");
}
这里的mService
是ActivityTaskManagerService
的实例,通过getProcessController
函数获得当前wpc
对象,判断当前启动应用进程是否启动wpc != null && wpc.hasThread()
,如果条件成立,则开始真正启动一个未启动过的Activity
,通过realStartActivityLocked
;条件不成立,则调用mService
的startProcessAsync
启动当前Activity的所在的进程。即startSpecificActivity
函数是启动进程和启动Activity的一个分界点。
2、ATMS.startProcessAsync
PooledLambda.obtainMessage
函数是Lambda的调用方式,表示调用ActivityManagerInternal
的startProcess
函数,后续则是其参数。并返回一个Message
对象,发给Handler
类型的mH
。
void startProcessAsync(ActivityRecord activity, boolean knownToBeDead, boolean isTop,
String hostingType) {
final Message m = PooledLambda.obtainMessage(ActivityManagerInternal::startProcess,
mAmInternal, activity.processName, activity.info.applicationInfo, knownToBeDead,
isTop, hostingType, activity.intent.getComponent());
mH.sendMessage(m);
}
抽象类ActivityManagerInternal
的继承类定义在ActivityManagerService
的内部类LocalService
。
public final class LocalService extends ActivityManagerInternal
3、LocalService.startProcess
@Override
public void startProcess(String processName, ApplicationInfo info, boolean knownToBeDead,
boolean isTop, String hostingType, ComponentName hostingName) {
startProcessLocked(processName, info, knownToBeDead, 0 /* intentFlags */,
new HostingRecord(hostingType, hostingName, isTop),
ZYGOTE_POLICY_FLAG_LATENCY_SENSITIVE, false /* allowWhileBooting */,
false /* isolated */, true /* keepIfLarge */);
}
4、startProcessLocked函数
final ProcessRecord startProcessLocked(String processName,
ApplicationInfo info, boolean knownToBeDead, int intentFlags,
HostingRecord hostingRecord, int zygotePolicyFlags, boolean allowWhileBooting,
boolean isolated, boolean keepIfLarge) {
return mProcessList.startProcessLocked(processName, info, knownToBeDead, intentFlags,
hostingRecord, zygotePolicyFlags, allowWhileBooting, isolated, 0 /* isolatedUid */,
keepIfLarge, null /* ABI override */, null /* entryPoint */,
null /* entryPointArgs */, null /* crashHandler */);
}
5、ProcessList.startProcessLocked
ProcessList
类的startProcessLocked
函数,有几个重载函数,第一个调用。
在 !isolated
,判断了启动IntentFlag
是否后台运行,是的话,直接拒绝。否则清理AMS
中发生过Crash
的进程(当前应用)。
分析一:创立当前应用进程的描述ProcessRecord
。
判断当前系统是否启动完毕,未启动完毕,将进程信息缓存到AMS
的mProcessesOnHold
中。
分析二:调用了另外一个重载函数。
final ProcessRecord startProcessLocked(String processName, ApplicationInfo info,
boolean knownToBeDead, int intentFlags, HostingRecord hostingRecord,
int zygotePolicyFlags, boolean allowWhileBooting, boolean isolated, int isolatedUid,
boolean keepIfLarge, String abiOverride, String entryPoint, Strin