SystemServer 启动

AndroidRuntime.cpp ZygoteInit Zygote JNI$Zygote RuntimeInit MethodAndArgsCaller SystemServer main() startSystemServer() forkSystemServer() nativeForkSystemServer() forkAndSpecializeCommon() handleSystemServerProcess() zygoteInit() invokeStaticMain() run() main() AndroidRuntime.cpp ZygoteInit Zygote JNI$Zygote RuntimeInit MethodAndArgsCaller SystemServer

一、fork调用前

ZygoteInit#main()->startSystemServer()->Zygote#forkSystemServer()->com_android_internal_os_Zygote#nativeForkSystemServer()->forkAndSpecializeCommon()
做的主要工作:

  1. SetSigChldHandler(); //设置子进程的signal信号处理函数

  2. DetachDescriptors(env, fdsToClose); //关闭并清除文件描述符

  3. SetGids(env, javaGids); //设置设置group

  4. SetRLimits(env, javaRlimits); //设置资源limit

  5. SetSchedulerPolicy(env); //设置调度策略

  6. //selinux上下文
    rc = selinux_android_setcontext(uid, is_system_server, se_info_c_str, se_name_c_str);

  7. 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()

主要工作:

  1. closeServerSocket(); //关闭父进程zygote复制而来的Socket

  2. Process.setArgV0(parsedArgs.niceName); //设置当前进程名为"system_server"

  3. //执行dex优化操作【见小节6】
    performSystemServerDexOpt(systemServerClasspath);

  4. 创建类加载器,并赋予当前线程
    cl = new PathClassLoader(systemServerClasspath, ClassLoader.getSystemClassLoader());
    Thread.currentThread().setContextClassLoader(cl);

  5. 设置时区信息

  6. 设置默认的HTTP User-agent格式,用于 HttpURLConnection。
    String userAgent = getDefaultUserAgent();
    System.setProperty(“http.agent”, userAgent);

  7. 设置socket的tag,用于网络流量统计
    NetworkManagementSocketTagger.install();

  8. proc->>startThreadPool(); //启动新binder线程

  9. 设置虚拟机的内存利用率参数值为0.75
    VMRuntime.getRuntime().setTargetHeapUtilization(0.75f);
    VMRuntime.getRuntime().setTargetSdkVersion(targetSdkVersion);

http://gityuan.com/2016/02/14/android-system-server/

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值