一、fork调用前
ZygoteInit#main()->startSystemServer()->Zygote#forkSystemServer()->com_android_internal_os_Zygote#nativeForkSystemServer()->forkAndSpecializeCommon()
做的主要工作:
-
SetSigChldHandler(); //设置子进程的signal信号处理函数
-
DetachDescriptors(env, fdsToClose); //关闭并清除文件描述符
-
SetGids(env, javaGids); //设置设置group
-
SetRLimits(env, javaRlimits); //设置资源limit
-
SetSchedulerPolicy(env); //设置调度策略
-
//selinux上下文
rc = selinux_android_setcontext(uid, is_system_server, se_info_c_str, se_name_c_str); -
UnsetSigChldHandler(); //设置子进程的signal信号处理函数为默认函数
其实fork()函数是在forkAndSpecializeCommon()一开始调用的,上面的工作都是在fork()之后做的,所以真正fork前,只是把下面这String数组封装然后解析。
String args[] = {
“–setuid=1000”,
“–setgid=1000”,
“–setgroups=1001,1002,1003,1004,1005,1006,1007,1008,1009,1010,1018,1021,1032,3001,3002,3003,3006,3007”,
“–capabilities=” + capabilities + “,” + capabilities,
“–nice-name=system_server”,
“–runtime-args”,
“com.android.server.SystemServer”,
};
二、fork调用后,SystemServer#main()调用前
ZygoteInit#handleSystemServerProcess()->>ZygoteInit#onZygoteInit()->>RuntimeInit#invokeStaticMain()->>MethodAndArgsCaller#run()->>SystemServer#main()
主要工作:
-
closeServerSocket(); //关闭父进程zygote复制而来的Socket
-
Process.setArgV0(parsedArgs.niceName); //设置当前进程名为"system_server"
-
//执行dex优化操作【见小节6】
performSystemServerDexOpt(systemServerClasspath); -
创建类加载器,并赋予当前线程
cl = new PathClassLoader(systemServerClasspath, ClassLoader.getSystemClassLoader());
Thread.currentThread().setContextClassLoader(cl); -
设置时区信息
-
设置默认的HTTP User-agent格式,用于 HttpURLConnection。
String userAgent = getDefaultUserAgent();
System.setProperty(“http.agent”, userAgent); -
设置socket的tag,用于网络流量统计
NetworkManagementSocketTagger.install(); -
proc->>startThreadPool(); //启动新binder线程
-
设置虚拟机的内存利用率参数值为0.75
VMRuntime.getRuntime().setTargetHeapUtilization(0.75f);
VMRuntime.getRuntime().setTargetSdkVersion(targetSdkVersion);
http://gityuan.com/2016/02/14/android-system-server/