Framework源码分析 启动流程 Zygote启动SystemServer
背景
Framework中最为重要的就是四大组件了,整个Android体系都是围绕四大组件进行搭建的。之前相关的源码看过一篇,但是因为最近在学习插件化框架相关的知识,发现很多细节记得不是很清楚了,再加上现在市面上将Android源码的书中基于的Android源码版本已经很老了, 所以这次打算自己再深入学习一遍。这个系列都是基于AndroidX, branch android_10.0.0_r1进行分析。
ActivityManagerService在system_server中的初始化
整个Android启动流程大体是: 加电启动->fastboot->kernel->init->Zygote Zygote的启动代表着整个Android世界开始构建。Zygote启动时会拉起system_server, 而Android大部分系统服务都是在system_server中初始化的
Zygote启动system_server
ZygoteInit.forkSystemServer
[frameworks/base/core/java/com/android/internal/os/ZygoteInit.java]
/**
* Prepare the arguments and forks for the system server process.
*
* @return A {@code Runnable} that provides an entrypoint into system_server code in the child
* process; {@code null} in the parent.
*/
private static Runnable forkSystemServer(String abiList, String socketName,
ZygoteServer zygoteServer) {
long capabilities = posixCapabilitiesAsBits(
OsConstants.CAP_IPC_LOCK,
OsConstants.CAP_KILL,
OsConstants.CAP_NET_ADMIN,
OsConstants.CAP_NET_BIND_SERVICE,
OsConstants.CAP_NET_BROADCAST,
OsConstants.CAP_NET_RAW,
OsConstants.CAP_SYS_MODULE,
OsConstants.CAP_SYS_NICE,
OsConstants.CAP_SYS_PTRACE,
OsConstants.CAP_SYS_TIME,
OsConstants.CAP_SYS_TTY_CONFIG,
OsConstants.CAP_WAKE_ALARM,
OsConstants.CAP_BLOCK_SUSPEND
);
/* Containers run without some capabilities, so drop any caps that are not available. */
StructCapUserHeader header = new StructCapUserHeader(
OsConstants._LINUX_CAPABILITY_VERSION_3, 0);
StructCapUserData[] data;
try {
data = Os.capget(header);
} catch (ErrnoException ex) {
throw new RuntimeException("Failed to capget()", ex);
}
capabilities &= ((long) data[0].effective) | (((long) data[1].effective) << 32);
/* Hardcoded command line to start the system server */
String args[] = {
"--setuid=1000",
"--setgid=1000",
"--setgroups=1001,1002,1003,1004,1005,1006,1007,1008,1009,1010,1018,1021,1023,"
+ "1024,1032,1065,3001,3002,3003,3006,3007,3009,3010",
"--capabilities=" + capabilities + "," + capabilities,
"--nice-name=system_server",
"--runtime-args",
"--target-sdk-version=" + VMRuntime.SDK_VERSION_CUR_DEVELOPMENT,
"com.android.server.SystemServer", // 类名
};
ZygoteArguments parsedArgs = null;
int pid;
try {
parsedArgs = new ZygoteArguments(args);
Zygote.applyDebuggerSystemProperty(parsedArgs);
Zygote.applyInvokeWithSystemProperty(parsedArgs);
boolean profileSystemServer = SystemProperties.getBoolean(
"dalvik.vm.profilesystemserver", false);
if (profileSystemServer) {
parsedArgs.mRuntimeFlags |= Zygote.PROFILE_SYSTEM_SERVER;
}
/* Request to fork the system server process */
// 通过fork启动system_server
pid = Zygote.forkSystemServer(
parsedArgs.mUid, parsedArgs.mGid,
parsedArgs.mGids,
parsedArgs.mRuntimeFlags,
null,
parsedArgs.mPermittedCapabilities,
parsedArgs.mEffectiveCapabilities);
} catch (IllegalArgumentException ex) {
throw new RuntimeException(ex);
}
/* For child process */
if (pid == 0) {
if (hasSecondZygote(abiList)) {
waitForSecondaryZygote(socketName);
}
zygoteServer.closeServerSocket();
// 开始执行system_server
return handleSystemServerProcess(parsedArgs);
}
return null;
}Zygote.forkSystemServer
可以看到nativeForkSystemServer是一个native函数,实际fork工作是丢给它来完成的,我们进去看下
nativeForkSystemServer
在fork system_server进程时是通过ForkCommon函数,ForkCommon中再调用fork来完成。
ForkCommon
SpecializeCommon
SpecializeCommon函数主要是根据参数设置进程的一些参数,如权限,调度策略.
callPostForkSystemServerHooks和callPostForkChildHooks,是针对Zygote的两个hook,我们这里略过,重点在于ZygoteInit类的createSystemServerClassLoader方法
ZygoteInit.createSystemServerClassLoader
createSystemServerClassLoader被调用是已经在system_server进程里了,这个函数只是获取了SYSTEMSERVERCLASSPATH环境变量,创建了sCachedSystemServerClassLoader,下图是在Android手机上截取的环境变量,可以看到SYSTEMSERVERCLASSPATH. fork相关的部分到这里就结束了,我们现在退栈到ZygoteInit的forkSystemServer, 看下handleSystemServerProcess 
ZygoteInit.handleSystemServerProcess
handleSystemServerProcess主要做了两件事:
优化相关代码
调用ZygoteInit.zygoteInit
ZygoteInit.zygoteInit
zygoteInit的主要工作:
重定向日志
完成一些通用初始化:时区等
调用native方法初始化,这个函数主要使用创建进行的线程池,待会儿看一下
最后调用RuntimeInit.applicationInit进一步处理参数
下面先看下
ZygoteInit.nativeZygoteInit
nativeZygoteInit
nativeZygoteInit函数在AndroidRuntime.cpp中
AndroidRuntime中,onZygoteInit是个虚函数,啥都没做,看下AndroidRuntime的定义
实际运行中,onZygoteInit的函数的具体实现是在AppRuntime里面
nativeZygoteInit看完了,现在回去继续看Java空间的处理,下面看RuntimeInit.applicationInit
RuntimeInit.applicationInit
findStaticMain函数就是找到目标类中的static main方法,实现主要就是通过反射,比较简单就不细看了。 追了一路,这里稍微总结下:Zygote通过fork出一个进程,然后在这个进程中准备一系列参数,最终返回的Runnable就是com.android.server.SystemServer的main方法。之后子进程就从main开始往下走了。下面我们就正式进入SystemServer的代码中去了。
Last updated
Was this helpful?