Android -Launcher启动流程
Activity 启动流程
final 变量不能被修改
final 方法不能被重写
final 类不能被继承
流程
ActivityManagerService --->
systemReady--->
startHomeActivityLocked(currentUserId, "systemReady");--->
startHomeActivity()--->ActivityStarter{execute(){startActivity()}---> startActivityUnchecked()---> resumeFocusedStackTopActivityLocked()}
---> ActivityStackSupervisor {{resumeTopActivityUncheckedLocked()}}
--->{ActivityStackSupervisor {
resumeTopActivityUncheckedLocked()--->
resumeTopActivityInnerLocked()--->
startSpecificActivityLocked()--->
}
}
---ActivityStackSupervisor{
startSpecificActivityLocked()-->
mService.startProcessLocked()-->
}
---> ActivityManagerService{
startProcessLocked()-->
startProcessLocked()-->
startProcessLocked()-->
startProcess(app.hostingType, entryPoint,
app, app.startUid, gids, runtimeFlags, mountExternal, app.seInfo,
requiredAbi, instructionSet, invokeWith, app.startTime);
-->
Process.start(entryPoint,
app.processName, uid, uid, gids, runtimeFlags, mountExternal,
app.info.targetSdkVersion, seInfo, requiredAbi, instructionSet,
app.info.dataDir, invokeWith,
new String[] {PROC_START_SEQ_IDENT + app.startSeq});
}
--> Process {start()}
-->ZygoteProcess{start{}---> startViaZygote{}---> openZygoteSocketIfNeeded{}--->{zygoteSendArgsAndGetResult()}}
zygoteSendArgsAndGetResult 向合子进程发送一个参数列表,合子进程启动一个新的子进程并返回子进程的pid。请注意:当前实现将参数列表中的换行符替换为空格。
ZygoteConnection
processOneCommand()
pid = Zygote.forkAndSpecialize(parsedArgs.uid, parsedArgs.gid, parsedArgs.gids,
parsedArgs.runtimeFlags, rlimits, parsedArgs.mountExternal, parsedArgs.seInfo,
parsedArgs.niceName, fdsToClose, fdsToIgnore, parsedArgs.startChildZygote,
parsedArgs.instructionSet, parsedArgs.appDataDir);
handleChildProc()
if (parsedArgs.invokeWith != null) {
WrapperInit.execApplication(parsedArgs.invokeWith,
parsedArgs.niceName, parsedArgs.targetSdkVersion,
VMRuntime.getCurrentInstructionSet(),
pipeFd, parsedArgs.remainingArgs);
// Should not get here.
throw new IllegalStateException("WrapperInit.execApplication unexpectedly returned");
} else {
if (!isZygote) {
return ZygoteInit.zygoteInit(parsedArgs.targetSdkVersion, parsedArgs.remainingArgs,
null /* classLoader */);
} else {
return ZygoteInit.childZygoteInit(parsedArgs.targetSdkVersion,
parsedArgs.remainingArgs, null /* classLoader */);
}
}
zygoteInit()
RuntimeInit.redirectLogStreams();
RuntimeInit.commonInit();
ZygoteInit.nativeZygoteInit();
return RuntimeInit.applicationInit(targetSdkVersion, argv, classLoader);
Activity 启动流程
final 变量不能被修改
final 方法不能被重写
final 类不能被继承
流程
ActivityManagerService --->
systemReady--->
startHomeActivityLocked(currentUserId, "systemReady");--->
startHomeActivity()--->ActivityStarter{execute(){startActivity()}---> startActivityUnchecked()---> resumeFocusedStackTopActivityLocked()}
---> ActivityStackSupervisor {{resumeTopActivityUncheckedLocked()}}
--->{ActivityStackSupervisor {
resumeTopActivityUncheckedLocked()--->
resumeTopActivityInnerLocked()--->
startSpecificActivityLocked()--->
}
}
---ActivityStackSupervisor{
startSpecificActivityLocked()-->
mService.startProcessLocked()-->
}
---> ActivityManagerService{
startProcessLocked()-->
startProcessLocked()-->
startProcessLocked()-->
startProcess(app.hostingType, entryPoint,
app, app.startUid, gids, runtimeFlags, mountExternal, app.seInfo,
requiredAbi, instructionSet, invokeWith, app.startTime);
-->
Process.start(entryPoint,
app.processName, uid, uid, gids, runtimeFlags, mountExternal,
app.info.targetSdkVersion, seInfo, requiredAbi, instructionSet,
app.info.dataDir, invokeWith,
new String[] {PROC_START_SEQ_IDENT + app.startSeq});
}
--> Process {start()}
-->ZygoteProcess{start{}---> startViaZygote{}---> openZygoteSocketIfNeeded{}--->{zygoteSendArgsAndGetResult()}}
zygoteSendArgsAndGetResult 向合子进程发送一个参数列表,合子进程启动一个新的子进程并返回子进程的pid。请注意:当前实现将参数列表中的换行符替换为空格。
ZygoteConnection
processOneCommand()
pid = Zygote.forkAndSpecialize(parsedArgs.uid, parsedArgs.gid, parsedArgs.gids,
parsedArgs.runtimeFlags, rlimits, parsedArgs.mountExternal, parsedArgs.seInfo,
parsedArgs.niceName, fdsToClose, fdsToIgnore, parsedArgs.startChildZygote,
parsedArgs.instructionSet, parsedArgs.appDataDir);
handleChildProc()
if (parsedArgs.invokeWith != null) {
WrapperInit.execApplication(parsedArgs.invokeWith,
parsedArgs.niceName, parsedArgs.targetSdkVersion,
VMRuntime.getCurrentInstructionSet(),
pipeFd, parsedArgs.remainingArgs);
// Should not get here.
throw new IllegalStateException("WrapperInit.execApplication unexpectedly returned");
} else {
if (!isZygote) {
return ZygoteInit.zygoteInit(parsedArgs.targetSdkVersion, parsedArgs.remainingArgs,
null /* classLoader */);
} else {
return ZygoteInit.childZygoteInit(parsedArgs.targetSdkVersion,
parsedArgs.remainingArgs, null /* classLoader */);
}
}
zygoteInit()
RuntimeInit.redirectLogStreams();
RuntimeInit.commonInit();
ZygoteInit.nativeZygoteInit();
return RuntimeInit.applicationInit(targetSdkVersion, argv, classLoader);