上一篇介绍了Zygote进程的创建方式以及主要做了哪些事情,其中就包括了启动SystemServer进程。

SystemServer进程主要是启动了一些系统服务,AMS、WMS、PMS等都是运行在SystemServer进程中的。

ZygoteInit的main方法中调用了startSystemServer方法启动了SystemServer进程。

public static void main(String argv[]) {...if (startSystemServer) {startSystemServer(abiList, socketName, zygoteServer);}...}

接着看下startSystemServer方法中做了什么

  /*** Prepare the arguments and fork for the system server process.*/private static boolean startSystemServer(String abiList, String socketName, ZygoteServer zygoteServer)throws Zygote.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,1021,1023,1032,3001,3002,3003,3006,3007,3009,3010","--capabilities=" + capabilities + "," + capabilities,"--nice-name=system_server","--runtime-args","com.android.server.SystemServer",};ZygoteConnection.Arguments parsedArgs = null;int pid;try {parsedArgs = new ZygoteConnection.Arguments(args);ZygoteConnection.applyDebuggerSystemProperty(parsedArgs);ZygoteConnection.applyInvokeWithSystemProperty(parsedArgs);//Zygote fork SystemServer进程pid = Zygote.forkSystemServer(parsedArgs.uid, parsedArgs.gid,parsedArgs.gids,parsedArgs.debugFlags,null,parsedArgs.permittedCapabilities,parsedArgs.effectiveCapabilities);} catch (IllegalArgumentException ex) {throw new RuntimeException(ex);}/* For child process *///fork出来的进程pid == 0表示当前是在SystemServer进程中运行if (pid == 0) {if (hasSecondZygote(abiList)) {waitForSecondaryZygote(socketName);}//SystemServer进程不需要Socket,关闭Socket,此Socket是Zygote等待接受AMS创建进程请求的zygoteServer.closeServerSocket();handleSystemServerProcess(parsedArgs);}return true;}

基于fork创建的进程会复制Zygote进程的地址空间,所以也会有Zygote进程中创建的Socket,SystemServer进程并不需要此Socket,因此需要关闭该Socket。接着调用handleSystemServerProcess来启动SystemServer进程中的一些资源。

/*** Finish remaining work for the newly forked system server process.*/private static void handleSystemServerProcess(ZygoteConnection.Arguments parsedArgs)throws Zygote.MethodAndArgsCaller {...if (parsedArgs.invokeWith != null) {...} else {ClassLoader cl = null;if (systemServerClasspath != null) {cl = createPathClassLoader(systemServerClasspath, parsedArgs.targetSdkVersion);Thread.currentThread().setContextClassLoader(cl);}/** Pass the remaining arguments to SystemServer.*/ZygoteInit.zygoteInit(parsedArgs.targetSdkVersion, parsedArgs.remainingArgs, cl);}/* should never reach here */}

创建了PathClassLoader,用于类加载。接着调用ZygoteInit#zygoteInit

public static final void zygoteInit(int targetSdkVersion, String[] argv,ClassLoader classLoader) throws Zygote.MethodAndArgsCaller {if (RuntimeInit.DEBUG) {Slog.d(RuntimeInit.TAG, "RuntimeInit: Starting application from zygote");}Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "ZygoteInit");RuntimeInit.redirectLogStreams();RuntimeInit.commonInit();//启动binder线程池ZygoteInit.nativeZygoteInit();//调用SystemServer中的main方法RuntimeInit.applicationInit(targetSdkVersion, argv, classLoader);}

 /* 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,1032,3001,3002,3003,3006,3007,3009,3010","--capabilities=" + capabilities + "," + capabilities,"--nice-name=system_server","--runtime-args","com.android.server.SystemServer",//这就是SystemServer全类名};

主要启动了binder线程池,用于进程间通信。然后调用了SystemServer中的main方法,这里的SystemServer全类名是在ZygoteInit#startSystemServer方法传过来的。然后就进入了SystemServer的main方法。

/*** The main entry point from zygote.*/public static void main(String[] args) {new SystemServer().run();}

调用run方法

