android 启动学习

来源:互联网 发布:java 接口参数泛型 编辑:程序博客网 时间:2024/05/16 03:30

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

原创粉丝点击