第一个线程是在 切记 所有后来的进程都是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);
所以我选择在这里清理资源。