Android的启动流程分析

Android的启动流程

Android系统的启动流程与Linux接近:

在这里插入图片描述

  • 1.引导加载程序(Bootloader)启动: 当设备上电或者重启时,首先会由引导加载程序负责启动。引导加载程序通常存储在设备的固件中,它的主要任务是初始化硬件,并加载并启动操作系统内核。引导加载程序会首先运行自身的初始化代码,然后加载操作系统内核到内存中。
  • 2.内核(kernel)加载: 引导加载程序会根据预定义的配置从设备存储中加载操作系统内核。在Android设备中,通常使用的是Linux内核。引导加载程序将内核加载到内存中的指定位置。
  • 3.内核(kernel)初始化: 一旦内核加载到内存中,引导加载程序会将控制权转交给内核。内核开始执行初始化过程,包括对硬件进行初始化、建立虚拟文件系统、创建进程和线程等。
  • 4.启动 init 进程: 内核初始化完成后,会启动名为init的用户空间进程。init进程是Android系统的第一个用户空间进程,它负责系统的进一步初始化和启动。init进程会读取系统配置文件(例如 init.rc),并根据其中的指令启动系统服务和应用程序。
  • 5.启动 Zygote 进程: 在init进程启动后,会启动名为Zygote的进程。Zygote进程是Android应用程序的孵化器,它会预加载常用的Java类和资源,以加速应用程序的启动。
  • 6.启动系统服务(SystemServer): 在Zygote进程启动后,还会启动一系列系统服务,例如SurfaceFlinger、ActivityManager、PackageManager等。这些系统服务负责管理系统的各个方面,包括显示、应用程序生命周期、包管理等。
  • 7.启动桌面程序(Launcher): 一旦系统服务启动完成,Android系统就处于可用状态。就会启动桌面程序,用户可以开始启动应用程序并使用设备进行各种操作了。

计算机启动过程、Linux内核(Kernel)启动过程和Zygote进程(孵化器进程)启动流程已经介绍了计算机启动、内核加载和启动Zygote进程,所以本篇文章从启动系统服务(SystemServer)开始介绍。

启动系统服务(System Server)

Zygote中通过Zygote.forkSystemServer方法创建了System Server进程,然后通过Java的反射机制调用com.android.server.SystemServermain方法来启动System Server。

Android14的System Server源码地址

SystemServer.java

SystemServer.javamain方法调用了自身的run方法,在run方法中启动了具体的系统服务,代码如下:

public static void main(String[] args) {
    new SystemServer().run();
}
 
private void run() {
    // 初始化系统属性,时区、语言、环境等,代码略
    ...
    // 加载本地服务
    System.loadLibrary("android_servers");
    ...
    // 初始化系统上下文
    createSystemContext();
    // 初始化主线模块
    ActivityThread.initializeMainlineModules();
    ...
    // 创建系统服务管理器
    mSystemServiceManager = new SystemServiceManager(mSystemContext);
    ...
 
    /* 启动系统服务 */
    // 启动引导服务
    startBootstrapServices(t);
    // 启动核心服务
    startCoreServices(t);
    // 启动其他服务
    startOtherServices(t);
    // 启动 APEX 服务
    startApexServices(t);
    ...
}

System Server启动的主要服务

以下为System Server启动的主要服务列表,具体实现可在源码中查看。

服务名称功能说明
Activity Manager Service (AMS)管理应用程序的生命周期,包括启动和停止应用、管理任务和活动栈、处理广播等
Package Manager Service (PMS)管理应用包的安装、卸载、更新、权限分配等
System Config Service管理系统配置和资源
Power Manager Service管理设备的电源状态和电源策略,如休眠、唤醒等
Display Manager Service管理显示设备,如屏幕亮度、显示模式等
User Manager Service管理用户账户和用户信息
Battery Service监控和管理电池状态和电池使用情况
Vibrator Service控制设备的振动功能
Sensor Service管理设备的传感器,如加速度计、陀螺仪等
Window Manager Service (WMS)管理窗口和显示内容,包括窗口的创建、删除、布局等
Input Manager Service管理输入设备,如触摸屏、键盘等
Alarm Manager Service提供定时任务调度功能
Connectivity Service管理网络连接,如 Wi-Fi、移动数据等
Network Management Service管理网络接口和网络连接
Telephony Registry管理电话和短信服务
Input Method Manager Service (IMMS)管理输入法框架
Accessibility Manager Service管理无障碍服务,为有特殊需要的用户提供辅助功能
Mount Service管理存储设备的挂载和卸载
Location Manager Service管理位置服务,如 GPS 和网络定位
Search Manager Service管理系统搜索功能
Clipboard Service管理剪贴板功能
DevicePolicy Manager Service管理设备的安全策略和企业管理功能
Status Bar Service管理状态栏显示和操作
Wallpaper Manager Service管理壁纸设置和操作
Media Router Service管理媒体设备路由

在系统服务全部启动完成后,就开始启动系统桌面程序Launcher了。

