探秘Android系统启动的神秘面纱


系统启动过程对于任何操作系统来说都是一个非常关键的环节,Android作为移动设备领域中占据主导地位的操作系统,其启动过程也是个值得深入研究的重点话题。本文将为您解开Android启动过程的神秘面纱,详细剖析其中的每一个步骤,并通过实战案例,帮助您从实践中理解这个复杂而精密的过程。


由于Android 系统是基于 Linux 内核的,所以启动过程与 Linux 系统有很多相似的地方。

对linux 系统启动过程比较感兴趣的朋友,建议前往查阅:揭秘Linux启动的层层面纱,一文看懂从黑屏到界面的精彩之旅


在开始之前,首先来一张图 完整展示 Android 系统启动过程:

在这里插入图片描述


一、Bootloader


Android 设备作为嵌入式系统,没有像传统计算机那样的 BIOS 程序,而是使用 Bootloader 来完成系统启动前的初始化工作。Bootloader 负责初始化硬件,建立内存映射,并为加载系统内核做好准备。

Android 设备使用的是 ROM(只读存储器)来存储操作系统和用户程序,而不是硬盘。ROM 被划分为多个区域,每个区域用于存放不同类型的数据,具体如下:

  • /boot:存储启动程序,包括内核和内存管理程序。
  • /system:相当于电脑中的 C 盘,用于存储 Android 系统和系统应用程序。
  • /recovery:恢复分区,允许用户在此区域执行系统恢复操作。
  • /data:用户数据分区,存储用户的个人信息,如联系人、短信、应用设置等。
  • /cache:系统缓存分区,用于存储系统频繁访问的数据和应用程序。
  • /misc:包含系统设置和功能启用/禁用等杂项信息。
  • /sdcard:用户存储分区,用于存储照片、音乐、视频等个人文件。

在这里插入图片描述


启动 Android 设备时,Bootloader 是首先被加载的组件,类似于 PC 的启动过程。当设备开机并通电时,Bootloader 会被自动加载。

Bootloader 的任务是从 ROM 中读取操作系统信息,并将 Linux 内核加载到设备的随机存取存储器(RAM)中。

一旦 Linux 内核开始运行,它会进行一系列的初始化操作,包括配置硬件和软件环境、加载必要的驱动程序以及挂载根文件系统。这些步骤完成后,Linux 内核会启动 init 进程,这是用户空间的第一个进程,负责管理系统的启动和运行。


二、 init 进程 与 init.rc 文件

在这里插入图片描述


1、init进程介绍

在Android系统中,init进程是一个非常重要的系统进程,它是用户空间的第一个进程,具有PID(进程ID)1。init进程负责启动系统启动过程中的其他所有进程,以及管理系统的运行时环境。

以下是init进程的一些关键职责:

  • 启动服务init进程会根据启动脚本启动系统服务和应用程序,例如窗口管理器、网络守护进程等。
  • 处理启动脚本init进程会解析init.rc文件和其他.rc文件,这些脚本定义了系统启动过程中的一系列动作和条件。
  • 管理运行级别:Android的init进程管理不同的运行级别(runlevels),每个级别都对应一组应该运行的服务和进程。
  • 监听系统事件init进程会监听系统事件,如按键事件、电源事件等,并根据这些事件触发相应的动作。
  • 恢复模式:在系统启动失败或用户选择恢复模式时,init进程会启动恢复系统。

Kernel 启动后会调用 /system/core/init/Init.cpp 的 main() 方法。

  • Init.main()

首先初始化 Kernel log,创建一块共享的内存空间,加载 /default.prop 文件,解析 init.rc 文件。


2、init.rc文件介绍

init.rc文件是Android系统中的一个关键脚本文件,它位于/system/etc/init目录下。这个文件包含了一系列的命令和脚本,用于定义系统启动时应该执行的操作。

