android进阶篇07、android系统启动流程简述

512 阅读3分钟

一、前言

1、安卓平台分层简介

安卓系统由上往下主要分为以下几层:

系统应用层:主要是一些系统自带的APP和开发者开发的app;

Java API框架层:主要是开发所需的Android和Java的类库;

Native C/C++层:native层,主要时C和C++编写的一些类库,与Java Framework层相互调用;

Android Runtime层:主要包括运行时虚拟机和运行时所需的核心类库;

Hardware Abstraction Layer硬件抽象层:对蓝牙、音视频、传感器、相机组件的抽象;

Linux内核层:主要时Linux操作系统和各种硬件驱动;

2、安卓系统启动的简化流程

Boot ROM -- Boot Loader -- Kernel -- init -- Zygote -- SystemServer -- App

设备上电后首先从ROM特定区域启动loader的一个小程序,然后通过loader拉起linux内核,接着会启动第一个用户进程init,然后init进程启动Zygote进程,Zygote进程接着启动SystemServer进程,最后启动Launcher应用程序进程显示桌面图标;

二、主要进程的简要分析

1、init进程

1)、创建和挂载启动所需要的文件目录

2)、初始化和启动属性服务

3)、解析init.rc配置文件并启动Zygote进程

2、Zygote进程

所有的Java应用程序进程及系统服务SystemServer进程都由Zygote进程通过linux的fork()函数孵化出来的,Zgyote是Android中的第一个art虚拟机,他通过socket的方式与其他进程进行通信,这个其他进程主要是指SystemServer进程。Zygote进程作为服务端,主要作用如下;

1)、负责创建java虚拟机;

2)、加载系统资源;

3)、启动SystemServer进程;

4)、等待普通应用请求,创建应用程序进程,中间一般是通过AMS请求;等待的过程在runSelectLoop函数中;

3、SystemServer进程

SystemServer进程启动过程在SystemServer的main函数中,main函数又调用了run函数,主要流程如下;

注释1处先创建了主线程的looper;

注释2处创建了SystemContext;

注释3、4、5启动各种服务;

注释6开启loop循环;

//创建消息Looper
Looper.prepareMainLooper(); //1
//创建系统的Context
createSystemContext(); //2
// Start services.
traceBeginAndSlog("StartServices");
//启动引导服务
startBootstrapServices(); //3
//启动核心服务
startCoreServices(); //4
//启动其他服务
startOtherServices(); //5
// Loop forever.
Looper.loop(); //6

注释2处函数如下:

private void createSystemContext() {
    ActivityThread activityThread = ActivityThread.systemMain();
    mSystemContext = activityThread.getSystemContext();
    mSystemContext.setTheme(DEFAULT_SYSTEM_THEME);

    final Context systemUiContext = activityThread.getSystemUiContext();
    systemUiContext.setTheme(DEFAULT_SYSTEM_THEME);
}

注释3处启动引导服务的函数如下所示;

在注释a处的startService会调用mServices.add(service),这个mServices是存储SystemService类型的ArrayList,用于保存所有开启的服务;

注释b处的方法会调用ServiceManager.addService(Context.ACTIVITY_SERVICE, this, true);将AMS添加到ServiceManager中,这样AMS就可以用于Binder进程间通信了;

这里我们就举例了一个引导服务中非常重要的AMS,并且没有展开介绍AMS,我们后边会单独介绍AMS,还有很多其他重要的服务我们后边也再单独介绍,例如WMS、PMS、PKMS、IMS等等;正是借助这些系统服务才使得android系统中各个应用之间有条不紊的运行;

private void startBootstrapServices() {
    // Activity manager runs the show.
    traceBeginAndSlog("StartActivityManager");
    mActivityManagerService = mSystemServiceManager.startService(
            ActivityManagerService.Lifecycle.class).getService(); //a
    mActivityManagerService.setSystemServiceManager(mSystemServiceManager);
    mActivityManagerService.setInstaller(installer);
    traceEnd();
    、、、
    // Set up the Application instance for the system process and get started.
    traceBeginAndSlog("SetSystemProcess");
    mActivityManagerService.setSystemProcess(); //b
    traceEnd();
    、、、
}