
Zygote 是 Android 中的一个特殊进程,负责管理和高效地启动所有应用程序。它的名字来源于生物学中的“受精卵”,寓意为“所有 Android 应用进程的起源”。
service zygote /system/bin/app_process64 -Xzygote /system/bin --zygote --start-system-server --socket-name=zygote
-Xzygote /system/bin --zygote --start-system-server --socket-name=zygote-Xzygote: 切换虚拟机到 Zygote 模式,为预加载类和资源、内存共享以及应用进程的快速启动做好准备。--start-system-server:表示 zygote 会启动 SystemServer 进程,它是 Android 系统的核心服务进程。--socket-name:系统可以通过 zygote 这个 socket 名字与 Zygote 进程进行通信。--zygote: 一个标记,用于标识是 zygote 进程,然后会调用 ZygoteInit.main() 方法启动 Zygote 逻辑。
cc_binary {
name: "app_process",
srcs: ["app_main.cpp"],
multilib: {
lib32: {
suffix: "32",
},
lib64: {
suffix: "64",
},
},
......
int main(int argc, char* const argv[])
{
......
runtime.start("com.android.internal.os.ZygoteInit", args, zygote);
......
}


JNIEnv* env;
javaVm->AttachCurrentThread(&env, nullptr); // 获取当前线程的 JNIEnv*
/*
** env:JNIEv*
** className:要注册方法的Java类的全限定名(com/android/internal/os/RuntimeInit)
** methods:包含方法定义的数组,属于JNINativeMethod类型的数组
** NELEM(methods):数组长度
*/
int jniRegisterNativeMethods(JNIEnv* env, const char* className,
const JNINativeMethod* methods, int numMethods);
jniRegisterNativeMethods(env, "com/android/internal/os/RuntimeInit", methods, NELEM(methods));
typedef struct {
const char* name;
const char* signature;
void* fnPtr;
} JNINativeMethod;
以此为例进行说明:源码文件位置在 frameworks/base/core/jni/AndroidRuntime.cpp。
// frameworks/base/core/jni/AndroidRuntime.cpp
int register_com_android_internal_os_RuntimeInit(JNIEnv* env)
{
const JNINativeMethod methods[] = {
{"nativeFinishInit", "()V",
(void*)com_android_internal_os_RuntimeInit_nativeFinishInit},
{"nativeSetExitWithoutCleanup", "(Z)V",
(void*)com_android_internal_os_RuntimeInit_nativeSetExitWithoutCleanup},
};
return jniRegisterNativeMethods(env, "com/android/internal/os/RuntimeInit",
methods, NELEM(methods));
}
// frameworks/base/core/java/com/android/internal/os/RuntimeInit.java
private static final native void nativeFinishInit();
private static final native void nativeSetExitWithoutCleanup(boolean exitWithoutCleanup);
// frameworks/base/core/jni/AndroidRuntime.cpp
static void com_android_internal_os_RuntimeInit_nativeFinishInit(JNIEnv* env, jobject clazz)
{
// 设置初始化的本地逻辑
}
static void com_android_internal_os_RuntimeInit_nativeSetExitWithoutCleanup(JNIEnv* env,
jobject clazz, jboolean exitWithoutCleanup)
{
// 设置是否跳过清理的逻辑
}
// frameworks/base/core/jni/AndroidRuntime.cpp
int register_com_android_internal_os_RuntimeInit(JNIEnv* env)
{
const JNINativeMethod methods[] = {
{"nativeFinishInit", "()V",
(void*)com_android_internal_os_RuntimeInit_nativeFinishInit},
{"nativeSetExitWithoutCleanup", "(Z)V",
(void*)com_android_internal_os_RuntimeInit_nativeSetExitWithoutCleanup},
};
return jniRegisterNativeMethods(env, "com/android/internal/os/RuntimeInit",
methods, NELEM(methods));
}
static const RegJNIRec gRegJNI[] = {
......
REG_JNI(register_com_android_internal_os_RuntimeInit),
......
};
/*static*/ int AndroidRuntime::startReg(JNIEnv* env)
{
......
if (register_jni_procs(gRegJNI, NELEM(gRegJNI), env) < 0) {
env->PopLocalFrame(NULL);
return -1;
}
......
}
AndroidRuntime::startReg
⇒ register_jni_procs(gRegJNI, NELEM(gRegJNI), env)
⇒ register_com_android_internal_os_RuntimeInit
⇒ jniRegisterNativeMethods(env, “com/android/internal/os/RuntimeInit”, methods, NELEM(methods));

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

// frameworks/base/core/java/android/ddm/DdmRegister.java
public static void registerHandlers() {
if (false)
Log.v("ddm", "Registering DDM message handlers");
DdmHandleHello.register(); // 处理hello消息,主要是初始握手和功能发现
DdmHandleHeap.register(); // 处理内存堆的调试消息
DdmHandleNativeHeap.register(); // 处理Native堆的调试消息
DdmHandleProfiling.register(); // 处理性能分析的消息
DdmHandleExit.register(); // 处理进程退出的消息
DdmHandleViewDebug.register(); // 处理view调试相关的消息
DdmServer.registrationComplete(); // 通知DdmServer所有消息处理器已注册完成
}

preload() 这个函数在 Zygote 启动时加载系统框架所需的资源和类。
static void preload(TimingsTraceLog bootTimingsTraceLog) {
Log.d(TAG, "begin preload");
bootTimingsTraceLog.traceBegin("BeginPreload");
beginPreload();
bootTimingsTraceLog.traceEnd(); // BeginPreload
bootTimingsTraceLog.traceBegin("PreloadClasses");
preloadClasses();
bootTimingsTraceLog.traceEnd(); // PreloadClasses
bootTimingsTraceLog.traceBegin("CacheNonBootClasspathClassLoaders");
cacheNonBootClasspathClassLoaders();
bootTimingsTraceLog.traceEnd(); // CacheNonBootClasspathClassLoaders
bootTimingsTraceLog.traceBegin("PreloadResources");
preloadResources();
bootTimingsTraceLog.traceEnd(); // PreloadResources
Trace.traceBegin(Trace.TRACE_TAG_DALVIK, "PreloadAppProcessHALs");
nativePreloadAppProcessHALs();
Trace.traceEnd(Trace.TRACE_TAG_DALVIK);
Trace.traceBegin(Trace.TRACE_TAG_DALVIK, "PreloadGraphicsDriver");
maybePreloadGraphicsDriver();
Trace.traceEnd(Trace.TRACE_TAG_DALVIK);
preloadSharedLibraries();
preloadTextResources();
// Ask the WebViewFactory to do any initialization that must run in the zygote process,
// for memory sharing purposes.
WebViewFactory.prepareWebViewInZygote();
endPreload();
warmUpJcaProviders();
Log.d(TAG, "end preload");
sPreloadComplete = true;
}
preloadClasses()):优化 Java 层框架类的加载。
cacheNonBootClasspathClassLoaders())preloadResources()):减少资源解析时间。
nativePreloadAppProcessHALs()):图层分配器的 hal 加载
com/android/internal/os/ZygoteInit.java。android_internal_os_ZygoteInit_nativePreloadAppProcessHALs()。maybePreloadGraphicsDriver()):
nativePreloadGraphicsDriver()。android_internal_os_ZygoteInit_nativePreloadGraphicsDriver()。zygote_preload_graphics()。preloadSharedLibraries())
System.loadLibrary("android");,加载 libandroid.so,这是 Android 系统的核心库之一,提供许多底层功能。System.loadLibrary("jnigraphics");,加载 libjnigraphics.so,用于图形相关的 JNI 接口。warmUpJcaProviders())