以下是init.rc文件的一些特点:

  • 语法init.rc文件使用一种简单的脚本语言,包括服务定义、条件语句和命令。
  • 服务定义:在init.rc中,每个服务都通过一系列的属性来定义,如service关键字、服务名称、启动命令、依赖关系等。
  • 条件执行init.rc支持条件执行,可以根据系统的状态或属性来决定是否启动某个服务。
  • 依赖管理:服务之间可以定义依赖关系,确保服务按照正确的顺序启动。
  • 启动阶段init.rc中的服务可以根据启动阶段(如early boot, late boot等)来分组,以控制服务的启动时机。
  • 资源管理init.rc还可以控制资源的分配,例如网络资源的分配和释放。

init.rc脚本文件在Android系统中扮演着关键角色,它配置了一系列基础服务,这些服务对于系统的正常启动和运行至关重要。init进程通过解析init.rc文件并创建子进程来启动这些服务。这些服务主要运行在Linux内核空间,并以守护进程的形式在后台提供服务,通常通过socket与系统其他部分通信。

以下是通过init.rc脚本启动的一些核心服务:

  • service_manager:负责启动Binder IPC机制,它是Android中用于进程间通信的关键技术,同时管理着系统中所有的服务。
  • mountd:作为设备安装守护进程,它负责处理设备的安装和状态通知。
  • debuggerd:启动调试系统,处理系统调试相关的请求。
  • rild:即Radio Interface Layer Daemon,它处理与电话相关的事件和请求。
  • media_server:启动多媒体服务,包括AudioFlinger、MediaPlayerService和CameraService,负责音频、视频播放和摄像头功能。
  • surface_flinger:SurfaceFlinger负责管理显示输出,是Android图形系统的一个核心组件。
  • zygote:作为进程孵化器,它启动Android Java运行时环境和system_server进程,负责孵化新的应用程序进程。

当这些服务启动并运行后,用户便能在设备屏幕上看到"Android"的标志,这通常意味着系统已经完成了关键的初始化步骤。

完成上述启动任务后,init进程将进入循环状态,继续监控和管理系统的运行。

init进程和init.rc文件共同工作,确保Android系统能够正确、高效地启动和运行。通过这些机制,Android系统可以在启动时加载必要的服务,同时保持系统的稳定性和响应性。


三、service_manager 进程


service_manager进程在Android系统中扮演着至关重要的角色。它是系统服务管理的核心组件,负责启动、管理和协调系统服务之间的通信。

以下是service_manager进程的一些关键功能和特点:

  1. 启动系统服务service_manager进程在系统启动时被init进程启动。它负责启动系统中的各个服务,这些服务是Android运行所必需的,包括窗口管理器、电源管理器、网络守护进程等。
  2. Binder IPC机制service_manager进程使用Binder机制来实现进程间通信(IPC)。Binder是Android中的一种IPC框架,允许不同进程之间通过一个客户端-服务器模型进行通信。
  3. 服务注册与发现:系统服务在启动时会向service_manager注册自己,提供服务名称和相关的服务对象。这样,当其他进程需要某个服务时,可以通过service_manager来查找并获取服务对象。
  4. 服务管理service_manager进程还负责管理服务的生命周期,包括服务的启动、停止和重启。它确保服务按照正确的顺序和依赖关系启动。
  5. 权限管理service_manager进程还负责权限管理,确保只有授权的进程才能访问特定的服务。
  6. 服务调度service_manager进程还参与服务的调度工作,确保服务能够及时响应请求。
  7. 守护进程service_manager作为一个守护进程,它在后台运行,不依赖于任何特定的应用程序或服务。
  8. 系统稳定性:由于service_manager进程管理着系统中的许多关键服务,它对于维护整个系统的稳定性和可靠性至关重要。
  9. 调试和诊断service_manager进程还可以用于调试和诊断问题,因为它提供了服务的注册信息和状态信息。
  10. 跨进程调用service_manager进程支持跨进程调用,使得不同应用程序和服务能够相互交互,实现复杂的功能。

