Android应用程序进程启动过程的源代码分析(三)

移动开发 Android
mDriverFD是设备文件/dev/binder的打开描述符,如果成功打开了这个设备文件,那么它的值就会大于等于0,因此,它的返回值为true。

上文的mDriverFD是设备文件/dev/binder的打开描述符,如果成功打开了这个设备文件,那么它的值就会大于等于0,因此,它的返回值为true。

回到Process.start函数中,它调用startViaZygote函数进一步操作。

Step 3. Process.startViaZygote

这个函数定义在frameworks/base/core/java/android/os/Process.java文件中:

  1. [java] view plaincopypublic class Process { 
  2.   ...... 
  3.   private static int startViaZygote(final String processClass, 
  4.   final String niceName, 
  5.   final int uid, final int gid, 
  6.   final int[] gids, 
  7.   int debugFlags, 
  8.   String[] extraArgs) 
  9.   throws ZygoteStartFailedEx { 
  10.   int pid; 
  11.   synchronized(Process.class) { 
  12.   ArrayList argsForZygote = new ArrayList(); 
  13.   // --runtime-init, --setuid=, --setgid=, 
  14.   // and --setgroups= must go first 
  15.   argsForZygote.add("--runtime-init"); 
  16.   argsForZygote.add("--setuid=" + uid); 
  17.   argsForZygote.add("--setgid=" + gid); 
  18.   if ((debugFlags & Zygote.DEBUG_ENABLE_SAFEMODE) != 0) { 
  19.   argsForZygote.add("--enable-safemode"); 
  20.   } 
  21.   if ((debugFlags & Zygote.DEBUG_ENABLE_DEBUGGER) != 0) { 
  22.   argsForZygote.add("--enable-debugger"); 
  23.   } 
  24.   if ((debugFlags & Zygote.DEBUG_ENABLE_CHECKJNI) != 0) { 
  25.   argsForZygote.add("--enable-checkjni"); 
  26.   } 
  27.   if ((debugFlags & Zygote.DEBUG_ENABLE_ASSERT) != 0) { 
  28.   argsForZygote.add("--enable-assert"); 
  29.   } 
  30.   //TODO optionally enable debuger 
  31.   //argsForZygote.add("--enable-debugger"); 
  32.   // --setgroups is a comma-separated list 
  33.   if (gids != null && gids.length > 0) { 
  34.   StringBuilder sb = new StringBuilder(); 
  35.   sb.append("--setgroups="); 
  36.   int sz = gids.length; 
  37.   for (int i = 0; i < sz; i++) { 
  38.   if (i != 0) { 
  39.   sb.append(','); 
  40.   } 
  41.   sb.append(gids[i]); 
  42.   } 
  43.   argsForZygote.add(sb.toString()); 
  44.   } 
  45.   if (niceName != null) { 
  46.   argsForZygote.add("--nice-name=" + niceName); 
  47.   } 
  48.   argsForZygote.add(processClass); 
  49.   if (extraArgs != null) { 
  50.   for (String arg : extraArgs) { 
  51.   argsForZygote.add(arg); 
  52.   } 
  53.   } 
  54.   pid = zygoteSendArgsAndGetPid(argsForZygote); 
  55.   } 
  56.   } 
  57.   ...... 
  58.   } 

这个函数将创建进程的参数放到argsForZygote列表中去,如参数"--runtime-init"表示要为新创建的进程初始化运行时库,然后调用zygoteSendAndGetPid函数进一步操作。

责任编辑:闫佳明 来源: bbs.9ria
相关推荐

2014-06-19 14:25:04

Android应用程序进程启动

2014-06-20 11:24:34

Android应用程序进程启动

2014-06-20 11:09:35

Android应用程序进程启动

2014-06-20 11:05:56

Android应用程序进程启动

2014-06-20 11:20:37

Android应用程序进程启动

2014-06-19 14:59:40

Android应用程序进程启动

2014-06-19 14:30:28

Android应用程序进程启动

2012-02-20 14:47:08

JavaPlay

2014-05-22 15:00:16

Android消息处理机制Looper

2011-08-17 16:16:29

iPhone应用程序启动过程

2011-07-28 10:34:38

Cocoa 程序 启动

2014-06-23 10:31:09

Android启动过程

2011-06-28 13:27:13

ARM Linux

2024-09-11 09:25:03

Tomcat组件PREP

2014-07-31 10:06:01

谷歌Google应用

2012-08-16 09:07:57

Erlang

2018-03-13 13:00:03

Linux运维启动分析

2022-08-29 17:34:05

鸿蒙操作系统

2014-05-22 15:45:58

Android消息处理机制Looper

2010-12-13 11:40:17

Android应用程序
点赞
收藏

51CTO技术栈公众号