Android开发:System Server 分析(3)

通过以上过程就会调用到 SystemServer 类,且是运行在一个名为“ system_server” 的进程中,这个进程为 zygote 的子进程。

虽然 SystemServer 类是运行在 system_server 中的,但是它并不运行在 system_server 的主线程中。

上代码

private static void handleSystemServerProcess(               ZygoteConnection.Arguments parsedArgs)               throws ZygoteInit.MethodAndArgsCaller {           closeServerSocket();           /*           * Pass the remaining arguments to SystemServer.           * "--nice-name=system_server com.Android.server.SystemServer"           */           RuntimeInit.zygoteInit(parsedArgs.remainingArgs);ZygoteInit           /* should never reach here */       }       public static final void zygo用teInit(String[] argv)               throws ZygoteInit.MethodAndArgsCaller {           // TODO: Doing this here works, but it seems kind of arbitrary. Find            // a better place. The goal is to set it up for applications, but not            // tools like am.            System.setOut(new AndroidPrintStream(Log.INFO, "System.out"));           System.setErr(new AndroidPrintStream(Log.WARN, "System.err"));           commonInit();           zygoteInitNative();           int curArg = 0;           for ( /* curArg */ ; curArg < argv.length; curArg++) {               String arg = argv[curArg];               if (arg.equals("--")) {                   curArg++;                   break;               } else if (!arg.startsWith("--")) {                   break;               } else if (arg.startsWith("--nice-name=")) {                   String niceName = arg.substring(arg.indexOf('=') + 1);                   Process.setArgV0(niceName);               }           }           if (curArg == argv.length) {               Slog.e(TAG, "Missing classname argument to RuntimeInit!");               // let the process exit                return;           }           // Remaining arguments are passed to the start class's static main            String startClass = argv[curArg++];           String[] startArgs = new String[argv.length - curArg];           System.arraycopy(argv, curArg, startArgs, 0, startArgs.length);           invokeStaticMain(startClass, startArgs);       }      private static void invokeStaticMain(String className, String[] argv)               throws ZygoteInit.MethodAndArgsCaller {   用           // We want to be fairly aggressive about heap utilization, to avoid            // holding on to a lot of memory that isn't needed.            VMRuntime.getRuntime().setTargetHeapUtilization(0.75f);           Class<?> cl;           try {               cl = Class.forName(className);           } catch (ClassNotFoundException ex) {               throw new RuntimeException(                       "Missing class when invoking static main " + className,                       ex);           }           Method m;           try {               m = cl.getMethod("main"new Class[] { String[].class });           } catch (NoSuchMethodException ex) {               throw new RuntimeException(                       "Missing static main on " + className, ex);           } catch (SecurityException ex) {               throw new RuntimeException(                       "Problem getting static main on " + className, ex);           }           int modifiers = m.getModifiers();用           if (! (Modifier.isStatic(modif用iers) && Modifier.isPublic(modifiers))) {               throw new RuntimeException(                       "Main method is not用 public and static on " + className);           }           /*           * This throw gets caught in ZygoteInit.main(), which responds           * by invoking the exception's run() method. This arrangement           * clears up all the stack frames that were required in setting           * up the process.           */           throw new ZygoteInit.MethodAndArgsCaller(m, argv);       }  

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wwddps.html