Android Runtime(三)

1.非zygote模式的RuntimeInit

frameworks/base/core/java/com/android/internal/os/RuntimeInit.java


221    public static final void main(String[] argv) {
222        if (argv.length == 2 && argv[1].equals("application")) {
223            if (DEBUG) Slog.d(TAG, "RuntimeInit: Starting application");
224            redirectLogStreams();
225        } else {
226            if (DEBUG) Slog.d(TAG, "RuntimeInit: Starting tool");
227        }//这里看到android进程zygote、systemserver、application、tool
228
229        commonInit();
230
231        /*
232         * Now that we're running in interpreted code, call back into native code
233         * to run the system.
234         */
235        nativeFinishInit();
236
237        if (DEBUG) Slog.d(TAG, "Leaving RuntimeInit!");
238    }

2.commonInit是初始化,看下nativefinfishInit,调用到native层

frameworks/base/core/jni/AndroidRuntime.cpp


 

188static void com_android_internal_os_RuntimeInit_nativeFinishInit(JNIEnv* env, jobject clazz)
189{
190    gCurRuntime->onStarted();
191}

 3.frameworks/base/cmds/app_process/app_main.cpp


 

virtual void onStarted()
83    {
84        sp<ProcessState> proc = ProcessState::self();
85        ALOGV("App process: starting thread pool.\n");
86        proc->startThreadPool();
87
88        AndroidRuntime* ar = AndroidRuntime::getRuntime();
89        ar->callMain(mClassName, mClass, mArgC, mArgV);
90
91        IPCThreadState::self()->stopProcess();
92    }

4.主要就是执行class的main命令


status_t AndroidRuntime::callMain(const char* className,
264    jclass clazz, int argc, const char* const argv[])
265{
266    JNIEnv* env;
267    jmethodID methodId;
268
269    ALOGD("Calling main entry %s", className);
270
271    env = getJNIEnv();
272    if (clazz == NULL || env == NULL) {
273        return UNKNOWN_ERROR;
274    }
275
276    methodId = env->GetStaticMethodID(clazz, "main", "([Ljava/lang/String;)V");//调用main
277    if (methodId == NULL) {
278        ALOGE("ERROR: could not find method %s.main(String[])\n", className);
279        return UNKNOWN_ERROR;
280    }
281
282    /*
283     * We want to call main() with a String array with our arguments in it.
284     * Create an array and populate it.
285     */
286    jclass stringClass;
287    jobjectArray strArray;
288
289    stringClass = env->FindClass("java/lang/String");
290    strArray = env->NewObjectArray(argc, stringClass, NULL);
291
292    for (int i = 0; i < argc; i++) {
293        jstring argStr = env->NewStringUTF(argv[i]);
294        env->SetObjectArrayElement(strArray, i, argStr);
295    }
296
297    env->CallStaticVoidMethod(clazz, methodId, strArray);
298    return NO_ERROR;
299}

 

最后附上比较清晰的图,忘记出处了,sorry

aa

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值