239 字
1 分钟
主线程创建时机

主线程创建时机#

ZygoteInit#zygoteInit中完成进程的初始化动作

frameworks/base/core/java/com/android/internal/os/ZygoteInit.java
public static Runnable zygoteInit(int targetSdkVersion, long[] disabledCompatChanges,
String[] argv, ClassLoader classLoader) {
...
// 原生添加名为“ZygoteInit ”的systrace tag以标识进程初始化流程
Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "ZygoteInit");
RuntimeInit.redirectLogStreams();
// 1.RuntimeInit#commonInit中设置应用进程默认的java异常处理机制
RuntimeInit.commonInit();
// 2.ZygoteInit#nativeZygoteInit函数中JNI调用启动进程的binder线程池
ZygoteInit.nativeZygoteInit();
// 3.RuntimeInit#applicationInit中反射创建ActivityThread对象并调用其“main”入口方法
return RuntimeInit.applicationInit(targetSdkVersion, disabledCompatChanges, argv,
classLoader);
}

应用进程启动后,初始化过程中主要依次完成以下几件事情:

  1. 应用进程默认的java异常处理机制(可以实现监听、拦截应用进程所有的Java crash的逻辑);
  2. JNI调用启动进程的binder线程池(注意应用进程的binder线程池资源是自己创建的并非从zygote父进程继承的);
  3. 通过反射创建ActivityThread对象并调用其“main”入口方法。
主线程创建时机
作者
强人自传
发布于
2024-03-15
许可协议
CC BY-NC-SA 4.0