Android的本地服务zygote服务及Dalvik环境启动
通过上一节的分析可知,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 }