相关源码文件:
根据上篇 Android系统启动-Zygote进程
文章,在Zygote进程启动时,会调用 ZygoteInit.main() 方法,其中分别会调用 registerZygoteSocket、preload 、startSystemServer 、runSelectLoop 来创建服务Socket、提前加载资源、创建SystemServer进程、循环创建子进程。
本篇文章讲解 startSystemServer() 方法,在startSystemServer()方法中主要完成两件事:
· 创建SystemServer进程
· SystemServer进程启动系统服务
下图则是startSystemServer方法的创建过程,先通过 Zygote.forkSystemServe 去创建SystemServer进程,创建SystemServer进程之后,通过 handleSystemServerProcess() 在SystemServer进程中去启动服务。
Zygote.forkSystemServer :
创建 SystemServer 进程是通过 com.android.internal.os. Zygote 的 nativeForkSystemServer 本地方法创建的,JNI方法的注册在 AndroidRuntime 中,通过查询[包名]_[类名]可以知道对应的方法为:com_android_internal_os_Zygote.cpp类的com_android_internal_os_Zygote_nativeForkAndSpecialize()方法。最后通过 ForkAndSpecializeCommon 方法 fork() 创建SystemServer进程。
handleSystemServerProcess(parsedArgs)
通过一连串的分析得知,一是通过 nativeZygoteInit 去启动Bind,二是通过 applicationInit 方法通过异常去反射执行 SystemServer.main 方法,这里为什么需要通过异常去反射执行方法呢?为什么不直接反射执行方法?其实是为了清空栈的信息。到这里并没有启动服务,接下来的 SystemServer.main 方法是启动服务的开始。
SystemServer.main
SystemServer执行 main() 方法后调用 run 方法,之后分别调用 startBootstrapServices 、 startCoreServices 、 startOtherServices 开始启动很多服务,像常见的 ActivityManagerService、PackageManagerService、WindowManagerService、InputManagerServic 服务都在这里开启。
开启服务有两种方式:
但是发现最终都是调用到LocalServices.addService这种方法。
可见启动服务是靠Binder驱动去开启的。
首先通过JNI的注册方法去创建SystemServer进程,创建进程之后,开始处理SystemServer进程,通过异常反射调用SystemServer的main方法,主要完成两件事:一、启动Binder驱动线程,二、开启服务(AMS、PMS、WMS、IMS等),最后通过Binder驱动去启动服务。