IT技术问答
联系我们
主页 > IT技术问答 > IT技术问答

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

时间:2019-01-28  编辑:环亚

上文中的函数将创建进程的参数放到argsForZygote列表中去。

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

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

  1. [java] view plaincopypublic class Process { 
  2. ...... 
  3. private static int zygoteSendArgsAndGetPid(ArrayList args) 
  4. throws ZygoteStartFailedEx { 
  5. int pid; 
  6. openZygoteSocketIfNeeded(); 
  7. try { 
  8. /** 
  9. * See com.android.internal.os.ZygoteInit.readArgumentList() 
  10. * Presently the wire format to the zygote process is: 
  11. * a) a count of arguments (argc, in essence) 
  12. * b) a number of newline-separated argument strings equal to count 
  13. * After the zygote process reads these it will write the pid of 
  14. * the child&nbsAAAAAAbsp;-1 on failure. 
  15. */ 
  16. sZygoteWriter.write(Integer.toString(args.size())); 
  17. sZygoteWriter.newLine(); 
  18. int sz = args.size(); 
  19. for (int i = 0; i < sz; i++) { 
  20. String arg = args.get(i); 
  21. if (arg.indexOf(' ') >= 0) { 
  22. throw new ZygoteStartFailedEx( 
  23. "embedded newlines not allowed"); 
  24. sZygoteWriter.write(arg); 
  25. sZygoteWriter.newLine(); 
  26. sZygoteWriter.flush(); 
  27. // Should there be a timeout on this? 
  28. pid = sZygoteInputStream.readInt(); 
  29. if (pid < 0) { 
  30. throw new ZygoteStartFailedEx("fork() failed"); 
  31. } catch (IOException ex) { 
  32. ...... 
  33. return pid; 
  34. ...... 
  35. 这里的sZygoteWriter是一个Socket写入流,是由openZygoteSocketIfNeeded函数打开的: 
  36. [java] view plaincopypublic class Process { 
  37. ...... 
  38. /** 
  39. * Tries to open socket to Zygote process if not already open. If 
  40. * already open, does nothing. May block and retry. 
  41. */ 
  42. private static void openZygoteSocketIfNeeded() 
  43. throws ZygoteStartFailedEx { 
  44. int retryCount; 
  45. if (sPreviousZygoteOpenFailed) { 
  46. /* 
  47. * If we've failed before, expect that we'll fail again and 
  48. * don't pause for retries. 
  49. */ 
  50. retryCount = 0; 
  51. } else { 
  52. retryCount = 10; 
  53. /* 
  54. * See bug #811181: Sometimes runtime can make it up before zygote. 
  55. * Really, we'd like to do something better to avoid this condition, 
  56. * but for now just wait a bit... 
  57. */ 
  58. for (int retry = 0 
  59. ; (sZygoteSocket == null) && (retry < (retryCount + 1)) 
  60. ; retry++ ) { 
  61. if (retry > 0) { 
  62. try { 
  63. Log.i("Zygote", "Zygote not up yet, sleeping..."); 
  64. Thread.sleep(ZYGOTE_RETRY_MILLIS); 
  65. } catch (InterruptedException ex) { 
  66. // should never happen 
  67. try { 
  68. sZygoteSocket = new LocalSocket(); 
  69. sZygoteSocket.connect(new LocalSocketAddress(ZYGOTE_SOCKET, 
  70. LocalSocketAddress.Namespace.RESERVED)); 
  71. sZygoteInputStream 
  72. = new DataInputStream(sZygoteSocket.getInputStream()); 
  73. sZygoteWriter = 
  74. new BufferedWriter( 
  75. new OutputStreamWriter( 
  76. sZygoteSocket.getOutputStream()), 
  77. 256); 
  78. Log.i("Zygote", "Process: zygote socket opened"); 
  79. sPreviousZygoteOpenFailed = false; 
  80. break; 
  81. } catch (IOException ex) { 
  82. ...... 
  83. ...... 
  84. ...... 

这个Socket由frameworks/base/core/java/com/android/internal/os/ZygoteInit.java文件中的ZygoteInit类在runSelectLoopMode函数侦听的。

http://www.bkjia.com/Androidjc/815631.htmlwww.bkjia.comtruehttp://www.bkjia.com/Androidjc/815631.htmlTechArticle上文中的函数将创建进程的参数放到argsForZygote列表中去。 如参数--runtime-init表示要为新创建的进程初始化运行时库,然后调用zygoteSendAndG...

本文源自: AG游戏网站

Copyright © 2005-2016 http://www.firebugkc.com AG游戏网站_亚洲最佳百家乐游戏平台_AG环亚集团_网易体育版权所有 AG游戏网站_亚洲最佳百家乐游戏平台_AG环亚集团_网易体育