Android源码解析之应用程序启动进程

转载自:http://blog.csdn.net/luoshengyang/article/details/6747696

       Android应用程序框架层创建的应用程序进程具有两个特点,一是进程的入口函数是ActivityThread.main,二是进程天然支持Binder进程间通信机制;这两个特点都是在进程的初始化过程中实现的,本文将详细分析Android应用程序进程创建过程中是如何实现这两个特点的。

        Android应用程序框架层创建的应用程序进程的入口函数是ActivityThread.main比较好理解,即进程创建完成之后,Android应用程序框架层就会在这个进程中将ActivityThread类加载进来,然后执行它的main函数,这个main函数就是进程执行消息循环的地方了。Android应用程序框架层创建的应用程序进程天然支持Binder进程间通信机制这个特点应该怎么样理解呢?前面我们在学习Android系统的Binder进程间通信机制时说到,它具有四个组件,分别是驱动程序、守护进程、Client以及Server,其中Server组件在初始化时必须进入一个循环中不断地与Binder驱动程序进行到交互,以便获得Client组件发送的请求,具体可参考Android系统进程间通信(IPC)机制Binder中的Server启动过程源代码分析一文,但是,当我们在Android应用程序中实现Server组件的时候,我们并没有让进程进入一个循环中去等待Client组件的请求,然而,当Client组件得到这个Server组件的远程接口时,却可以顺利地和Server组件进行进程间通信,这就是因为Android应用程序进程在创建的时候就已经启动了一个线程池来支持Server组件和Binder驱动程序之间的交互了,这样,极大地方便了在Android应用程序中创建Server组件。

        在Android应用程序框架层中,是由ActivityManagerService组件负责为Android应用程序创建新的进程的,它本来也是运行在一个独立的进程之中,不过这个进程是在系统启动的过程中创建的。ActivityManagerService组件一般会在什么情况下会为应用程序创建一个新的进程呢?当系统决定要在一个新的进程中启动一个Activity或者Service时,它就会创建一个新的进程了,然后在这个新的进程中启动这个Activity或者Service,具体可以参考Android系统在新进程中启动自定义服务过程(startService)的原理分析Android应用程序启动过程源代码分析Android应用程序在新的进程中启动新的Activity的方法和过程分析这三篇文章。

        ActivityManagerService启动新的进程是从其成员函数startProcessLocked开始的,在深入分析这个过程之前,我们先来看一下进程创建过程的序列图,然后再详细分析每一个步骤。


       点击查看大图

        Step 1. ActivityManagerService.startProcessLocked

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

[java]  view plain  copy
  1. public final class ActivityManagerService extends ActivityManagerNative    
  2.         implements Watchdog.Monitor, BatteryStatsImpl.BatteryCallback {    
  3.     
  4.     ......    
  5.     
  6.     private final void startProcessLocked(ProcessRecord app,    
  7.                 String hostingType, String hostingNameStr) {    
  8.     
  9.         ......    
  10.     
  11.         try {    
  12.             int uid = app.info.uid;    
  13.             int[] gids = null;    
  14.             try {    
  15.                 gids = mContext.getPackageManager().getPackageGids(    
  16.                     app.info.packageName);    
  17.             } catch (PackageManager.NameNotFoundException e) {    
  18.                 ......    
  19.             }    
  20.                 
  21.             ......    
  22.     
  23.             int debugFlags = 0;    
  24.                 
  25.             ......    
  26.                 
  27.             int pid = Process.start("android.app.ActivityThread",    
  28.                 mSimpleProcessManagement ? app.processName : null, uid, uid,    
  29.                 gids, debugFlags, null);    
  30.                 
  31.             ......    
  32.     
  33.         } catch (RuntimeException e) {    
  34.                 
  35.             ......    
  36.     
  37.         }    
  38.     }    
  39.     
  40.     ......    
  41.     
  42. }    
        它调用了Process.start函数开始为应用程序创建新的进程,注意,它传入一个第一个参数为"android.app.ActivityThread",这就是进程初始化时要加载的Java类了,把这个类加载到进程之后,就会把它里面的静态成员函数main作为进程的入口点,后面我们会看到。

        Step 2. Process.start 

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

[java]  view plain  copy
  1. public class Process {  
  2.     ......  
  3.   
  4.     public static final int start(final String processClass,  
  5.         final String niceName,  
  6.         int uid, int gid, int[] gids,  
  7.         int debugFlags,  
  8.         String[] zygoteArgs)  
  9.     {  
  10.         if (supportsProcesses()) {  
  11.             try {  
  12.                 return startViaZygote(processClass, niceName, uid, gid, gids,  
  13.                     debugFlags, zygoteArgs);  
  14.             } catch (ZygoteStartFailedEx ex) {  
  15.                 ......  
  16.             }  
  17.         } else {  
  18.             ......  
  19.   
  20.             return 0;  
  21.         }  
  22.     }  
  23.   
  24.     ......  
  25. }  
       这里的supportsProcesses函数返回值为true,它是一个Native函数,实现在frameworks/base/core/jni/android_util_Process.cpp文件中:

[cpp]  view plain  copy
  1. jboolean android_os_Process_supportsProcesses(JNIEnv* env, jobject clazz)  
  2. {  
  3.     return ProcessState::self()->supportsProcesses();  
  4. }  

       ProcessState::supportsProcesses函数定义在frameworks/base/libs/binder/ProcessState.cpp文件中:

[cpp]  view plain  copy
  1. bool ProcessState::supportsProcesses() const  
  2. {  
  3.     return mDriverFD >= 0;  
  4. }  
       这里的mDriverFD是设备文件/dev/binder的打开描述符,如果成功打开了这个设备文件,那么它的值就会大于等于0,因此,它的返回值为true。

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

       Step 3. Process.startViaZygote

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

[java]  view plain  copy
  1. public class Process {  
  2.     ......  
  3.   
  4.     private static int startViaZygote(final String processClass,  
  5.             final String niceName,  
  6.             final int uid, final  static int startViaZygote(final String processClass,  
  7.             final String niceName,  
  8.             final int uid, final int gid,  
  9.             final int[] gids,  
  10.             int debugFlags,  
  11.             String[] extraArgs)  
  12.             throws ZygoteStartFailedEx {  
  13.         int pid;  
  14.   
  15.         synchronized(Process.class) {  
  16.             ArrayList<String> argsForZygote =              final String niceName,  
  17.             final int uid, final int gid,  
  18.             final int[] gids,  
  19.             int debugFlags,  
  20.             String[] extraArgs)  
  21.             throws ZygoteStartFailedEx {  
  22.         int pid;  
  23.   
  24.         synchronized(Process.class) {  
  25.             ArrayList<String> argsForZygote = new ArrayList<String>();  
  26.             final int[] gids,  
相关文章
相关标签/搜索