我對這個檔案還沒仔細研究過,不過一個網友突然問了我一個問題,我也還是大概的知道一些。
android的系統應用中的一個重要的進程就是zygote,所有的java應用程式進程都是由zygote派生出來的,zygote這個進程的作用就是“生兒子”。具體的一個應用如何出來的大家可以看我以前的一篇文章-----Android 應用初始化及表單事件的分發。
首先要瞭解一點初始化語言的基本知識吧:
Services(服務)是一個程式,他在初始化時啟動,並在退出時重啟(可選)。Services(服務)的形式如下:
service <name> <pathname> [ <argument> ]*
<option>
<option>
Options為選項,具體可以參考linux service命令
zygote進程正是在linux kernel startup後通過這個檔案啟動的,具體看init.rc中這一段:
service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server
socket zygote stream 666
onrestart write /sys/android_power/request_state wake
onrestart write /sys/power/state on
一段一段的分析這個代碼:
service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server
啟動服務名字zygote. /system/bin/app_process 進程的bin檔案具體路徑,後面跟的就是啟動參數-Xzygote /system/bin --zygote --start-system-server。這段參數有什麼作用可以對照看代碼app_main.cpp
if (i < argc) {
arg = argv[i++];
if (0 == strcmp("--zygote", arg)) {
bool startSystemServer = (i < argc) ?
strcmp(argv[i], "--start-system-server") == 0 : false;
setArgv0(argv0, "zygote");
set_process_name("zygote");
runtime.start("com.android.internal.os.ZygoteInit",
startSystemServer);
} else {
set_process_name(argv0);
runtime.mClassName = arg;
// Remainder of args get passed to startup class main()
runtime.mArgC = argc-i;
runtime.mArgV = argv+i;
LOGV("App process is starting with pid=%d, class=%s./n",
getpid(), runtime.getClassName());
runtime.start();
}
}
-Xzygote 這個參數的意義是在jvm中設定gDvm.zygote = true;至於這個參數的具體作用大家自己看代碼吧。 其流程是 androidRuntime->start() call---> JNI_CreateJavaVM() call ---->dvmStartup()(戴維林虛擬機器初始化) call---->dvmProcessOptions().
/system/bin :也許是告知系統應用的路徑吧,大家看到了告訴我。
onrestart write /sys/android_power/request_state wake:
如果這個服務重啟了,開啟/sys/android_power/request_state 這個檔案寫入wake字串。