編輯:關於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 }
Android V7包學習筆記更新中..... 關於V4 V7 V13 VX包介紹轉自這裡 1, Android Support V4, V7, V13是什麼
使用Android Studio開發調用.NET Webservice 之初體驗,androidwebservice本人是。NET出身 但苦於領導要讓研究Android
linux中fcntl()、lockf、flock的區別fcntl()、lockf、flock的區別——lvyilong316這三個函數的作用都是給文件加鎖,那它們有什麼
Android 異步Http框架簡介和實現原理,android框架在前幾篇文章中《Android 采用get方式提交數據到服務器》《Android 采用post方式提交數