Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發 >> 關於android開發 >> Android的本地服務zygote服務及Dalvik環境啟動

Android的本地服務zygote服務及Dalvik環境啟動

編輯:關於android開發

通過上一節的分析可知,init進程在啟動過程中,解析並處理了init.rc和init.hardware.rc兩個初始化腳本文件,在兩個初始化腳本文件裡,定義了一系列的service section,這些service在boot觸發器下,通過class_start default依次啟動,其過程總結如下:

    1. init 解析init.rc

    2. init 將init.rc裡的service放到隊列裡面等待觸發器的觸發

    3. init通過 action_for_each_trigger("boot", action_add_queue_tail);觸發boot Action

    4. 依次執行boot下的Commands,包括class_start default命令

    5. 所有的service默認的class為默認值:default,所以,所有init.rc中的service都被啟動

zygote服務啟動


通過init.rc中對zygote服務的描述可知,其對應的程序為:/system/bin/app_process

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
    onrestart restart media

該服務會在on boot時觸發,其程序為/system/bin/app_process,服務名為zygote,-Xzygote /system/bin --zygote --start-system-server為參數列表。

在創建了zygote 服務後,在目錄下建立一個stream socket文件/dev/socket/zygote,權限為666,當zygote服務重啟時,重啟media服務

通過find ./ -name Android.mk  -exec grep -l app_process {} \; 命令,查找到,它在./frameworks/base/cmds/app_process/目錄中被編譯,其主要入口文件為:

./frameworks/base/cmds/app_process/app_main.cpp

找到該程序的main入口函數,

118 int main(int argc, const char* const argv[])
119 {
120     // These are global variables in ProcessState.cpp
121     mArgC = argc;
122     mArgV = argv;
123
124     mArgLen = 0;
125     for (int i=0; i<argc; i++) {
126         mArgLen += strlen(argv[i]) + 1;
127     }
128     mArgLen--;
129
130     AppRuntime runtime;
131     const char *arg;
132     const char *argv0;
133
134     argv0 = argv[0];
135
136     // Process command line arguments
137     // ignore argv[0]
138     argc--;
139     argv++;

141     // Everything up to '--' or first non '-' arg goes to the vm
142     // 在zygote服務的參數列表中,以‘--和非‘-’開頭的參數,是dalvik的參數:/system/bin--zygote --start-system-server,交給Vm來處理

143     int i = runtime.addVmArguments(argc, argv);
144
145     // 找到zygote的目錄:/system/bin
146     if (i < argc) {
147         runtime.mParentDir = argv[i++];
148     }
149
150     // 如果接下來的參數是:--zygote --start-system-server的話,設置argv0=“zygote”,startSystemServer= true,啟動java VM
151     if (i < argc) {
152         arg = argv[i++];
153         if (0 == strcmp("--zygote", arg)) {
154             bool startSystemServer = (i < argc) ?
155                     strcmp(argv[i], "--start-system-server") == 0 : false;
156             setArgv0(argv0, "zygote");
157             set_process_name("zygote");
158             runtime.start("com.android.internal.os.ZygoteInit",
159                 startSystemServer);
160         } else {
161             set_process_name(argv0);
162
163             runtime.mClassName = arg;
164
165             // Remainder of args get passed to startup class main()
166             runtime.mArgC = argc-i;

167             runtime.mArgV = argv+i;
168
169             LOGV("App process is starting with pid=%d, class=%s.\n",
170                  getpid(), runtime.getClassName());
171             runtime.start();
172         }
173     } else {
174         LOG_ALWAYS_FATAL("app_process: no class name or --zygote supplied.");
175         fprintf(stderr, "Error: no class name or --zygote supplied.\n");
176         app_usage();
177         return 10;
178     }
179
180 }

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved