《深入理解Android 卷1》读书笔记 (二)—— Android zygote浅析
1. Zygote —— Java世界的创建者Zygote 原意为“受精卵”,是Android里面Java世界的起源。 它创建了第一个Java虚拟机,也通过Fork产生了framework的核心system_server进程。个人觉得《深入理解Android 卷1》一书里对此部分的介绍比较详尽,我们通过看书,结合Android的源码就可窥知一二。Zygote创建Ja
·
1. Zygote —— Java世界的创建者
Zygote 原意为“受精卵”,是Android里面Java世界的起源。 它创建了第一个Java虚拟机,也通过Fork产生了
framework的核心system_server进程。个人觉得《深入理解Android 卷1》一书里对此部分的介绍比较详尽,
我们通过看书,结合Android的源码就可窥知一二。
Zygote创建Java世界的步骤为:
(1)创建AppRuntime对象,并调用它的start。(frameworks\base\cmds\app_process\app_main.c里的Main函数)
参数是在Init那边启动zygote时传过来的。
AppRuntime runtime;
const char* argv0 = argv[0];
// Process command line arguments
// ignore argv[0]
argc--;
argv++;
// Everything up to '--' or first non '-' arg goes to the vm
int i = runtime.addVmArguments(argc, argv);
解析部分参数,并将剩余未解析的保存,设置Process name。
while (i < argc) {
const char* arg = argv[i++];
if (!parentDir) {
parentDir = arg;
} else if (strcmp(arg, "--zygote") == 0) {
zygote = true;
niceName = "zygote";
} else if (strcmp(arg, "--start-system-server") == 0) {
startSystemServer = true;
} else if (strcmp(arg, "--application") == 0) {
application = true;
} else if (strncmp(arg, "--nice-name=", 12) == 0) {
niceName = arg + 12;
} else {
className = arg;
break;
}
}
if (niceName && *niceName) {
setArgv0(argv0, niceName);
set_process_name(niceName);
}
if (zygote) {
runtime.start("com.android.internal.os.ZygoteInit",
startSystemServer ? "start-system-server" : "");
}
(2)调动startVm创建Java虚拟机,然后调用startReg来注册JNI函数。
/* start the virtual machine */
JNIEnv* env;
if (startVm(&mJavaVM, &env) != 0) {
return;
}
onVmCreated(env);
/*
* Register android functions.
*/
if (startReg(env) < 0) {
ALOGE("Unable to register all android natives\n");
return;
}
对于startReg,这里稍作说明:
(register_jni_procs(gRegJNI, NELEM(gRegJNI), env) < 0)
static int register_jni_procs(const RegJNIRec array[], size_t count, JNIEnv* env)
{
for (size_t i = 0; i < count; i++) {
if (array[i].mProc(env) < 0) {
#ifndef NDEBUG
ALOGD("----------!!! %s failed to load\n", array[i].mName);
#endif
return -1;
}
}
return 0;
}
static const RegJNIRec gRegJNI[] = {
REG_JNI(register_android_debug_JNITest),
REG_JNI(register_com_android_internal_os_RuntimeInit),
REG_JNI(register_android_os_SystemClock),
REG_JNI(register_android_util_EventLog),
REG_JNI(register_android_util_Log),
REG_JNI(register_android_util_FloatMath),
REG_JNI(register_android_text_format_Time),
REG_JNI(register_android_content_AssetManager),
REG_JNI(register_android_content_StringBlock),
REG_JNI(register_android_content_XmlBlock),
...
...
}
会再提到)
(3)通过JNI调用com.android.internal.os.ZygoteInit类的main函数,从此进入了Java世界。
/*
* Start VM. This thread becomes the main thread of the VM, and will
* not return until the VM exits.
*/
char* slashClassName = toSlashClassName(className);
jclass startClass = env->FindClass(slashClassName);
if (startClass == NULL) {
ALOGE("JavaVM unable to locate class '%s'\n", slashClassName);
/* keep going */
} else {
jmethodID startMeth = env->GetStaticMethodID(startClass, "main",
"([Ljava/lang/String;)V");
if (startMeth == NULL) {
ALOGE("JavaVM unable to find main() in '%s'\n", className);
/* keep going */
} else {
env->CallStaticVoidMethod(startClass, startMeth, strArray);
#if 0
if (env->ExceptionCheck())
threadExitUncaughtException(env);
#endif
}
}
(4)调用registerZygoteSocket。通过这个函数,他可以响应子孙后代的请求。调用
preloadClasses和preloadResources预加载类和资源。
registerZygoteSocket();
EventLog.writeEvent(LOG_BOOT_PROGRESS_PRELOAD_START,
SystemClock.uptimeMillis());
preload();
EventLog.writeEvent(LOG_BOOT_PROGRESS_PRELOAD_END,
SystemClock.uptimeMillis());
// Finish profiling the zygote initialization.
SamplingProfilerIntegration.writeZygoteSnapshot();
// Do an initial gc to clean up after startup
gc();
// Disable tracing so that forked processes do not inherit stale tracing tags from
// Zygote.
Trace.setTracingEnabled(false);
// If requested, start system server directly from Zygote
if (argv.length != 2) {
throw new RuntimeException(argv[0] + USAGE_STRING);
}
if (argv[1].equals("start-system-server")) {
startSystemServer();
} else if (!argv[1].equals("")) {
throw new RuntimeException(argv[0] + USAGE_STRING);
}
Log.i(TAG, "Accepting command socket connections");
runSelectLoop();
closeServerSocket();
2. SystemServer
此处还是将书中的那个图抄过来吧,读者有时间的话,还是看下代码。
更多推荐
已为社区贡献1条内容
所有评论(0)