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

移动开发 Android
上文的parseArgs.runtimeInit值为true,于是就继续执行RuntimeInit.zygoteInit进一步处理了。接下来执行RuntimeInit.zygoteInit这个函数。

由于在前面的Step 3中,指定了"--runtime-init"参数,表示要为新创建的进程初始化运行时库,因此,上文的parseArgs.runtimeInit值为true,于是就继续执行RuntimeInit.zygoteInit进一步处理了。接下来:

Step 8. RuntimeInit.zygoteInit

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

  1. [java] view plaincopypublic class RuntimeInit { 
  2.   ...... 
  3.   public static final void zygoteInit(String[] argv) 
  4.   throws ZygoteInit.MethodAndArgsCaller { 
  5.   // TODO: Doing this here works, but it seems kind of arbitrary. Find 
  6.   // a better place. The goal is to set it up for applications, but not 
  7.   // tools like am. 
  8.   System.setOut(new AndroidPrintStream(Log.INFO, "System.out")); 
  9.   System.setErr(new AndroidPrintStream(Log.WARN, "System.err")); 
  10.   commonInit(); 
  11.   zygoteInitNative(); 
  12.   int curArg = 0
  13.   for ( /* curArg */ ; curArg < argv.length; curArg++) { 
  14.   String arg = argv[curArg]; 
  15.   if (arg.equals("--")) { 
  16.   curArg++; 
  17.   break
  18.   } else if (!arg.startsWith("--")) { 
  19.   break
  20.   } else if (arg.startsWith("--nice-name=")) { 
  21.   String niceName = arg.substring(arg.indexOf('=') + 1); 
  22.   Process.setArgV0(niceName); 
  23.   } 
  24.   } 
  25.   if (curArg == argv.length) { 
  26.   Slog.e(TAG, "Missing classname argument to RuntimeInit!"); 
  27.   // let the process exit 
  28.   return
  29.   } 
  30.   // Remaining arguments are passed to the start class's static main 
  31.   String startClass = argv[curArg++]; 
  32.   String[] startArgs = new String[argv.length - curArg]; 
  33.   System.arraycopy(argv, curArg, startArgs, 0, startArgs.length); 
  34.   invokeStaticMain(startClass, startArgs); 
  35.   } 
  36.   ...... 
  37.   } 

这里有两个关键的函数调用,一个是zygoteInitNative函数调用,一个是invokeStaticMain函数调用,前者就是执行Binder驱动程序初始化的相关工作了,正是由于执行了这个工作,才使得进程中的Binder对象能够顺利地进行Binder进程间通信,而后一个函数调用,就是执行进程的入口函数,这里就是执行startClass类的main函数了,而这个startClass即是我们在Step 1中传进来的"android.app.ActivityThread"值,表示要执行android.app.ActivityThread类的main函数。

我们先来看一下zygoteInitNative函数的调用过程,然后再回到RuntimeInit.zygoteInit函数中来,看看它是如何调用android.app.ActivityThread类的main函数的。

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

2014-06-20 11:05:56

Android应用程序进程启动

2014-06-20 11:09:35

Android应用程序进程启动

2014-06-19 14:25:04

Android应用程序进程启动

2014-06-19 14:30:28

Android应用程序进程启动

2014-06-20 11:20:37

Android应用程序进程启动

2014-06-19 14:59:40

Android应用程序进程启动

2014-06-19 14:54:11

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

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

鸿蒙操作系统

2010-12-13 11:40:17

Android应用程序

2014-05-22 15:45:58

Android消息处理机制Looper

2009-08-14 17:57:43

ASP.NET MVC
点赞
收藏

51CTO技术栈公众号