总的来说,service_manager进程是Android系统中的一个核心组件,它通过Binder IPC机制为系统服务的启动、管理和通信提供了基础设施。通过service_manager,Android系统能够高效、安全地运行各种服务,确保整个系统的正常运作。


四、SurfaceFlinger 进程


SurfaceFlinger是Android系统中的一个关键组件,它负责处理显示输出和图形合成。这个进程在系统启动的早期阶段由init进程启动,并在整个系统运行期间持续工作。以下是SurfaceFinger进程的一些主要功能和特点:

  1. 显示合成SurfaceFlinger的主要任务是将多个层(Layers)合成为单一的显示图像。这些层可能包括应用程序界面、状态栏、屏幕锁等。
  2. 帧缓冲区管理:它管理帧缓冲区(Frame Buffer),这是直接与显示硬件交互的内存区域,用于存储最终的显示数据。
  3. VSync同步SurfaceFlinger使用垂直同步(VSync)信号来同步显示刷新,确保屏幕内容的平滑更新,减少撕裂效果。
  4. 屏幕旋转:它处理屏幕旋转请求,根据设备的传感器输入调整显示内容的方向。
  5. 多显示器支持:在支持多显示器的设备上,SurfaceFlinger可以管理多个显示器的输出。
  6. 2D和3D图形SurfaceFlinger支持2D图形的直接合成以及3D图形的硬件加速。
  7. 权限和安全:它控制对显示内容的访问权限,确保只有授权的应用和服务可以访问或修改显示层。
  8. 性能优化SurfaceFlinger通过优化图形渲染路径和减少不必要的渲染操作来提高系统性能。
  9. 显示设置:它还负责处理显示相关的设置,如亮度、色彩校正等。
  10. 跨进程通信SurfaceFlinger使用Binder机制与Android中的其他进程(如应用程序、窗口管理器等)进行通信。
  11. 资源管理:它管理显示资源,包括图层缓冲区的分配和回收。
  12. 调试和诊断SurfaceFlinger提供了调试和诊断工具,帮助开发者和技术支持人员分析显示问题。

SurfaceFlinger进程在Android系统中的作用至关重要,它不仅负责将用户界面呈现给用户,还确保了显示内容的质量和性能。通过高效的图形合成和显示管理,SurfaceFlinger为Android设备提供了流畅和响应迅速的用户体验。


五、media_server 进程


media_server进程是Android系统中的一个关键组件,它负责处理所有与多媒体相关的任务。这个服务通常在系统启动时由init进程启动,并持续运行以提供多媒体功能。以下是media_server进程的一些主要功能和特点:

  1. 多媒体播放media_server进程管理音频和视频的播放,包括本地文件和流媒体内容。
  2. 编解码器管理:它负责管理编解码器(Codecs),这些是用于压缩和解压音频和视频数据的软件或硬件模块。
  3. 音频处理media_server包含AudioFlinger组件,它处理音频数据流,包括混音、音量控制和音频效果。
  4. 视频处理:它管理视频数据流,包括视频解码和渲染。
  5. CameraServicemedia_server包含CameraService组件,它负责管理相机硬件的访问和图像捕获。
  6. 图像处理:它还可能包含图像处理功能,如图像解码、缩放和旋转。
  7. 多媒体会话管理media_server管理多媒体会话,确保音频和视频流的正确播放和切换。
  8. 电源管理:它与系统的电源管理服务协同工作,优化多媒体播放的电源使用。
  9. 硬件加速media_server利用硬件加速来提高多媒体内容的处理效率,减少CPU负载。
  10. 远程控制:它支持远程控制接口,允许其他应用程序控制播放和录制操作。
  11. 媒体数据库访问media_server提供对媒体数据库的访问,这个数据库存储了媒体文件的元数据。
  12. 媒体扫描:它负责扫描存储设备上的媒体文件,并将信息更新到媒体数据库中。
  13. 播放状态监控media_server监控播放状态,包括播放进度、缓冲情况和播放错误。
  14. 跨进程通信media_server使用Binder机制与Android系统中的其他进程进行通信,提供多媒体服务。
  15. 安全和权限:它管理对多媒体内容的访问权限,确保只有授权的应用可以访问敏感的多媒体数据。
  16. 调试和诊断media_server提供了调试工具,帮助开发者和技术支持人员诊断多媒体播放问题。

