5张图搞懂Android系统启动的核心流程( 二 )


至此就正式启动了 。

5张图搞懂Android系统启动的核心流程

文章插图
综上,init进程读取配置文件init.rc后,fork出进程,通过函数执行的执行程序,进入类的main函数 。
下面详细分析和 。

前边可知.cpp的main函数会调用.start() 。
//frameworks/base/core/jni/AndroidRuntime.cppvoid AndroidRuntime::start(...){//1. 启动java虚拟机if (startVm(&mJavaVM, &env, zygote) != 0) {return;}//2. 为java虚拟机注册JNI方法if (startReg(env) < 0) {return;}//根据传入的参数找到ZygoteInit类和他的main函数//3. 通过JNI调用ZygoteInit的main函数env->CallStaticVoidMethod(startClass, startMeth, strArray);}
Java层
来到的main函数 。
//ZygoteInit.javapublic static void main(String argv[]) {//是否要创建SystemServerboolean startSystemServer = false;//默认的socket名字String socketName = "zygote";//是否要延迟资源的预加载boolean enableLazyPreload = false;for (int i = 1; i < argv.length; i++) {if ("start-system-server".equals(argv[i])) {//在init.rc文件中,有--start-system-server参数,表示要创建SystemServerstartSystemServer = true;} else if ("--enable-lazy-preload".equals(argv[i])) {//init.rc没有这个参数,资源的预加载不会被延迟enableLazyPreload = true;} else if (argv[i].startsWith(SOCKET_NAME_ARG)) {//init.rc可以通过--socket-name=指定socket名字来覆盖默认值socketName = argv[i].substring(SOCKET_NAME_ARG.length());}}//1. 创建服务端socket,名字为socketName即zygotezygoteServer.registerServerSocket(socketName);if (!enableLazyPreload) {//2. 没有被延迟,就预加载资源preload(bootTimingsTraceLog);}if (startSystemServer) {//3. fork并启动SystemServer进程startSystemServer(abiList, socketName, zygoteServer);}//4. 等待AMS请求(AMS会通过socket请求Zygote来创建应用程序进程)zygoteServer.runSelectLoop(abiList);}
总结一下层的3个环节和Java层的4个环节:
5张图搞懂Android系统启动的核心流程

文章插图
/ 启动 /
进程主要负责创建启动系统服务如AMS、WMS和PMS等 。
从前边可知进程由进程fork出来并启动,在类中 。
//ZygoteInit.javaprivate static boolean startSystemServer(...){String args[] = {//...//启动的类名:"com.android.server.SystemServer",};//fork进程,由native层实现pid = Zygote.forkSystemServer();//处理SystemServer进程handleSystemServerProcess(parsedArgs);}private static void handleSystemServerProcess(...){ZygoteInit.zygoteInit(...);}public static final void zygoteInit(...){//启动binder线程池ZygoteInit.nativeZygoteInit();//内部经过层层调用,找到"com.android.server.SystemServer"类和他的main函数,然后执行RuntimeInit.applicationInit(targetSdkVersion, argv, classLoader);}
这里启动了线程池,进程就可以用机制来跨进程通信了(进程是用来通信的),接着进入了的main函数 。
5张图搞懂Android系统启动的核心流程

文章插图
//SystemServer.javapublic static void main(String[] args) {new SystemServer().run();}private void run() {//创建looperLooper.prepareMainLooper();//加载动态库libandroid_servers.soSystem.loadLibrary("android_servers");//创建系统上下文createSystemContext();//创建SSM,用于服务的创建、启动和生命周期管理mSystemServiceManager = new SystemServiceManager(mSystemContext);//服务根据优先级被分成3批来启动://启动引导服务,如AMS、PMS等startBootstrapServices();//启动核心服务startCoreServices();//启动其他服务startOtherServices();//开启looper循环Looper.loop();}
看下AMS的启动 。