init进程 读取init.rc 启动servicemanager作为binder的守护进程。
还会启动Zygote孵化进程,调用的是app_main.cpp中的main()方法,继续调用
androidRuntime.cpp,在androidRuntim类的start()方法中启动虚拟机,注册一些JNI调用。
通过JNI调用ZygoteInit.java孵化器的初始化 ,在ZygoteInit的main()方法中,创建本地
soctet通讯.
又通过调用startSystemServer 创建子进程,在子进程中
调用 RuntimeInit.zygoteInit 做本地初始化。
又调用systemserver.java,在systemserver.java的main()中包含init1()、JNI调用
android_server_SystemServer_init1 调用system_init.cpp 做了一些系统初始化工作。
然后runtime->callStatic("com/android/server/SystemServer", "init2")
和init2() 调用Thread thr = new ServerThread();
thr.start(); 线程调用进入其start中 Looper.prepare();之后添加系统远
程服务
strlcpy(char *dst, const char *src, size_t siz)
void setArgv0(const char *argv0, const char *newArgv0)
{
strlcpy(const_cast<char *>(argv0), newArgv0, strlen(argv0));
}
static void blockSigpipe()
{
sigset_t mask;
sigemptyset(&mask);
sigaddset(&mask, SIGPIPE);//暂时阻塞SIGPIPE信号
if (sigprocmask(SIG_BLOCK, &mask, NULL) != 0)
LOGW("WARNING: SIGPIPE not blocked\n");
}
strdup(threadName);
#ifdef NDEBUG
#define REG_JNI(name) { name }
struct RegJNIRec {
int (*mProc)(JNIEnv*);
};
#else
#define REG_JNI(name) { name, #name }
struct RegJNIRec {
int (*mProc)(JNIEnv*);
const char* mName;
};
#endif
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
LOGD("----------!!! %s failed to load\n", array[i].mName);
#endif
return -1;
}
}
return 0;
}
dvmDecodeIndirectRef DeleteLocalRef
static jint android_debug_JNITest_part1(JNIEnv* env, jobject object,
jint intArg, jdouble doubleArg, jstring stringArg, jobjectArray arrayArg)
{
jclass clazz;
jmethodID part2id;
jsize arrayLen;
jint arrayVal;
int result = -2;
LOGI("JNI test: in part1, intArg=%d, doubleArg=%.3f\n", intArg, doubleArg);
/* find "int part2(double doubleArg, int fromArray, String stringArg)" */
clazz = env->GetObjectClass(object);
part2id = env->GetMethodID(clazz,
"part2", "(DILjava/lang/String;)I");
if (part2id == NULL) {
LOGE("JNI test: unable to find part2\n");
return -1;
}
/* get the length of the array */
arrayLen = env->GetArrayLength(arrayArg);
LOGI(" array size is %d\n", arrayLen);
/*
* Get the last element in the array.
* Use the Get<type>ArrayElements functions instead if you need access
* to multiple elements.
*/
arrayVal = (int) env->GetObjectArrayElement(arrayArg, arrayLen-1);
LOGI(" array val is %d\n", arrayVal);
/* call this->part2 */
result = env->CallIntMethod(object, part2id,
doubleArg, arrayVal, stringArg);
return result;
}
PushLocalFrame
PopLocalFrame
stringClass = env->FindClass("java/lang/String");
assert(stringClass != NULL);
strArray = env->NewObjectArray(2, stringClass, NULL);
assert(strArray != NULL);
classNameStr = env->NewStringUTF(className);
assert(classNameStr != NULL);
env->SetObjectArrayElement(strArray, 0, classNameStr);
startSystemServerStr = env->NewStringUTF(startSystemServer ?
"true" : "false");
env->SetObjectArrayElement(strArray, 1, startSystemServerStr);
slashClassName = strdup(className);
for (cp = slashClassName; *cp != '\0'; cp++)
if (*cp == '.')
*cp = '/';
startClass = env->FindClass(slashClassName);
if (startClass == NULL) {
LOGE("JavaVM unable to locate class '%s'\n", slashClassName);
/* keep going */
} else {
startMeth = env->GetStaticMethodID(startClass, "main",
"([Ljava/lang/String;)V");
if (startMeth == NULL) {
LOGE("JavaVM unable to find main() in '%s'\n", className);
/* keep going */
} else {
env->CallStaticVoidMethod(startClass, startMeth, strArray);
DetachCurrentThread