media_server进程是Android系统中多媒体功能的核心,它通过集成多种多媒体处理组件,为用户和开发者提供了一个强大而灵活的多媒体平台。通过media_server,Android设备能够支持丰富的多媒体应用,包括音乐播放器、视频播放器、相机应用等。


六、Zygote 进程


在这里插入图片描述

Zygote进程是Android系统框架(Framework)的基础,它负责孵化所有的Android应用进程。Zygote进程的启动标志着Android Framework框架的初始化和启动。

以下是Zygote服务进程的主要功能:

  1. 注册JNI函数:Zygote进程会将底层功能的JNI(Java Native Interface)函数注册到Java虚拟机中,允许Java代码调用本地代码。
  2. 预加载Java类和资源:它预加载常用的Java类和资源,以加速新进程的启动。
  3. 启动system_server进程:Zygote进程通过fork操作启动system_server,这是Android系统中的核心服务进程。
  4. 监听孵化新进程的请求:作为守护进程,Zygote监听来自系统的孵化新进程的请求。
  5. 进入循环状态:启动后,Zygote进程会进入一个循环状态,等待下一次的fork请求。

当Zygote进程启动时,它会执行以下步骤:

  • 执行frameworks/base/cmds/app_process/App_main.cpp文件中的main()方法。
  • App_main.main():设置进程名,并启动AppRuntime
  • AndroidRuntime::start():创建Java虚拟机,注册JNI方法,并调用ZygoteInit.main()方法。
  • ZygoteInit.main():为Zygote注册socket,预加载类和资源,并启动system_server进程。

完成这些步骤后,Zygote进程将进入循环状态,等待系统发出孵化新进程的请求。

Zygote进程的设计允许Android系统高效地启动新应用进程,通过预加载类和资源,减少了启动时间,提高了系统的整体性能。同时,Zygote进程作为Android Framework的基础,为Android应用的开发和运行提供了重要的支持。


七、system_server 进程


system_server进程是Android操作系统中非常核心的一个组件,它负责启动并管理Android系统中的一系列关键服务。这些服务构成了Android运行时环境(Android Runtime)的基础,为应用程序提供必要的支持。


1、system_server进程的一些关键功能和特点
  • 服务管理system_server进程启动后,会初始化并管理许多系统服务,这些服务包括窗口管理器、活动管理器、通知管理器、位置服务、电源管理器等。
  • 系统服务框架:它提供了一个框架,使得这些系统服务能够相互协作并提供一致的接口给应用程序。
  • 系统资源管理system_server进程负责协调系统资源的使用,确保系统的稳定性和响应性。
  • 安全和权限管理:它还负责执行安全策略和权限管理,确保应用程序和服务遵守Android的安全模型。
  • 系统设置和配置system_server进程管理着系统级的设置和配置,包括网络设置、用户设置等。
  • 硬件抽象层(HAL):它与硬件抽象层交互,为上层应用和服务提供硬件功能的支持。
  • 后台服务system_server作为一个守护进程,在后台持续运行,为系统提供持续的服务。
  • 系统监控:它监控系统的运行状态,包括内存使用、CPU负载等,以确保系统的健康运行。
  • 系统更新和维护system_server进程还负责处理系统更新和维护任务。
  • 跨进程通信system_server使用Binder机制来实现与其他进程的通信,这是Android系统中进程间通信的主要方式。
  • 启动顺序system_server进程是在Zygote进程之后启动的,它是由Zygote进程fork出来的。
  • 系统日志:它还负责收集和生成系统日志,这对于系统调试和问题诊断非常重要。
  • 用户空间和内核空间的桥梁system_server进程在用户空间和内核空间之间起到桥梁作用,协调两者之间的交互。

