`

Android系统进程Zygote启动过程的源代码分析

 
阅读更多
在Android系统中,所有的应用程序进程以及系统服务进程SystemServer都是由Zygote进程孕育(fork)出来的,这也许就是为什么要把它称为Zygote(受精卵)的原因吧。由于Zygote进程在Android系统中有着如此重要的地位,本文将详细分析它的启动过程。

在前面一篇文章Android应用程序进程启动过程的源代码分析中,我们看到了,当ActivityManagerService启动一个应用程序的时候,就会通过Socket与Zygote进程进行通信,请求它fork一个子进程出来作为这个即将要启动的应用程序的进程;在前面两篇文章Android应用程序安装过程源代码分析和Android系统默认Home应用程序(Launcher)的启动过程源代码分析中,我们又看到了,系统中的两个重要服务PackageManagerService和ActivityManagerService,都是由SystemServer进程来负责启动的,而SystemServer进程本身是Zygote进程在启动的过程中fork出来的。

我们知道,Android系统是基于Linux内核的,而在Linux系统中,所有的进程都是init进程的子孙进程,也就是说,所有的进程都是直接或者间接地由init进程fork出来的。Zygote进程也不例外,它是在系统启动的过程,由init进程创建的。在系统启动脚本system/core/rootdir/init.rc文件中,我们可以看到启动Zygote进程的脚本命令:

view plain
  1. servicezygote/system/bin/app_process-Xzygote/system/bin--zygote--start-system-server
  2. socketzygotestream666
  3. onrestartwrite/sys/android_power/request_statewake
  4. onrestartwrite/sys/power/stateon
  5. onrestartrestartmedia
  6. onrestartrestartnetd
前面的关键字service告诉init进程创建一个名为"zygote"的进程,这个zygote进程要执行的程序是/system/bin/app_process,后面是要传给app_process的参数。

接下来的socket关键字表示这个zygote进程需要一个名称为"zygote"的socket资源,这样,系统启动后,我们就可以在/dev/socket目录下看到有一个名为zygote的文件。这里定义的socket的类型为unix domain socket,它是用来作本地进程间通信用的,具体可以参考前面一篇文章Android学习启动篇提到的一书《Linux内核源代码情景分析》的第七章--基于socket的进程间通信。前面我们说到的ActivityManagerService就是通这个socket来和zygote进程通信请求fork一个应用程序进程的了。

最后的一系列onrestart关键字表示这个zygote进程重启时需要执行的命令。

关于init.rc文件的更多信息,请参考system/core/init/readme.txt文件。

了解了这个信息之后,我们就知道Zygote进程要执行的程序便是system/bin/app_process了,它的源代码位于frameworks/base/cmds/app_process/app_main.cpp文件中,入口函数是main。在继续分析Zygote进程启动的过程之前,我们先来看看它的启动序列图:


下面我们就详细分析每一个步骤。

Step 1. app_process.main

这个函数定义在frameworks/base/cmds/app_process/app_main.cpp文件中:

view plain
  1. intmain(intargc,constchar*constargv[])
  2. {
  3. //TheseareglobalvariablesinProcessState.cpp
  4. mArgC=argc;
  5. mArgV=argv;
  6. mArgLen=0;
  7. for(inti=0;i<argc;i++){
  8. mArgLen+=strlen(argv[i])+1;
  9. }
  10. mArgLen--;
  11. AppRuntimeruntime;
  12. constchar*arg;
  13. argv0=argv[0];
  14. //Processcommandlinearguments
  15. //ignoreargv[0]
  16. argc--;
  17. argv++;
  18. //Everythingupto'--'orfirstnon'-'arggoestothevm
  19. inti=runtime.addVmArguments(argc,argv);
  20. //Nextargisparentdirectory
  21. if(i<argc){
  22. runtime.mParentDir=argv[i++];
  23. }
  24. //Nextargisstartupclassnameor"--zygote"
  25. if(i<argc){
  26. arg=argv[i++];
  27. if(0==strcmp("--zygote",arg)){
  28. boolstartSystemServer=(i<argc)?
  29. strcmp(argv[i],"--start-system-server")==0:false;
  30. setArgv0(argv0,"zygote");
  31. set_process_name("zygote");
  32. runtime.start("com.android.internal.os.ZygoteInit",
  33. startSystemServer);
  34. }else{
  35. set_process_name(argv0);
  36. runtime.mClassName=arg;
  37. //Remainderofargsgetpassedtostartupclassmain()
  38. runtime.mArgC=argc-i;
  39. runtime.mArgV=argv+i;
  40. LOGV("Appprocessisstartingwithpid=%d,class=%s.\n",
  41. getpid(),runtime.getClassName());
  42. runtime.start();
  43. }
  44. }else{
  45. LOG_ALWAYS_FATAL("app_process:noclassnameor--zygotesupplied.");
  46. fprintf(stderr,"Error:noclassnameor--zygotesupplied.\n");
  47. app_usage();
  48. return10;
  49. }
  50. }
这个函数的主要作用就是创建一个AppRuntime变量,然后调用它的start成员函数。AppRuntime这个类我们在Android应用程序进程启动过程的源代码分析一文中已经有过介绍了,它同样是在frameworks/base/cmds/app_process/app_main.cpp文件中定义:
view plain
  1. classAppRuntime:publicAndroidRuntime
  2. {
  3. ......
  4. };
它约继承于AndroidRuntime类,AndroidRuntime类定义在frameworks/base/core/jni/AndroidRuntime.cpp文件中:
view plain
  1. ......
  2. staticAndroidRuntime*gCurRuntime=NULL;
  3. ......
  4. AndroidRuntime::AndroidRuntime()
  5. {
  6. ......
  7. assert(gCurRuntime==NULL);//oneperprocess
  8. gCurRuntime=this;
  9. }
当AppRuntime对象创建时,会调用其父类AndroidRuntime的构造函数,而在AndroidRuntime类的构造函数里面,会将this指针保存在静态全局变量gCurRuntime中,这样,当其它地方需要使用这个AppRuntime对象时,就可以通过同一个文件中的这个函数来获取这个对象的指针:
view plain
  1. AndroidRuntime*AndroidRuntime::getRuntime()
  2. {
  3. returngCurRuntime;
  4. }
回到上面的main函数中,由于我们在init.rc文件中,设置了app_process启动参数--zygote和--start-system-server,因此,在main函数里面,最终会执行下面语句:
view plain
  1. runtime.start("com.android.internal.os.ZygoteInit",
  2. rtSystemServer);
这里的参数startSystemServer为true,表示要启动SystemServer组件。由于AppRuntime没有实现自己的start函数,它继承了父类AndroidRuntime的start函数,因此,下面会执行AndroidRuntime类的start函数。

Step 2.AndroidRuntime.start

这个函数定义在frameworks/base/core/jni/AndroidRuntime.cpp文件中:

view plain
  1. /*
  2. *StarttheAndroidruntime.Thisinvolvesstartingthevirtualmachine
  3. *andcallingthe"staticvoidmain(String[]args)"methodintheclass
  4. *namedby"className".
  5. */
  6. voidAndroidRuntime::start(constchar*className,constboolstartSystemServer)
  7. {
  8. ......
  9. char*slashClassName=NULL;
  10. char*cp;
  11. JNIEnv*env;
  12. ......
  13. /*startthevirtualmachine*/
  14. if(startVm(&mJavaVM,&env)!=0)
  15. gotobail;
  16. /*
  17. *Registerandroidfunctions.
  18. */
  19. if(startReg(env)<0){
  20. LOGE("Unabletoregisterallandroidnatives\n");
  21. gotobail;
  22. }
  23. /*
  24. *Wewanttocallmain()withaStringarraywithargumentsinit.
  25. *Atpresentweonlyhaveoneargument,theclassname.Createan
  26. *arraytoholdit.
  27. */
  28. jclassstringClass;
  29. jobjectArraystrArray;
  30. jstringclassNameStr;
  31. jstringstartSystemServerStr;
  32. stringClass=env->FindClass("java/lang/String");
  33. assert(stringClass!=NULL);
  34. strArray=env->NewObjectArray(2,stringClass,NULL);
  35. assert(strArray!=NULL);
  36. classNameStr=env->NewStringUTF(className);
  37. assert(classNameStr!=NULL);
  38. env->SetObjectArrayElement(strArray,0,classNameStr);
  39. startSystemServerStr=env->NewStringUTF(startSystemServer?
  40. "true":"false");
  41. env->SetObjectArrayElement(strArray,1,startSystemServerStr);
  42. /*
  43. *StartVM.ThisthreadbecomesthemainthreadoftheVM,andwill
  44. *notreturnuntiltheVMexits.
  45. */
  46. jclassstartClass;
  47. jmethodIDstartMeth;
  48. slashClassName=strdup(className);
  49. for(cp=slashClassName;*cp!='\0';cp++)
  50. if(*cp=='.')
  51. *cp='/';
  52. startClass=env->FindClass(slashClassName);
  53. if(startClass==NULL){
  54. ......
  55. }else{
  56. startMeth=env->GetStaticMethodID(startClass,"main",
  57. "([Ljava/lang/String;)V");
  58. if(startMeth==NULL){
  59. ......
  60. }else{
  61. env->CallStaticVoidMethod(startClass,startMeth,strArray);
  62. ......
  63. }
  64. }
  65. ......
  66. }

这个函数的作用是启动Android系统运行时库,它主要做了三件事情,一是调用函数startVM启动虚拟机,二是调用函数startReg注册JNI方法,三是调用了com.android.internal.os.ZygoteInit类的main函数。

Step 3.ZygoteInit.main

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

view plain
  1. publicclassZygoteInit{
  2. ......
  3. publicstaticvoidmain(Stringargv[]){
  4. try{
  5. ......
  6. registerZygoteSocket();
  7. ......
  8. ......
  9. if(argv[1].equals("true")){
  10. startSystemServer();
  11. }elseif(!argv[1].equals("false")){
  12. ......
  13. }
  14. ......
  15. if(ZYGOTE_FORK_MODE){
  16. ......
  17. }else{
  18. runSelectLoopMode();
  19. }
  20. ......
  21. }catch(MethodAndArgsCallercaller){
  22. ......
  23. }catch(RuntimeExceptionex){
  24. ......
  25. }
  26. }
  27. ......
  28. }
它主要作了三件事情,一个调用registerZygoteSocket函数创建了一个socket接口,用来和ActivityManagerService通讯,二是调用startSystemServer函数来启动SystemServer组件,三是调用runSelectLoopMode函数进入一个无限循环在前面创建的socket接口上等待ActivityManagerService请求创建新的应用程序进程。

Step 4.ZygoteInit.registerZygoteSocket

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

view plain
  1. publicclassZygoteInit{
  2. ......
  3. /**
  4. *Registersaserversocketforzygotecommandconnections
  5. *
  6. *@throwsRuntimeExceptionwhenopenfails
  7. */
  8. privatestaticvoidregisterZygoteSocket(){
  9. if(sServerSocket==null){
  10. intfileDesc;
  11. try{
  12. Stringenv=System.getenv(ANDROID_SOCKET_ENV);
  13. fileDesc=Integer.parseInt(env);
  14. }catch(RuntimeExceptionex){
  15. ......
  16. }
  17. try{
  18. sServerSocket=newLocalServerSocket(
  19. createFileDescriptor(fileDesc));
  20. }catch(IOExceptionex){
  21. .......
  22. }
  23. }
  24. }
  25. ......
  26. }
这个socket接口是通过文件描述符来创建的,这个文件描符代表的就是我们前面说的/dev/socket/zygote文件了。这个文件描述符是通过环境变量ANDROID_SOCKET_ENV得到的,它定义为:
view plain
  1. publicclassZygoteInit{
  2. ......
  3. privatestaticfinalStringANDROID_SOCKET_ENV="ANDROID_SOCKET_zygote";
  4. ......
  5. }
那么,这个环境变量的值又是由谁来设置的呢?我们知道,系统启动脚本文件system/core/rootdir/init.rc是由init进程来解释执行的,而init进程的源代码位于system/core/init目录中,在init.c文件中,是由service_start函数来解释init.rc文件中的service命令的:
view plain
  1. voidservice_start(structservice*svc,constchar*dynamic_args)
  2. {
  3. ......
  4. pid_tpid;
  5. ......
  6. pid=fork();
  7. if(pid==0){
  8. structsocketinfo*si;
  9. ......
  10. for(si=svc->sockets;si;si=si->next){
  11. intsocket_type=(
  12. !strcmp(si->type,"stream")?SOCK_STREAM:
  13. (!strcmp(si->type,"dgram")?SOCK_DGRAM:SOCK_SEQPACKET));
  14. ints=create_socket(si->name,socket_type,
  15. si->perm,si->uid,si->gid);
  16. if(s>=0){
  17. publish_socket(si->name,s);
  18. }
  19. }
  20. ......
  21. }
  22. ......
  23. }
每一个service命令都会促使init进程调用fork函数来创建一个新的进程,在新的进程里面,会分析里面的socket选项,对于每一个socket选项,都会通过create_socket函数来在/dev/socket目录下创建一个文件,在这个场景中,这个文件便是zygote了,然后得到的文件描述符通过publish_socket函数写入到环境变量中去:
view plain
  1. staticvoidpublish_socket(constchar*name,intfd)
  2. {
  3. charkey[64]=ANDROID_SOCKET_ENV_PREFIX;
  4. charval[64];
  5. strlcpy(key+sizeof(ANDROID_SOCKET_ENV_PREFIX)-1,
  6. name,
  7. sizeof(key)-sizeof(ANDROID_SOCKET_ENV_PREFIX));
  8. snprintf(val,sizeof(val),"%d",fd);
  9. add_environment(key,val);
  10. /*makesurewedon'tclose-on-exec*/
  11. fcntl(fd,F_SETFD,0);
  12. }
这里传进来的参数name值为"zygote",而ANDROID_SOCKET_ENV_PREFIX在system/core/include/cutils/sockets.h定义为:
view plain
  1. #defineANDROID_SOCKET_ENV_PREFIX"ANDROID_SOCKET_"
因此,这里就把上面得到的文件描述符写入到以"ANDROID_SOCKET_zygote"为key值的环境变量中。又因为上面的ZygoteInit.registerZygoteSocket函数与这里创建socket文件的create_socket函数是运行在同一个进程中,因此,上面的ZygoteInit.registerZygoteSocket函数可以直接使用这个文件描述符来创建一个Java层的LocalServerSocket对象。如果其它进程也需要打开这个/dev/socket/zygote文件来和Zygote进程进行通信,那就必须要通过文件名来连接这个LocalServerSocket了,参考Android应用程序进程启动过程的源代码分析一文中的Step 4,ActivityManagerService是通过Process.start函数来创建一个新的进程的,而Process.start函数会首先通过Socket连接到Zygote进程中,最终由Zygote进程来完成创建新的应用程序进程,而Process类是通过openZygoteSocketIfNeeded函数来连接到Zygote进程中的Socket的:
view plain
  1. publicclassProcess{
  2. ......
  3. privatestaticvoidopenZygoteSocketIfNeeded()
  4. throwsZygoteStartFailedEx{
  5. ......
  6. for(intretry=0
  7. ;(sZygoteSocket==null)&&(retry<(retryCount+1))
  8. ;retry++){
  9. ......
  10. try{
  11. sZygoteSocket=newLocalSocket();
  12. sZygoteSocket.connect(newLocalSocketAddress(ZYGOTE_SOCKET,
  13. LocalSocketAddress.Namespace.RESERVED));
  14. sZygoteInputStream
  15. =newDataInputStream(sZygoteSocket.getInputStream());
  16. sZygoteWriter=
  17. newBufferedWriter(
  18. newOutputStreamWriter(
  19. sZygoteSocket.getOutputStream()),
  20. 256);
  21. ......
  22. }catch(IOExceptionex){
  23. ......
  24. }
  25. }
  26. ......
  27. }
  28. ......
  29. }
这里的ZYGOTE_SOCKET定义为:
view plain
  1. publicclassProcess{
  2. ......
  3. privatestaticfinalStringZYGOTE_SOCKET="zygote";
  4. ......
  5. }
它刚好就是对应/dev/socket目录下的zygote文件了。

Android系统中的socket机制和binder机制一样,都是可以用来进行进程间通信,读者可以自己对比一下这两者的不同之处,Binder进程间通信机制可以参考Android进程间通信(IPC)机制Binder简要介绍和学习计划一文。

Socket对象创建完成之后,回到Step 3中的ZygoteInit.main函数中,startSystemServer函数来启动SystemServer组件。

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

view plain
  1. publicclassZygoteInit{
  2. ......
  3. privatestaticbooleanstartSystemServer()
  4. throwsMethodAndArgsCaller,RuntimeException{
  5. /*Hardcodedcommandlinetostartthesystemserver*/
  6. Stringargs[]={
  7. "--setuid=1000",
  8. "--setgid=1000",
  9. "--setgroups=1001,1002,1003,1004,1005,1006,1007,1008,1009,1010,1018,3001,3002,3003",
  10. "--capabilities=130104352,130104352",
  11. "--runtime-init",
  12. "--nice-name=system_server",
  13. "com.android.server.SystemServer",
  14. };
  15. ZygoteConnection.ArgumentsparsedArgs=null;
  16. intpid;
  17. try{
  18. parsedArgs=newZygoteConnection.Arguments(args);
  19. ......
  20. /*Requesttoforkthesystemserverprocess*/
  21. pid=Zygote.forkSystemServer(
  22. parsedArgs.uid,parsedArgs.gid,
  23. parsedArgs.gids,debugFlags,null,
  24. parsedArgs.permittedCapabilities,
  25. parsedArgs.effectiveCapabilities);
  26. }catch(IllegalArgumentExceptionex){
  27. ......
  28. }
  29. /*Forchildprocess*/
  30. if(pid==0){
  31. handleSystemServerProcess(parsedArgs);
  32. }
  33. returntrue;
  34. }
  35. ......
  36. }
这里我们可以看到,Zygote进程通过Zygote.forkSystemServer函数来创建一个新的进程来启动SystemServer组件,返回值pid等0的地方就是新的进程要执行的路径,即新创建的进程会执行handleSystemServerProcess函数。

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

view plain
  1. publicclassZygoteInit{
  2. ......
  3. privatestaticvoidhandleSystemServerProcess(
  4. ZygoteConnection.ArgumentsparsedArgs)
  5. throwsZygoteInit.MethodAndArgsCaller{
  6. closeServerSocket();
  7. /*
  8. *PasstheremainingargumentstoSystemServer.
  9. *"--nice-name=system_servercom.android.server.SystemServer"
  10. */
  11. RuntimeInit.zygoteInit(parsedArgs.remainingArgs);
  12. /*shouldneverreachhere*/
  13. }
  14. ......
  15. }
由于由Zygote进程创建的子进程会继承Zygote进程在前面Step 4中创建的Socket文件描述符,而这里的子进程又不会用到它,因此,这里就调用closeServerSocket函数来关闭它。这个函数接着调用RuntimeInit.zygoteInit函数来进一步执行启动SystemServer组件的操作。

Step 7.RuntimeInit.zygoteInit

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

view plain
  1. publicclassRuntimeInit{
  2. ......
  3. publicstaticfinalvoidzygoteInit(String[]argv)
  4. throwsZygoteInit.MethodAndArgsCaller{
  5. ......
  6. zygoteInitNative();
  7. ......
  8. //Remainingargumentsarepassedtothestartclass'sstaticmain
  9. StringstartClass=argv[curArg++];
  10. String[]startArgs=newString[argv.length-curArg];
  11. System.arraycopy(argv,curArg,startArgs,0,startArgs.length);
  12. invokeStaticMain(startClass,startArgs);
  13. }
  14. ......
  15. }
这个函数会执行两个操作,一个是调用zygoteInitNative函数来执行一个Binder进程间通信机制的初始化工作,这个工作完成之后,这个进程中的Binder对象就可以方便地进行进程间通信了,另一个是调用上面Step 5传进来的com.android.server.SystemServer类的main函数。

Step 8.RuntimeInit.zygoteInitNative

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

view plain
  1. publicclassRuntimeInit{
  2. ......
  3. publicstaticfinalnativevoidzygoteInitNative();
  4. ......
  5. }
这里可以看出,函数zygoteInitNative是一个Native函数,实现在frameworks/base/core/jni/AndroidRuntime.cpp文件中,这里我们就不再细看了,具体可以参考Android应用程序进程启动过程的源代码分析一文的Step 9,完成这一步后,这个进程的Binder进程间通信机制基础设施就准备好了。

回到Step 7中的RuntimeInit.zygoteInitNative函数,下一步它就要执行com.android.server.SystemServer类的main函数了。

Step 9.SystemServer.main

这个函数定义在frameworks/base/services/java/com/android/server/SystemServer.java文件中:

view plain
  1. publicclassSystemServer
  2. {
  3. ......
  4. nativepublicstaticvoidinit1(String[]args);
  5. ......
  6. publicstaticvoidmain(String[]args){
  7. ......
  8. init1(args);
  9. ......
  10. }
  11. publicstaticfinalvoidinit2(){
  12. Slog.i(TAG,"EnteredtheAndroidsystemserver!");
  13. Threadthr=newServerThread();
  14. thr.setName("android.server.ServerThread");
  15. thr.start();
  16. }
  17. ......
  18. }
这里的main函数首先会执行JNI方法init1,然后init1会调用这里的init2函数,在init2函数里面,会创建一个ServerThread线程对象来执行一些系统关键服务的启动操作,例如我们在前面两篇文章Android应用程序安装过程源代码分析和Android系统默认Home应用程序(Launcher)的启动过程源代码分析中提到的PackageManagerService和ActivityManagerService。
这一步的具体执行过程可以参考Android应用程序安装过程源代码分析一文,这里就不再详述了。

这里执行完成后,层层返回,最后回到上面的Step 3中的ZygoteInit.main函数中,接下来它就要调用runSelectLoopMode函数进入一个无限循环在前面Step 4中创建的socket接口上等待ActivityManagerService请求创建新的应用程序进程了。

Step 10.ZygoteInit.runSelectLoopMode

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

view plain
  1. publicclassZygoteInit{
  2. ......
  3. privatestaticvoidrunSelectLoopMode()throwsMethodAndArgsCaller{
  4. ArrayList<FileDescriptor>fds=newArrayList();
  5. ArrayList<ZygoteConnection>peers=newArrayList();
  6. FileDescriptor[]fdArray=newFileDescriptor[4];
  7. fds.add(sServerSocket.getFileDescriptor());
  8. peers.add(null);
  9. intloopCount=GC_LOOP_COUNT;
  10. while(true){
  11. intindex;
  12. ......
  13. try{
  14. fdArray=fds.toArray(fdArray);
  15. index=selectReadable(fdArray);
  16. }catch(IOExceptionex){
  17. thrownewRuntimeException("Errorinselect()",ex);
  18. }
  19. if(index<0){
  20. thrownewRuntimeException("Errorinselect()");
  21. }elseif(index==0){
  22. ZygoteConnectionnewPeer=acceptCommandPeer();
  23. peers.add(newPeer);
  24. fds.add(newPeer.getFileDesciptor());
  25. }else{
  26. booleandone;
  27. done=peers.get(index).runOnce();
  28. if(done){
  29. peers.remove(index);
  30. fds.remove(index);
  31. }
  32. }
  33. }
  34. }
  35. ......
  36. }
这个函数我们已经在Android应用程序进程启动过程的源代码分析一文的Step 5中分析过了,这就是在等待ActivityManagerService来连接这个Socket,然后调用ZygoteConnection.runOnce函数来创建新的应用程序,有兴趣的读者可以参考Android应用程序进程启动过程的源代码分析这篇文章,这里就不再详述了。

这样,Zygote进程就启动完成了,学习到这里,我们终于都对Android系统中的进程有了一个深刻的认识了,这里总结一下:

1. 系统启动时init进程会创建Zygote进程,Zygote进程负责后续Android应用程序框架层的其它进程的创建和启动工作。

2. Zygote进程会首先创建一个SystemServer进程,SystemServer进程负责启动系统的关键服务,如包管理服务PackageManagerService和应用程序组件管理服务ActivityManagerService。

3. 当我们需要启动一个Android应用程序时,ActivityManagerService会通过Socket进程间通信机制,通知Zygote进程为这个应用程序创建一个新的进程。


分享到:
评论

相关推荐

    Android系统进程Zygote启动过程的源代码分析.pdf

    Android系统进程Zygote启动过程的源代码分析.pdf

    老罗的android之旅时序图

    (Android系统进程Zygote启动过程的源代码分析UML,Android系统默认Home应用程序(Launcher)的启动过程源代码分析uml,Android系统在新进程中启动自定义服务过程(startService)的原理分析UML,Android应用程序...

    《Android系统源代码情景分析》

    《Android系统源代码情景分析》随书光盘内容(源代码) 目录如下: 第1篇 初识Android系统 第1章 准备知识 1.1 Linux内核参考书籍 1.2 Android应用程序参考书籍 1.3 下载、编译和运行Android源代码 ...

    Android系统源代码情景分析 / 罗升阳著

    在内容上,《Android系统源代码情景分析(含CD光盘1张)》结合使用情景,全面、深入、细致地分析了Android系统的源代码,涉及到Linux内核层、硬件抽象层(HAL)、运行时库层(Runtime)、应用程序框架层...

    Android系统源代码情景分析-罗升阳-源码

    《Android系统源代码情景分析》随书光盘内容(源代码) 目录如下: 第1篇 初识Android系统 第1章 准备知识 1.1 Linux内核参考书籍 1.2 Android应用程序参考书籍 1.3 下载、编译和运行Android源代码 1.3.1 下载...

    Android系统源代码情景分析光盘

    Android系统源代码情景分析光盘资料 目录 第1篇初识Android系统 第1章 准备知识................................................................ 2 1.1 Linux内核参考书籍......................................

    Android系统-源码阅读-系统启动流程笔记

    Android系统启动流程源码分析; init进程的启动; 各个守护进程的启动; Zygote的启动; SystemServer的启动;

    详细分析Android中实现Zygote的

    概述 在Android系统中,所有的应用程序进程,以及用来运行系统关键服务的System进程都是由zygote进程负责创建的。...下面我们将介绍zygote进程的启动脚本,然后分析它和System进程的启动过程。 zygote分析

    Java最全面试题宝典.rar

    Zygote和System进程的启动过程 Android中的MVC,MVP和MVVM MVP Android开机过程 Retrofit源码分析 Glide源码分析 EventBus用法详解 EventBus源码分析 Android ORM 框架之 greenDAO 使用心得 Data Binding(数据绑定...

    ANDROID源码分析实录

    《Android源码分析实录》共分为15章,主要内容包括走进Android世界、硬件抽象层详解、分析JNI(Java本地接口)层、Android内存系统分析、Andmid虚拟机系统详解、IPC通信机制详解、Zygote进程/System进程和应用程序...

    最全java面试题.zip

    Zygote和System进程的启动过程 Android中的MVC,MVP和MVVM MVP Android开机过程 Retrofit源码分析 Glide源码分析 EventBus用法详解 EventBus源码分析 Android ORM 框架之 greenDAO 使用心得 Data Binding(数

    android系统原理及开发要点详解

     读者在学习本书的过程中,应尽量对照本书的框图和手头的Android源代码,这样可以达到事半功倍的效果。本书在重点代码中加上大量的注释,帮助读者阅读,对于非重点的代码,不占用本书的篇幅,读者可以参考开放的源...

    《深入理解Android:卷I》试读本

    《深入理解Android:卷I》是一本以情景方式对Android的源代码进行深入分析的书。内容广泛,以对Framework层的分析为主,兼顾Native层和Application层;分析深入,每一部分源代码的分析都力求透彻;针对性强,注重实际...

    Android10.0 Binder通信原理(九)-AIDL Binder示例

    专注于Android系统级源码分析,Android的平台设计,欢迎关注我,谢谢! [Android取经之路] 的源码都基于Android-Q(10.0) 进行分析 [Android取经之路] 系列文章: 《系统启动篇》 Android系统架构 Android是怎么...

    Android Framework实战开发篇

    广大的Android应用开发者是不是对Android系统充满着好奇,是不是很想学习Android系统...-学习zygote的进程创建过程源码分析 -学习zygote启动systemserver过程分析 -学习systemserver的启动分析 -学习systemserver的Home

    深入理解Android 卷1.pdf

    一本以情景方式对Android的源代码进行深入分析的书。内容广泛,以对Framework层的分析为主,兼顾Native层和Application层;分析深入,每一部分源代码的分析都力求透彻;针对性强,注重实际应用开发需求,书中所涵盖...

    深入理解Android++卷1pdf电子书

    第4章分析了Zygote、SystemServer等进程的工作机制,同时还讨论了Android的启动速度、虚拟机HeapSize的大小调整、Watchdog工作原理等问题;第5章讲解了Android系统中常用的类,包括sp、wp、RefBase、Thread等类,...

    深入理解Android卷1

    深入理解Android:卷I》是一本以情景方式对Android的源代码进行深入分析的书。内容广泛,以对Framework层的分析为主,兼顾Native层和Application层;分析深入,每一部分源代码的分析都力求透彻;针对性强,注重实际...

    深入理解Android:卷2

    深入理解Android:卷2》是一本以情景方式对Android的源代码进行深入分析的书。内容广泛,以对Framework层的分析为主,兼顾Native层和Application层;分析深入,每一部分源代码的分析都力求透彻;针对性强,注重实际...

Global site tag (gtag.js) - Google Analytics