1.init脚本启动
service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server
2.判断启动参数
zygote = true;
static const char ZYGOTE_NICE_NAME[] = "zygote";
niceName = ZYGOTE_NICE_NAME;
startSystemServer = true;
//设置启动参数
if (startSystemServer) {
args.add(String8("start-system-server"));
}
if (zygote) {
runtime.start("com.android.internal.os.ZygoteInit", args, zygote);
3. 启动虚拟机AndroidRuntime.cpp
注册虚拟机
注册JNI映射表
切换到Java的世界
jclass startClass = env->FindClass(slashClassName);
jmethodID startMeth = env->GetStaticMethodID(startClass, "main","([Ljava/lang/String;)V");
4. ZygoteInit.java类中运行
String zygoteSocketName = "zygote";
String abiList = null;
boolean enableLazyPreload = false;
for (int i = 1; i < argv.length; i++) {
if ("start-system-server".equals(argv[i])) {
startSystemServer = true;
启动系统服务
子进程里面启动systemServer
传参是
String args[] = {
"--setuid=1000",
"--setgid=1000",
"--setgroups=1001,1002,1003,1004,1005,1006,1007,1008,1009,1010,1018,1021,1023,"
+ "1024,1032,1065,3001,3002,3003,3006,3007,3009,3010",
"--capabilities=" + capabilities + "," + capabilities,
"--nice-name=system_server",
"--runtime-args",
"--target-sdk-version=" + VMRuntime.SDK_VERSION_CUR_DEVELOPMENT,
"com.android.server.SystemServer",
};
启动systemServer进程
通过类加载器加载,找到静态类中的main方法
找到了SystemServer类的main方法
加载服务的JNI,启动Android的所有服务