启动桌面程序(Launcher)

在这里插入图片描述

  • SystemServer 启动所有服务: SystemServer类在run方法中调用startOtherServices方法,启动其他系统服务,包括ActivityManagerService。
  • ActivityManagerService准备系统: ActivityManagerService 在systemReady方法中调用mAtmInternal.startHomeOnAllDisplays方法,开始在所有显示器上启动桌面程序。
  • ActivityTaskManagerService启动: Home Activity:ActivityTaskManagerService 调用RootWindowContainer的startHomeOnAllDisplays方法。
  • RootWindowContainer循环所有显示器: RootWindowContainer 遍历每个显示器,并调用startHomeOnDisplay方法。
  • 启动Home Activity: 在每个显示器上,通过TaskDisplayArea调用ActivityStartController的startHomeActivity方法,最终调用ActivityManagerService的startActivity方法启动Home Activity。
  • Home应用启动: ActivityManagerService处理启动请求,启动Home应用的Activity展示桌面界面。

核心代码流转:

SystemServer.java

Android14的System Server源码地址

private void run() {
    ...
    // 启动其他服务
    startOtherServices(t);
    ...
}
 
private void startOtherServices(@NonNull TimingsTraceAndSlog t) {
    ...
    // 启动ActivityManagerService
    mActivityManagerService = mSystemServiceManager.startService(
            ActivityManagerService.Lifecycle.class).getService();
    ...
    // 启动Launcher
    mActivityManagerService.systemReady(...)
    ...
}

桌面程序Launcher(Home)的启动流程

ActivityManagerService.java

Android14的ActivityManagerService源码地址

public void systemReady(final Runnable goingCallback, TimingsTraceAndSlog t) {
    ...
    // 在所有显示器上启动Launcher
    mAtmInternal.startHomeOnAllDisplays(currentUserId, "systemReady");
    ...
}
  • 此行代码最终会调用到ActivityTaskManagerService.javastartHomeOnAllDisplays方法

ActivityTaskManagerService.java

Android14的ActivityTaskManagerService源码地址

void startHomeOnAllDisplays(int userId, String reason) {
    synchronized (mGlobalLock) {
        // 在所有显示器上启动Launcher
        return mRootWindowContainer.startHomeOnAllDisplays(userId, reason);
    }
}
  • 此行代码最终会调用到RootWindowContainer.javastartHomeOnAllDisplays方法

RootWindowContainer.java

Android14的RootWindowContainer源码地址

 
boolean startHomeOnAllDisplays(int userId, String reason) {
    boolean homeStarted = false;
    for (int i = getChildCount() - 1; i >= 0; i--) {
        final int displayId = getChildAt(i).mDisplayId;
        // 在每一个显示器上启动桌面程序
        homeStarted |= startHomeOnDisplay(userId, reason, displayId);
    }
    return homeStarted;
}
 
boolean startHomeOnDisplay(int userId, String reason, int displayId) {
    return startHomeOnDisplay(userId, reason, displayId, false, false);
}
 
boolean startHomeOnDisplay(int userId, String reason, int displayId, boolean allowInstrumenting, boolean fromHomeKey) {
    ...
    // 调用startHomeOnTaskDisplayArea
    return display.reduceOnAllTaskDisplayAreas((taskDisplayArea, result) ->
                    result | startHomeOnTaskDisplayArea(userId, reason, taskDisplayArea,
                            allowInstrumenting, fromHomeKey),false);
}
 
boolean startHomeOnTaskDisplayArea(int userId, String reason, TaskDisplayArea taskDisplayArea,
        boolean allowInstrumenting, boolean fromHomeKey) {
    ...
    Intent homeIntent = mService.getHomeIntent();
    mService.getActivityStartController().startHomeActivity(homeIntent, aInfo, myReason,
            taskDisplayArea);
    ...
    return true;
}
 
  • 最终通过Intent和startHomeActivity方法启动了桌面程序

每个阶段都的核心工作

  1. Bootloader启动:初始化硬件并加载内核。
  2. 内核(kernel)启动:内核是操作系统的核心,负责管理系统资源和硬件设备。
  3. init进程启动:init进程通过解析init.rc文件来启动和配置系统服务。
  4. Zygote进程启动:Zygote是Android系统的独有设计,负责创建应用进程。通过预加载资源和共享内存,Zygote大大提高了应用启动的速度和系统资源的利用率。
  5. SystemServer进程启动:SystemServer进程启动了大量系统服务,如Activity Manager和Package Manager等,这些服务构成了Android系统的骨干,管理和协调应用的运行。
  6. 桌面程序(Launcher)启动:Launcher应用的启动标志着系统启动的完成。用户进入桌面,可以开始正常使用设备。

通过深入理解Android的启动流程,可以更有效地进行系统开发和维护,从而提供更高性能和更稳定的用户体验。

如果对你有帮助,就一键三连呗(关注+点赞+收藏),我会持续更新更多干货~~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序猿陌名!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值