private void run() {try {     ...//创建SystemServer进程中的LooperLooper.prepareMainLooper();// Initialize native services.System.loadLibrary("android_servers");// Check whether we failed to shut down last time we tried.// This call may not return.performPendingShutdown();// Initialize the system context.createSystemContext();// Create the system service manager.mSystemServiceManager = new SystemServiceManager(mSystemContext);mSystemServiceManager.setRuntimeRestarted(mRuntimeRestart);LocalServices.addService(SystemServiceManager.class, mSystemServiceManager);// Prepare the thread pool for init tasks that can be parallelizedSystemServerInitThreadPool.get();} finally {traceEnd();  // InitBeforeStartServices}// Start services.try {traceBeginAndSlog("StartServices");//启动引导服务startBootstrapServices();//启动核心服务startCoreServices();//启动其他服务startOtherServices();SystemServerInitThreadPool.shutdown();} catch (Throwable ex) {Slog.e("System", "******************************************");Slog.e("System", "************ Failure starting system services", ex);throw ex;} finally {traceEnd();}// For debug builds, log event loop stalls to dropbox for analysis.if (StrictMode.conditionallyEnableDebugLogging()) {Slog.i(TAG, "Enabled StrictMode for system server main thread.");}if (!mRuntimeRestart && !isFirstBootOrUpgrade()) {int uptimeMillis = (int) SystemClock.elapsedRealtime();MetricsLogger.histogram(null, "boot_system_server_ready", uptimeMillis);final int MAX_UPTIME_MILLIS = 60 * 1000;if (uptimeMillis > MAX_UPTIME_MILLIS) {Slog.wtf(SYSTEM_SERVER_TIMING_TAG,"SystemServer init took too long. uptimeMillis=" + uptimeMillis);}}// Loop forever.Looper.loop();throw new RuntimeException("Main thread loop unexpectedly exited");}

大致流程是先创建了SystemServiceManager,用于管理系统服务的创建、生命周期。然后startBootstrapServices用SystemServiceManager启动AMS、PowerManagerService、PMS等引导服务。接着startCoreServices启动了DropBoxManagerService、BatteryService、UsageStatsService、WebViewUpdateService。最后startOtherServices启动了CameraService、AlarmManagerService、InputManagerService、WindowManagerService等服务。

启动的这些服务都会注册到ServiceManager,ServiceManager管理各种服务,其他进程通过binder通信机制来使用相应的Service。

总结

  1. 启动binder线程池、用于进程通信;
  2. 创建SystemServiceManager,创建系统服务、以及生命周期管理;
  3. 启动各种系统服务,并注册到ServiceManager。

android system_server中的dump_SystemServer进程相关推荐

  1. 【Android 逆向】修改运行中的 Android 进程的内存数据 ( Android 系统中调试器进程内存流程 | 编译内存调试动态库以及调试程序 )

    文章目录 一.Android 系统中调试器进程内存流程 二.编译内存调试动态库以及调试程序 三.博客资源 一.Android 系统中调试器进程内存流程 修改游戏运行中的内存 , 游戏运行之后 , 游戏 ...

  2. android system_server中的dump_Android 10.0系统启动之SystemServer进程(二)

    感谢您的阅读与点赞!欢迎点击右上角关注:「大猫玩程序」 微信公众号:大猫玩程序 上一节讲解了SystemServer的架构以及被Zygote 进程fork的流程,这一节重点讲解SystemServer ...

  3. Android系统中的进程管理:进程的创建

    对于操作系统来说,进程管理是其最重要的职责之一. 考虑到这部分的内容较多,因此会拆分成几篇文章来讲解. 本文是进程管理系统文章的第一篇,会讲解Android系统中的进程创建. 本文适合Android平 ...

  4. Android系统中的进程管理:内存的回收

    本文是Android系统进程管理的第三篇文章.进程管理的前面两篇文章,请参见这里: Android系统中的进程管理:进程的创建 Android系统中的进程管理:进程的优先级 本文适合Android平台 ...

  5. Android应用中通过AIDL机制实现进程间的通讯实例

    Android中,每个应用程序都有自己的进程,当需要在不同的进程之间传递对象时,该如何实现呢?显然,Java中是不支持跨进程内存共享的,因此要传递对象,需要把对象解析成操作系统能够理解的数据格式,以达 ...

  6. android中线程和进程

    当应用组件启动且没有运行其他组件时,Android系统会使用单个执行线程为应用启动新的Linux进程.默认情况下,同一应用的所有组件在主线程中运行.若某个应用组件启动且应用已存在进程,则该组件会在此进 ...

  7. Android系统中的进程管理:进程的优先级

    本文是Android进程管理系列文章的第二篇,会讲解进程管理中的优先级管理. 进程管理的第一篇文章:<进程的创建>请跳转至这里. 本文适合Android平台的应用程序开发者,也适合对于An ...

  8. android studio 跨进程,Android IPC机制(三)在Android Studio中使用AIDL实现跨进程方法调用...

    本文首发于微信公众号「后厂技术官」 在上一篇文章Android IPC机制(二)用Messenger进行进程间通信中我们介绍了使用Messenger来进行进程间通信的方法,但是我们能发现Messeng ...

  9. Android中的跨进程调用技术AIDL

    什么是AIDL Android系统中的进程之间不能共享内存,因此,需要提供一些机制在不同进程之间进行数据通信. 为了使其他的应用程序也可以访问本应用程序提供的服务,Android系统采用了远程过程调用 ...

最新文章

  1. SRWebSocket源码浅析(上)
  2. springBoot使用PageHelper当超过最大页数后仍然返回数据
  3. Java线程:线程的同步与锁
  4. Java向数据库中插入Boolean类型的字段
  5. [课程设计]Scrum 多鱼点餐系统(团队交流日)
  6. 游侠联机显示无法链接服务器,我的世界用游侠联机时连接不上
  7. VC使用sqlite
  8. 服务器响应options,HTTP发送对OPTIONS请求的响应[C]
  9. 鼠标移动响应php程序,jQuery实现的响应鼠标移动方向插件用法示例【附源码下载】...
  10. Matlab将数字数组转换为字符数组(用于标明点号)
  11. mbot编程机器人怎么连接蓝牙_台式机蓝牙怎么连接
  12. 学生信息管理系统结构图
  13. 零拷贝原理详解(很多大厂面试题哦)
  14. 工厂模式简介和应用场景
  15. MacOS解压rar文件
  16. day03 Http协议Request
  17. Java8 通过foreach 遍历List,同时输出下标
  18. 学生成绩等级用c语言,C语言实现学生成绩等级划分的方法实例
  19. 手机传感器的意义:未来生活将被彻底改变
  20. CTF日记之web题目(入门题目)

热门文章

  1. Comet4J推技术在SSHE三大框架中应用-linux下亲测可用
  2. 每日一测1(带命令行参数运行)
  3. Android接收短信
  4. SQL导入Excel数据时,数字中混有字符将导致数据丢失的解决办法
  5. 46 - 算法 -Leetcode-141-环形链表-快慢指针
  6. JavaScript之DOM对象(Node结点属性、导航属性、页面查找)
  7. km算法c语言,KM算法最好的讲解+POJ2195[KM算法+最小费用流]
  8. Python使用Apriori算法查找关系密切的演员组合
  9. Python+OpenGL进行立方体多纹理映射
  10. html5的q标签,HTML 5 q 标签 - HTML 参考手册