重拾系列之——Android系统启动流程

概述

Android系统的启动从按电源键拉起Room,到加载引导程序唤醒nei,再经历init进程、Zygote进程、SystemServer进程启动各种系统服务进程,最后AMS启动Launcher进程进入到系统桌面。

init进程

init进程是系统中的第一个进程,在引导程序BootLoader唤醒内核后启动,init进程会在系统中找到一个init.rc脚本,init进程根据init.rc配置启动了zygote服务进程

Zygote进程

所有的应用进程、包括system_server都是Zygote创建的,通过复制自身创建进程,创建过程中会在内部创建一个虚拟机实例。Zygote进程在Java层中由ZygoteInit启动

public static void main(String argv[]) {
  	 	ZygoteServer zygoteServer = new ZygoteServer();//创建服务端socket,并在下面的zygoteServer.registerServerSocket(socketName)注册监听
  	 	
		......
   
        RuntimeInit.enableDdms();//启动DDMS,Dalvik Debug Monitor Service,Android 开发环境中的Dalvik虚拟机调试监控服务

		......
		
        zygoteServer.registerServerSocket(socketName);//注册zygote的socket监听端口
        if (!enableLazyPreload) {
			......
            preload(bootTimingsTraceLog);//加载系统资源
            ......
        } else {
            Zygote.resetNicePriority();
        }

       ......

        if (startSystemServer) {
        	//这里forkSystemServer服务进程
            Runnable r = forkSystemServer(abiList, socketName, zygoteServer);

            if (r != null) {
                r.run();
                return;
            }
        }
		//循环监听和接收消息
        caller = zygoteServer.runSelectLoop(abiList);
    } catch (Throwable ex) {
        Log.e(TAG, "System zygote died with exception", ex);
        throw ex;
    } finally {
        zygoteServer.closeServerSocket();
    }

    if (caller != null) {
        caller.run();
    }
}

Zygote进程流程如下:

  1. 创建AppRunTime并调用start方法,启动Zygote进程 创建JVM并注册JNI
  2. 通过JNI调用ZygoteInit的main方法进入Zygote的Java层
  3. 通过registerZygoteSocket方法创建服务端Socket,并通过runSelectLoop方法等待AMS请求
  4. 启动systemServer进程:forkSystemServer-》handleSystemServerProcess

SystemServer进程

SystemServer进程在系统中是一个非常重要的进程。我们常见的AMS、PMS和WMS以及支撑系统运行的BatteryService、DropBoxManagerService、UsageStatsService等等都在这里初始化的。

    public static void main(String[] args) {
        new SystemServer().run();
    }
    ......
    private void run() {
        try {
            // 判断时间是否需要重置1970.01.01
            if (System.currentTimeMillis() < EARLIEST_SUPPORTED_TIME) {
                SystemClock.setCurrentTimeMillis(EARLIEST_SUPPORTED_TIME);
            }
            ......
            
            Looper.prepareMainLooper();//初始化主线程Looper

            // Initialize native services.
            System.loadLibrary("android_servers");
			......
            // Initialize the system context.
            createSystemContext();//初始化context

            // Create the system service manager.
            //创建SystemServiceManager,后面的各种服务都由它来创建
            mSystemServiceManager = new SystemServiceManager(mSystemContext);
            mSystemServiceManager.setRuntimeRestarted(mRuntimeRestart);
            LocalServices.addService(SystemServiceManager.class, mSystemServiceManager);
            // Prepare the thread pool for init tasks that can be parallelized
            SystemServerInitThreadPool.get();
        } finally {
            traceEnd();  // InitBeforeStartServices
        }

        // Start services.
        try {
        	//启动n个服务
            startBootstrapServices();//引导服务
            startCoreServices();//核心服务
            startOtherServices();//其他服务
            SystemServerInitThreadPool.shutdown();
        } catch (Throwable ex) {
            throw ex;
        } finally {
            traceEnd();
        }
		......
        // Loop forever.进入Loop循环
        Looper.loop();
        throw new RuntimeException("Main thread loop unexpectedly exited");
    }

SystemServer进程主要做了哪些事情呢?

首先初始化了主线程Looper;创建SystemServerManager为后续的服务启动做准备;启动各种服务,主要分为三大种类:引导服务、核心服务和其他服务。

Launcher启动

Launcher进程算是系统启动的最后一步了,通过前面SystemServer进程已经初始化的AMS和PackageManagerService服务,由AMS启动Launcher,再通过PackageManagerService获取系统已安装应用信息,最后通过Launcher展示在ListView上。

最后

附上思维导图一张
在这里插入图片描述

欢迎关注我的个人微信公众号,【优了个秀】和你每天进步一点点
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值