system_serviceプロセスはzygoteプロセスforkから来ます。
2986 ワード
ベース:http://blog.csdn.net/jianguo_liao 19840726/articale/detail/16112993
ZygoteInit.javaのmainで述べたstartSystem Server()
startSystem Server();方法
1、pid=Zygote.forkSystemServer(system uservice子プロセスを作成しました。
2、子プロセスforkが成功したら、handleSystem Server Process(parsedArgs)を実行する。
ZygoteInit.javaのmainで述べたstartSystem Server()
public static void main(String argv[]) {
registerZygoteSocket();
preloadClasses();
preloadResources();
if (argv[1].equals("true")) {
startSystemServer();
}
if (ZYGOTE_FORK_MODE) {
runForkMode();
} else {
runSelectLoopMode();
}
closeServerSocket();
}
入りますstartSystem Server();方法
/**
* Prepare the arguments and fork for the system server process.
*/
private static boolean startSystemServer()
throws MethodAndArgsCaller, RuntimeException {
/* 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,3001,3002,3003",
"--capabilities=130104352,130104352",
"--runtime-init",
"--nice-name=system_server",
"com.android.server.SystemServer",
};
ZygoteConnection.Arguments parsedArgs = null;
int pid;
try {
parsedArgs = new ZygoteConnection.Arguments(args);
/*
* Enable debugging of the system process if *either* the command line flags
* indicate it should be debuggable or the ro.debuggable system property
* is set to "1"
*/
int debugFlags = parsedArgs.debugFlags;
if ("1".equals(SystemProperties.get("ro.debuggable")))
debugFlags |= Zygote.DEBUG_ENABLE_DEBUGGER;
/* Request to fork the system server process */
pid = Zygote.forkSystemServer(
parsedArgs.uid, parsedArgs.gid,
parsedArgs.gids, debugFlags, null,
parsedArgs.permittedCapabilities,
parsedArgs.effectiveCapabilities);
} catch (IllegalArgumentException ex) {
throw new RuntimeException(ex);
}
/* For child process */
if (pid == 0) {
handleSystemServerProcess(parsedArgs);
}
return true;
}
上のコメントから見たらforkのプロセス名nice-name=system_serverは主に以下のコードを実行しています。/* Request to fork the system server process */
pid = Zygote.forkSystemServer(
プロセスforkが成功すると、次のように実行されます。/* For child process */
if (pid == 0) {
handleSystemServerProcess(parsedArgs);
}
上から見て、まとめてみます。1、pid=Zygote.forkSystemServer(system uservice子プロセスを作成しました。
2、子プロセスforkが成功したら、handleSystem Server Process(parsedArgs)を実行する。