主要依靠以下调用来完成:
// frameworks/base/core/java/com/android/internal/os/ZygoteInit.java
Zygote.initNativeState(isPrimaryZygote);
// frameworks/base/core/java/com/android/internal/os/Zygote.java
static void initNativeState(boolean isPrimary) {
nativeInitNativeState(isPrimary);
}
// frameworks/base/core/jni/com_android_internal_os_Zygote.cpp
static const JNINativeMethod gMethods[] = {
......
(void*)com_android_internal_os_Zygote_nativeSpecializeAppProcess},
{"nativeInitNativeState", "(Z)V", (void*)com_android_internal_os_Zygote_nativeInitNativeState},
......
}
static void com_android_internal_os_Zygote_nativeInitNativeState(JNIEnv* env, jclass,
jboolean is_primary) {
gZygoteSocketFD =
android_get_control_socket(is_primary ? "zygote" : "zygote_secondary");
......
gUsapPoolSocketFD =
android_get_control_socket(is_primary ? "usap_pool_primary" : "usap_pool_secondary");
......
initUnsolSocketToSystemServer();
......
}
static void initUnsolSocketToSystemServer() {
gSystemServerSocketFd = socket(AF_LOCAL, SOCK_DGRAM | SOCK_NONBLOCK, 0);
......
}


