Android應(yīng)用程序進(jìn)程啟動(dòng)過(guò)程的源代碼分析(八)
由于在前面的Step 3中,指定了"--runtime-init"參數(shù),表示要為新創(chuàng)建的進(jìn)程初始化運(yùn)行時(shí)庫(kù),因此,上文的parseArgs.runtimeInit值為true,于是就繼續(xù)執(zhí)行RuntimeInit.zygoteInit進(jìn)一步處理了。接下來(lái):
Step 8. RuntimeInit.zygoteInit
這個(gè)函數(shù)定義在frameworks/base/core/java/com/android/internal/os/RuntimeInit.java文件中:
- [java] view plaincopypublic class RuntimeInit {
- ......
- public static final void zygoteInit(String[] argv)
- throws ZygoteInit.MethodAndArgsCaller {
- // TODO: Doing this here works, but it seems kind of arbitrary. Find
- // a better place. The goal is to set it up for applications, but not
- // tools like am.
- System.setOut(new AndroidPrintStream(Log.INFO, "System.out"));
- System.setErr(new AndroidPrintStream(Log.WARN, "System.err"));
- commonInit();
- zygoteInitNative();
- int curArg = 0;
- for ( /* curArg */ ; curArg < argv.length; curArg++) {
- String arg = argv[curArg];
- if (arg.equals("--")) {
- curArg++;
- break;
- } else if (!arg.startsWith("--")) {
- break;
- } else if (arg.startsWith("--nice-name=")) {
- String niceName = arg.substring(arg.indexOf('=') + 1);
- Process.setArgV0(niceName);
- }
- }
- if (curArg == argv.length) {
- Slog.e(TAG, "Missing classname argument to RuntimeInit!");
- // let the process exit
- return;
- }
- // Remaining arguments are passed to the start class's static main
- String startClass = argv[curArg++];
- String[] startArgs = new String[argv.length - curArg];
- System.arraycopy(argv, curArg, startArgs, 0, startArgs.length);
- invokeStaticMain(startClass, startArgs);
- }
- ......
- }
這里有兩個(gè)關(guān)鍵的函數(shù)調(diào)用,一個(gè)是zygoteInitNative函數(shù)調(diào)用,一個(gè)是invokeStaticMain函數(shù)調(diào)用,前者就是執(zhí)行Binder驅(qū)動(dòng)程序初始化的相關(guān)工作了,正是由于執(zhí)行了這個(gè)工作,才使得進(jìn)程中的Binder對(duì)象能夠順利地進(jìn)行Binder進(jìn)程間通信,而后一個(gè)函數(shù)調(diào)用,就是執(zhí)行進(jìn)程的入口函數(shù),這里就是執(zhí)行startClass類(lèi)的main函數(shù)了,而這個(gè)startClass即是我們?cè)赟tep 1中傳進(jìn)來(lái)的"android.app.ActivityThread"值,表示要執(zhí)行android.app.ActivityThread類(lèi)的main函數(shù)。
我們先來(lái)看一下zygoteInitNative函數(shù)的調(diào)用過(guò)程,然后再回到RuntimeInit.zygoteInit函數(shù)中來(lái),看看它是如何調(diào)用android.app.ActivityThread類(lèi)的main函數(shù)的。