android java 虚拟机 thread

第一个线程是在 切记 所有后来的进程都是zygote孵化出来的。所以只很多前期初始化的工作不会再次进入。比如Create startvm等等因为是fork的

init 启动了zygote zygote启动了 system_server然后等待system_server传递启动activity的消息过来。等待的时候zygote已经进入vm虚拟机器了。每次接受到system_server的消息就执行runonce() 在这里里面执行fork然后运行zygote class的类。然后继续等待。所以我们在runtime->callexithook里面执行我们的注销就行了。实在不行也没办法。不清理资源了

 

接收到进程启动通知以后 zygote fork一个进程(art/cmds/app_process/app_main.cpp)调用AndroidRuntime::start(art/jni/AndroidRuntime.cpp) start

if (zygote) {
        runtime.start("com.android.internal.os.ZygoteInit", args, zygote);
    } else if (className) {
        runtime.start("com.android.internal.os.RuntimeInit", args, zygote);

启动了 frameworks/base/core/java/com/android/internal/os/runtimeInit.java的main函数

jmethodID startMeth = env->GetStaticMethodID(startClass, "main",
            "([Ljava/lang/String;)V");
            env->CallStaticVoidMethod(startClass, startMeth, strArray);

CallStaticVoidMethod最后调用的也是method->Invoke进入执行的。也就{public static void main(String args[]);}

 

 

 

 

AndroidRuntime::startVm->JNI_CreateJavaVM->Runtime::Create->Runtime::Init

Runtime::Init 里面调用

Thread* self = Thread::Attach("main", false, nullptr, false);

附加上去

剩下的由java里创建的线程主要是

java_lang_Thread 里面调用

  Thread::CreateNativeThread(env, java_thread, stack_size, daemon == JNI_TRUE);

pthread_create_result = pthread_create(&new_pthread,
                                           &attr,
                                           Thread::CreateCallback,
                                           child_thread);

CreateCallback 中

先Dbg::PostThreadStart(self); 报告了线程启动

InvokeVirtualOrInterfaceWithJValues(soa, ref.get(), mid, nullptr);执行Java线程

线程结束的时候 

Runtime::Current()->GetThreadList()->Unregister(self); 里面报告了线程结束。

 

 

可以在void Runtime::CallExitHook(jint status)里面执行清理工作。因为JVM_Exit(jint status)的时候调用了art::Runtime::Current()->CallExitHook(status);

所以我选择在这里清理资源。

 

你可能感兴趣的:(android)