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,  
相關文章
相關標籤/搜索