pid = Zygote.forkSystemServer()
zygoteServer.closeServerSocket();
handleSystemServerProcess(parsedArgs)
⇒ ZygoteInit.zygoteInit()
⇒ ZygoteInit.nativeZygoteInit();
⇒ com_android_internal_os_ZygoteInit_nativeZygoteInit()
⇒ gCurRuntime->onZygoteInit();
⇒ sp<ProcessState> proc = ProcessState::self();
⇒ proc->startThreadPool();

ProcessState::self()
⇒ init(kDefaultDriver, false /*requireDefault*/);
⇒ gProcess = sp<ProcessState>::make(driver); // 实例化对象
⇒ ProcessState::ProcessState(driver); //调用构造函数
⇒ open_driver(driver); // 打开binder驱动
⇒ status_t result = ioctl(fd, BINDER_VERSION, &vers); // 指定binder版本
⇒ result = ioctl(fd, BINDER_SET_MAX_THREADS, &maxThreads); // 设置binder线程池大小为15个
⇒ mVMStart = mmap(nullptr, BINDER_VM_SIZE, PROT_READ, MAP_PRIVATE | MAP_NORESERVE, opened.value(), 0); // BINDER_VM_SIZE = 1M size
在前面的 ProcessState 源码分析过程中,主要是下面流程:
sp<ProcessState> proc = ProcessState::self();
proc->startThreadPool(); //这里开始分析这个接口
以下是具体的分析调用过程:
proc->startThreadPool();
⇒ ProcessState::startThreadPool()
⇒ spawnPooledThread(true);
⇒ String8 name = makeBinderThreadName(); // 获得一个线程的名字
⇒ sp<Thread> t = sp<PoolThread>::make(isMain); // 实例化一个PoolThread线程
⇒ t->run(name.string()); // 运行这个线程
我们再进入 PoolThread 类的代码进一步阅读:
class PoolThread : public Thread
{
public:
explicit PoolThread(bool isMain)
: mIsMain(isMain)
{
}
protected:
virtual bool threadLoop()
{
IPCThreadState::self()->joinThreadPool(mIsMain);
return false;
}
const bool mIsMain;
};
这个 PoolThread 是继承于 Thread 父类,所以它是一个线程对象,当调用父类 run 方法时,threadLoop() 将会被调用,因此我们继续跟进 IPCThreadState::self()->joinThreadPool(mIsMain):
IPCThreadState::self()->joinThreadPool(mIsMain);
⇒ result = getAndExecuteCommand();
IPCThreadState 这个类对象表示进程中的一个线程对象,这边很清楚的展示了整个读取线程启动的过程,其实就是不断的从内核中读取发来的 binder 数据信息,并执行方法。
前面通过源码分析,我们知道在实例化 ProcessState 时,当它调用 startThreadPool 方法时,会创建一个线程,这个是 binder 主线程,但是它只有一个线程,又如何理解这个线程池呢?多线程体现在哪里?我们可以深入分析 getAndExecuteCommand 这个接口:
result = getAndExecuteCommand();
⇒ result = talkWithDriver();
⇒ ioctl(mProcess->mDriverFD, BINDER_WRITE_READ, &bwr) // 从内核的binder驱动中读数据
result = executeCommand(cmd); // 执行binder命令
⇒ case BR_SPAWN_LOOPER:mProcess->spawnPooledThread(false);
// 这种情况binder驱动要求创建多线程
// 通过线程中的进程对象ProcessState调用spawnPooledThread创建线程池
进一步思考,BR_SPAWN_LOOPER 这个情况是如何产生的呢?既然前面是 talkWithDriver(),说明这个数据来自binder驱动,所以需要跟进binder驱动代码,也就是内核binder驱动中会根据一些条件来触发这则消息来创建新的线程。
Java 的反射机制允许程序在运行时检查或操作类、接口、字段和方法,而无需在编译时确定。这在动态加载类、框架开发、工具实现等场景非常有用。
在前面启动 system server 案例中,主要有以下几个关键步骤:
Class<?> cl = Class.forName(className, true, classLoader); //Step 1
Method m;
m = cl.getMethod("main", new Class[] { String[].class }); //Step 2
int modifiers = m.getModifiers(); //Step 3
if (! (Modifier.isStatic(modifiers) && Modifier.isPublic(modifiers))) {
throw new RuntimeException("")
}
m.invoke(null, new Object[] { mArgs }); //Step 4
方法原型:
Class<?> forName(String className, boolean initialize, ClassLoader loader)
className: String类型,完整限定类名(包括包名)
initialize:布尔型,是否在加载类的同时对类进行初始化,true:立即执行类的静态初始化块和静态变量初始化,反之填false
loader:用于加载类的类加载器
如果为 null,默认使用系统类加载器(ClassLoader.getSystemClassLoader())
可以使用自定义的 ClassLoader 来加载特定类
对于 system server 进程为说,这个 className 应该是:“com.android.server.SystemServer”,并且会执行此类的静态初始化块和静态变量的初始化。通过这个接口,我们得到了 SystemServer 的 Class 对象。
Class 类的 getMethod 方法原型:
public Method getMethod(String name, Class<?>... parameterTypes)
参数1: name,方法的名字(这里为"main")
参数2:Class<?>... parameterTypes:该方法的参数类型数组
对于 main 方法,其参数是一个 String[] 数组(public static void main(String[] args)),所以需要将参数类型显式传递为 String[].class。
为什么需要加 new Class[] {}, getMethod 要求参数 2 是一个 Class<?> 类型的数组,用来描述方法的参数类型
new Class[] {}:表示创建一个 Class 类型的数组{ String[].class }:表示该数组里包含一个元素,类型是 String[]检查方法修饰信息。
int modifiers = m.getModifiers();
表示获取方法 m 的修饰符信息,方法 getModifiers() 返回的是一个 int 类型,表示方法的修饰符位掩码
在 Java 中,修饰符用一组位标志表示,例如:
Modifier.PUBLIC:方法是 public。
Modifier.STATIC:方法是 static。
Modifier.FINAL:方法是 final。
通过这些标志,可以使用工具类 Modifier 提供的静态方法检查具体修饰符,就是上面代码中的:
Modifier.isStatic(modifiers)及Modifier.isPublic(modifiers)等
使用 invoke 方法调用,执行 app 的 main() 方法。
package com.example;
public class Demo {
public static void main(String[] args) {
System.out.println("Demo.main() 被执行!");
if (args != null && args.length > 0) {
System.out.println("传入的参数:");
for (int i = 0; i < args.length; i++) {
System.out.println(" args[" + i + "] = " + args[i]);
}
} else {
System.out.println("未传入参数。");
}
}
}
package com.example;
import java.lang.reflect.Method;
public class ReflectInvokeMain {
public static void main(String[] args) {
try {
// 1. 加载目标类(这里是 com.example.Demo)
Class<?> targetClass = Class.forName("com.example.Demo");
// 2. 获取 main 方法
// main 方法的标准定义是:public static void main(String[] args)
// 所以参数类型是 String[].class
Method mainMethod = targetClass.getMethod("main", String[].class);
// 3. 组装参数
// 注意:调用 mainMethod.invoke 时,如果直接传 mainArgs,会被拆开,导致参数不匹配。
// 必须写成 (Object) mainArgs,强制作为一个整体数组传入
String[] mainArgs = {"hello", "world", "from", "reflection"};
// 4. 调用 main 方法
System.out.println("通过反射调用 Demo.main() ...");
mainMethod.invoke(null, (Object) mainArgs);
} catch (Exception e) {
e.printStackTrace();
}
}
}
javac com/example/Demo.java com/example/ReflectInvokeMain.java
java com.example.ReflectInvokeMain
输出结果大致如下:
通过反射调用 Demo.main() ...
Demo.main() 被执行!
传入的参数:
args[0] = hello
args[1] = world
args[2] = from
args[3] = reflection
Zygote 进程 fork 出普通 app 的程序核心逻辑位到 ZygoteServer.java中的runSelectLoop()方法。
在进入核心流程之前先来了解一下 usap 的工作逻辑:

fork() 创建 n 个通用USAP子进程(数量由系统配置决定)。Socket.accept(),等待任务分配(无CPU消耗)。fork() + 类加载的开销,提升应用启动速度 30%+。accept() 的 USAP 子进程(如 USAP子进程1)。specialize() 操作:
com.tencent.mm)。fork() 一个新的 USAP 子进程加入池中。n 个就绪USAP(自适应内存水位)。程序的核心逻辑如下(包含 usap 池子及事件的管理):