2、system_server启动过程的详细步骤
  • ZygoteInit.startSystemServer():首先调用此方法来启动system_server进程。
  • ZygoteInit.handleSystemServerProcess():此方法fork出子进程,即system_server,并进入该进程。
  • RuntimeInit.zygoteInit():设置当前进程名为“system_server”,并创建PathClassLoader类加载器。
  • nativeZygoteInit():此方法经过多层调用,最终进入app_main.cpp中的onZygoteInit()方法。
  • app_main::onZygoteInit():启动一个新的Binder线程。
  • applicationInit():此方法经过多层调用,最终抛出异常,由ZygoteInit.MethodAndArgsCaller(m, argv)捕获。
  • ZygoteInit.main():开启DDMS功能,调用preload()方法加载资源,预加载OpenGL,并调用SystemServer.main()方法。
  • SystemServer.main():初始化SystemServer对象,并调用其run()方法。
  • SystemServer.run():准备主线程的looper,加载android_servers.so库,该库包含的源码位于frameworks/base/services/目录下。
  • 初始化系统上下文:设置主题,创建系统服务管理SystemServiceManager
  • startBootstrapServices():启动引导服务,包括ActivityManagerServicePowerManagerService等。
  • startCoreServices():启动核心服务,如BatteryServiceUsageStatsServiceWebViewUpdateService等。
  • startOtherServices():启动其他服务,如InputManagerServiceWindowManagerService等,并等待ServiceManagerSurfaceFlinger启动完成,然后显示启动界面。
  • 注册服务到ServiceManager:所有服务启动完成后,注册到ServiceManager
  • ActivityManagerService.systemReady()ActivityManagerService服务启动完成后,进入此方法。
  • 启动SystemUI、WebViewFactory、Watchdog和Launcher App:启动系统界面、WebView工厂、看门狗服务和桌面启动器应用。
  • 进入循环状态:最后,system_server进程进入循环状态,通过Looper.loop()监听和处理系统事件。

system_server进程的启动和运行对于Android系统的正常工作至关重要。它不仅提供了系统服务,还确保了系统的安全性、稳定性和性能。通过精心设计的架构和高效的资源管理,system_server进程支撑着整个Android系统的运行。


八、ActivityManagerService 启动


ActivityManagerService是Android系统中负责管理应用程序生命周期和状态的核心服务。

以下是ActivityManagerService的启动过程:

  1. ActivityManagerService(Context):创建ActivityManagerService实例。
    • 创建名为“ActivityManager”的前台线程,并获取mHandler
    • 通过UiThread类,创建名为“android.ui”的线程。
    • 创建前台和后台广播接收器。
    • 创建/data/system目录。
    • 创建并启动BatteryStatsService服务。
  2. ActivityManagerService.start()
    • 启动电池统计服务。
    • 创建LocalService并添加到LocalServices
  3. ActivityManagerService.startOtherServices() -> installSystemProviders()
    • 安装所有系统Provider
  4. ActivityManagerService.systemReady()
    • 恢复最近任务列表。
    • 启动WebView、SystemUI、开启Watchdog。
    • 启动桌面Launcher应用。
    • 发送系统广播。

启动桌面Launcher应用的过程如下:

  • 首先,通过Zygote进程fork出一个新的进程作为应用进程。
  • 接着,创建Application对象。
  • 然后,创建启动的Activity
  • 最终,用户能够在设备上看到桌面。

ActivityManagerService的启动和运行对于Android系统的稳定性和应用程序的管理至关重要。它不仅管理应用程序的生命周期,还负责系统服务的启动和维护,确保用户界面和应用程序能够顺畅运行。


九、总结


通过上述分析,我们可以清晰地看到Android系统启动的整个流程,掌握每个环节的职责和工作原理。当然,随着Android版本的更新,系统启动的细节也会有所调整,但总体框架应该不会有太大变化。

如果您对此有独特的见解,欢迎在评论区与我分享。

  • 39
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

w风雨无阻w

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

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

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

打赏作者

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

抵扣说明:

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

余额充值