上文我們調用了Process.start函數開始為應用程式建立新的進程。
注意,它傳入一個第一個參數為"android.app.ActivityThread",這就是進程初始化時要載入的Java類了,把這個類載入到進程之後,就會把它裡面的靜態成員函數main作為進程的進入點,後面我們會看到。
Step 2. Process.start
這個函數定義在frameworks/base/core/java/android/os/Process.java檔案中:
- [java] view plaincopypublic class Process {
- ......
- public static final int start(final String processClass,
- final String niceName,
- int uid, int gid, int[] gids,
- int debugFlags,
- String[] zygoteArgs)
- {
- if (supportsProcesses()) {
- try {
- return startViaZygote(processClass, niceName, uid, gid, gids,
- debugFlags, zygoteArgs);
- } catch (ZygoteStartFailedEx ex) {
- ......
- }
- } else {
- ......
- return 0;
- }
- }
- ......
- }
這裡的supportsProcesses函數傳回值為true,它是一個Native函數,實現在frameworks/base/core/jni/android_util_Process.cpp檔案中:
- [cpp] view plaincopyjboolean android_os_Process_supportsProcesses(JNIEnv*
- env, jobject clazz)
- {
- return ProcessState::self()->supportsProcesses();
- }
- ProcessState::supportsProcesses函數定義在frameworks/base/libs/binder/ProcessState.cpp檔案中:
- [cpp] view plaincopybool ProcessState::supportsProcesses() const
- {
- return mDriverFD >= 0;
- }
這裡的mDriverFD是裝置檔案/dev/binder的開啟描述符,如果成功開啟了這個裝置檔案,那麼它的值就會大於等於0,因此,它的傳回值為true。
回到Process.start函數中,它調用startViaZygote函數進一步操作。