首先用一张图看一下整体的启动流程
因为android系统底层是基于Linux Kernel, 所以当Kernel启动后会创建init进程,init进程是Linux系统中用户空间的第一个进程(pid=1)。可以说android中的所有其他进程的共同祖先都是init
一 init进程启动
Android 10 系统中init入口函数从init.cpp 挪到了main.cpp 源码路径 system/core/init/main.cpp
int main(int argc, char** argv) {
if (!strcmp(basename(argv[0]), "ueventd")) {
return ueventd_main(argc, argv);
}
if (argc > 1) {
if (!strcmp(argv[1], "subcontext")) {
android::base::InitLogging(argv, &android::base::KernelLogger);
const BuiltinFunctionMap function_map;
return SubcontextMain(argc, argv, &function_map);
}
if (!strcmp(argv[1], "selinux_setup")) {
return SetupSelinux(argv);
}
if (!strcmp(argv[1], "second_stage")) {
return SecondStageMain(argc, argv);
}
}
return FirstStageMain(argc, argv);
}
二 zygote进程启动
Init进程启动后,通过解析init.rc 文件来启动zygote 在/system/core/rootdir/init.rc 中,通过下面的语句import zygote的rc文件,其中${ro.zygote} 是动态的,目前使用的最多的是zygote64_32。
import /init.${ro.zygote}.rc
当zygote进程启动后便会执行到frameworks/base/cmds/app_process/app_main.cpp 的main方法
int main(int argc, char* const argv[]){
.........
if (!niceName.isEmpty()) {
runtime.setArgv0(niceName.string(), true );
}
if (zygote) {
runtime.start("com.android.internal.os.ZygoteInit", args, zygote);
} else if (className) {
runtime.start("com.android.internal.os.RuntimeInit", args, zygote);
} else {
fprintf(stderr, "Error: no class name or --zygote supplied.\n");
app_usage();
LOG_ALWAYS_FATAL("app_process: no class name or --zygote supplied.");
}
}
当zygote为 true时启动ZygoteInit当为false时启动RuntimeInit
三 SystemServer进程启动
Zygote fork的第一个进程就是SystemServer,进程名为 system_server,system_server 进程承载着整个framework的核心服务,例如创建 ActivityManagerService、PowerManagerService、DisplayManagerService、PackageManagerService、WindowManagerService、LauncherAppsService等80多个核心系统服务,都运行在system_server这个进程中。在ZygoteInit的forkSystemServer方法中fork出SystemServer进程
private static Runnable forkSystemServer(String abiList, String socketName,
ZygoteServer zygoteServer) {
......
ZygoteArguments parsedArgs = null;
int pid;
try {
parsedArgs = new ZygoteArguments(args);
Zygote.applyDebuggerSystemProperty(parsedArgs);
Zygote.applyInvokeWithSystemProperty(parsedArgs);
pid = Zygote.forkSystemServer(
parsedArgs.mUid, parsedArgs.mGid,
parsedArgs.mGids,
parsedArgs.mRuntimeFlags,
null,
parsedArgs.mPermittedCapabilities,
parsedArgs.mEffectiveCapabilities);
} catch (IllegalArgumentException ex) {
throw new RuntimeException(ex);
}
if (pid == 0) {
if (hasSecondZygote(abiList)) {
waitForSecondaryZygote(socketName);
}
zygoteServer.closeServerSocket();
return handleSystemServerProcess(parsedArgs);
}
return null;
}
四 AMS服务启动
systemServer进程启动后会初始化系统中的各种服务包括ActivityManangerService,在AMS就绪后会启动系统桌面从而完成系统的整个启动流程
public void systemReady(final Runnable goingCallback, TimingsTraceLog
traceLog) {
...
mAtmInternal.startHomeOnAllDisplays(currentUserId, "systemReady");
...
}
后续有时间将会分章节详细分析各个阶段的启动流程
声 明: 本文为原创内容欢迎转载,请注明出处,谢谢!
|