Zygote启动脚本
init.rc是以import方式来引入各个模块的rc的
路径:system/core/rootdir/init.zygote32.rc
init.rc也在这个目录,还有64位的init.zygote64.rc,安卓支持32位和64位
rc中的内容:
main入口
frameworks/base/cmds/app_process/app_main.cpp
main方法中,最终执行frameworks/base/core/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);
} else {
fprintf(stderr, "Error: no class name or --zygote supplied.\n");
app_usage();
LOG_ALWAYS_FATAL("app_process: no class name or --zygote supplied.");
}
AndroidRuntime::start()中会调用startVm, 这里启动了虚拟机
/* * Start VM. This thread becomes the main thread of the VM, and will * not return until the VM exits. */
char* slashClassName = toSlashClassName(className != NULL ? className : "");
jclass startClass = env->FindClass(slashClassName);
if (startClass == NULL) {
ALOGE("JavaVM unable to locate class '%s'\n", slashClassName);
/* keep going */}
else {
jmethodID startMeth = env->GetStaticMethodID(startClass, "main",
"([Ljava/lang/String;)V");
if (startMeth == NULL) {
ALOGE("JavaVM unable to find main() in '%s'\n", className);
/* keep going */
} else {
env->CallStaticVoidMethod(startClass, startMeth, strArray);
}
执行完startVm,通过调用JNIEnv调用ZygoteInit的main,这时候就回到的java层
ZygoteInit主要流程:
1. 开启socket , ZygoteInit.java::main
- zygoteServer = new ZygoteServer(isPrimaryZygote);
- Zygote.createManagedSocketFromInitSocket
- new LocalServerSocket(fd);
2. preloadClasser:预加载android的一些核心类,/system/etc/preloaded-classes
3. preloadResources
4. 启动fork出systemServer
-
zygote.java::nativeForkSystemServer
-
com_android_internal_os_Zygote.cpp::com_android_internal_os_Zygote_nativeForkSystemServer
-
zygote::ForkCommon
-
pid_t pid = fork(); //最终fork进程 ,通过unistd.h中的方法访问操作系统核心功能的接口
5. 启动socket循环,接受socket消息, ZygoteServer.java ->
zygoteServer::runSelectLoop(abiList);
6. ZygoteServer的runSelectLoop方法中,会不断的获取Socket消息,如果是创建进程消息,就fork出进程
if (pollIndex == 0) {
// Zygote server socket
ZygoteConnection newPeer = acceptCommandPeer(abiList);
peers.add(newPeer);
socketFDs.add(newPeer.getFileDescriptor());}
else if (pollIndex < usapPoolEventFDIndex) {
// Session socket accepted from the Zygote server socket
try {
ZygoteConnection connection = peers.get(pollIndex);
boolean multipleForksOK = !isUsapPoolEnabled()&& ZygoteHooks.isIndefiniteThreadSuspensionSafe();
final Runnable command = connection.processCommand(this, multipleForksOK);
....
1.acceptCommandPeer中创建ZygoteConnection,接受消息
2.processCommand 中调用Zygote.forkAndSpecialize孵化出普通app进程
7. 接着执行Zygoteinit::handleSystemServerProcess
8. 调用ZygoteInit.zygoteInit,方法中执行ZygoteInit.nativeZygoteInit();会启动binder线程池,调用AndroidRuntime.cpp中的JNI方法com_android_internal_os_ZygoteInit_nativeZygoteInit
gCurRuntime->onZygoteInit();调用到app_main.cpp
virtual void onZygoteInit(){
sp<ProcessState> proc = ProcessState::self();
ALOGV("App process: starting thread pool.\n");
proc->startThreadPool(); //开启binger线程池
}
9.回到ZygoteInit, 启动完binder线程池,执行
RuntimeInit.applicationInit(targetSdkVersion, disabledCompatChanges, argv, classLoader);
10.applicationInit中findStaticMain(args.startClass, args.startArgs, classLoader),找到SystemServer的main方法,执行,然后进入SystemServer的启动流程
args.startClass是从前面中层层传递过来,就是com.android.server.SystemServer
/* Hardcoded command line to start the system server */
String[] args = {
"--setuid=1000",
"--setgid=1000",
"--setgroups=1001,1002,1003,1004,1005,1006,1007,1008,1009,1010,1018,1021,1023,"
+ "1024,1032,1065,3001,3002,3003,3006,3007,3009,3010,3011",
"--capabilities=" + capabilities + "," + capabilities,
"--nice-name=system_server", "--runtime-args",
"--target-sdk-version=" + VMRuntime.SDK_VERSION_CUR_DEVELOPMENT,
"com.android.server.SystemServer",};
ZygoteArguments parsedArgs;
SystemServer启动
每个服务初始化成功后回调systemReady
startOtherService最后开始执行startSystemUI
注意:
SystemServerManager是systemServer的服务管理类
ServiceManager是应用层跨进程调用时常用的服务类(Binder DNS服务器)
参考资料:
Android Framework实战视频--Zygote的启动_哪里有完整的androidframework视频教学-CSDN博客
Android Framework实战视频--Zygote的fork进程篇_android framework实战视频-- zygote的fork进程篇-CSDN博客
Android Framework实战视频--SystemServer启动篇_实战视频 zygote的启动-CSDN博客