轉載自: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文件中:
它調用了Process.start函數開始爲應用程序創建新的進程,注意,它傳入一個第一個參數爲"android.app.ActivityThread",這就是進程初始化時要加載的Java類了,把這個類加載到進程之後,就會把它裏面的靜態成員函數main作爲進程的入口點,後面我們會看到。
Step 2. Process.start
這個函數定義在frameworks/base/core/java/android/os/Process.java文件中:
這裏的supportsProcesses函數返回值爲true,它是一個Native函數,實現在frameworks/base/core/jni/android_util_Process.cpp文件中:
ProcessState::supportsProcesses函數定義在frameworks/base/libs/binder/ProcessState.cpp文件中:
這裏的mDriverFD是設備文件/dev/binder的打開描述符,如果成功打開了這個設備文件,那麼它的值就會大於等於0,因此,它的返回值爲true。
回到Process.start函數中,它調用startViaZygote函數進一步操作。
Step 3. Process.startViaZygote
這個函數定義在frameworks/base/core/java/android/os/Process.java文件中: