问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

Android平台架构与系统启动流程详解

创作时间:
作者:
@小白创作中心

Android平台架构与系统启动流程详解

引用
CSDN
1.
https://m.blog.csdn.net/weijiangbc0/article/details/146103843

Android系统是一个复杂的软件堆栈,基于Linux内核,针对多种设备类型进行了优化。本文将深入解析Android平台的架构模块及其系统启动流程,帮助开发者更好地理解Android系统的底层机制。

一、平台架构模块

Android是一个基于Linux的开源软件堆栈,针对多种不同设备类型打造。图1显示了Android平台的主要组件。

1.1 Linux内核

Android平台的基础是Linux内核。例如,Android运行时(ART)依赖Linux内核来实现底层功能,例如线程处理和低级内存管理。

使用Linux内核可让Android利用关键安全功能,并让设备制造商能够为知名内核开发硬件驱动程序。

1.2 硬件抽象层(HAL)

硬件抽象层(HAL)提供了用于向较高级别的Java API框架公开设备硬件功能的标准接口。HAL由多个库模块组成,每个模块都为特定类型的硬件组件(例如相机或蓝牙模块)实现一个接口。当框架API发出调用以访问设备硬件时,Android系统将为该硬件组件加载库模块。

硬件抽象层(HAL)通过标准接口实现了硬件能力与Java框架的解耦。其核心价值体现在:

  • 模块化设计:每个硬件组件(如蓝牙、传感器)对应独立.so库
  • 动态加载机制:当应用调用Camera API时,系统自动加载对应的Camera HAL模块
  • 版本兼容:通过HIDL接口定义语言保证跨版本兼容性

这种设计使得OEM厂商可以灵活实现硬件功能,同时保持应用层API的稳定性。

1.3 Android运行时

对于搭载Android 5.0(API级别21)或更高版本的设备,每个应用都在其自己的进程中运行,并且有其自己的Android运行时(ART)实例。ART编写为通过执行Dalvik可执行文件格式(DEX)文件,在低内存设备上运行多个虚拟机。DEX文件是一种专为Android设计的字节码格式,针对最小的内存占用量进行了优化。构建工具(如d8)可将Java源代码编译成DEX字节码,此类字节码可在Android平台上运行。

ART的部分主要功能包括:

  • 预先(AOT)和即时(JIT)编译
  • 优化的垃圾回收(GC)
  • 在Android 9(API级别28)及更高版本中,可将应用软件包的DEX文件转换为更紧凑的机器代码
  • 可提供更好的调试支持,包括专用采样剖析器、详细的诊断异常和崩溃报告,以及设置观察点以监控特定字段的能力

在Android版本5.0(API级别21)之前,Dalvik是Android运行时。如果您的应用在ART上运行良好,那么它也可以在Dalvik上运行,但反过来不一定。

Android还包含一套核心运行时库,可提供Java API框架所使用的Java编程语言中的大部分功能,包括一些Java 8语言功能。

从Dalvik到ART的演进标志着Android性能的质的飞跃:

特性
Dalvik
ART
编译方式
JIT即时编译
AOT预先编译
内存占用
较高
优化减少40%
启动速度
较慢
提升50%以上
GC效率
暂停时间较长
并发标记清除

ART运行时的关键技术创新:

  • 支持Java 8 Lambda表达式
  • 引入Compact DEX格式减少安装体积
  • 诊断工具支持内存泄漏检测
  • 多Dex文件并行加载加速冷启动

1.4 原生C/C++库

许多核心Android系统组件和服务(如ART和HAL)都是从需要用C和C++编写的原生库的原生代码构建的。Android平台提供Java框架API,用于向应用提供其中一些原生库的功能。例如,您可以通过Android框架的Java OpenGL API访问OpenGL ES,以支持在应用中绘制和操控2D和3D图形。

如果开发的是需要C或C++代码的应用,可以使用Android NDK直接从原生代码访问某些原生平台库。

1.5 Java API框架

您可通过以Java语言编写的API使用Android操作系统的整个功能集。这些API是创建Android应用所需的构建块的基础,可简化核心、模块系统组件和服务的重复使用,包括以下组件和服务:

  • 丰富且可扩展的视图系统,可用于构建应用界面,包括列表、网格、文本框、按钮,甚至可嵌入的网络浏览器
  • 资源管理器,用于访问非代码资源,例如本地化的字符串、图形和布局文件
  • 通知管理器,可让所有应用在状态栏中显示自定义提醒
  • 一个activity管理器,用于管理应用的生命周期,并提供常见的导航返回堆栈
  • Content Provider,可让应用访问其他应用(例如“通讯录”应用)中的数据或共享自己的数据

开发者可以完全访问Android系统应用使用的相同框架API。

1.6 系统应用

Android随附一套用于电子邮件、短信、日历、互联网浏览和通讯录等的核心应用。平台随附的应用与用户可以选择安装的应用一样,没有特殊状态。因此,第三方应用可以成为用户的默认网络浏览器、短信应用甚至默认键盘。但有一些例外情况,例如系统的“设置”应用。

系统应用既可用作用户体验应用,又能提供开发者可从自己的应用访问的关键功能。例如,如果您希望应用发送短信,则无需自行构建该功能。您可以改为调用已安装的短信应用,将消息发送给您指定的接收者。

二、系统启动流程

2.1 Bootloader阶段

  • Boot ROM:设备上电后,执行芯片内固化的代码(Boot ROM),初始化硬件并加载第一阶段的Bootloader。
  • Bootloader:通常分为多个阶段(如Primary和Secondary),负责验证签名、加载内核和initramfs到内存。常见的Bootloader如U-Boot或厂商定制版本。

2.2 内核启动

  • Linux内核初始化:内核解压后,初始化CPU、内存、设备驱动等,挂载根文件系统(通常为ramdisk)。
  • 挂载系统分区:内核挂载/system(只读)、/data(读写)等分区,可能涉及dm-verity验证系统完整性。

2.3 Init进程(PID 1)

  • 解析init.rc脚本:执行早期初始化(如创建目录、设置权限),启动核心守护进程(ueventd、logd)。
  • 启动关键服务
  • Zygote:通过app_process启动,预加载Java核心类和资源,监听Socket等待孵化应用进程。
  • Service Manager:Binder IPC的核心管理服务。
  • SurfaceFlinger:图形合成服务,负责渲染UI。
  • Media Server:多媒体相关服务。

2.4 Zygote与System Server

  • Zygote孵化System Server:Zygote fork出System Server进程(Java层核心)。
  • System Server启动
  • Binder线程池初始化:启用跨进程通信。
  • 核心服务启动顺序
    1. Activity Manager:管理应用生命周期。
    2. Package Manager:管理应用安装与信息。
    3. Window Manager:窗口管理。
    4. Power ManagerBattery Service等其他服务。
  • 服务依赖管理:确保服务按正确顺序启动。

2.5 系统就绪与用户界面

  • Launcher启动:System Server完成后,Activity Manager启动主屏幕应用(如Launcher3)。
  • 广播通知:发送ACTION_BOOT_COMPLETED,告知应用系统启动完成。

2.6 优化与安全机制

  • 并行启动:Android 8.0+采用并行初始化服务,缩短启动时间。
  • 安全验证:Bootloader验证内核签名,dm-verity确保系统分区完整性。

三、关键分区与故障处理

  • 分区结构:/boot(内核+ramdisk)、/system(系统应用)、/recovery(恢复模式)、/data(用户数据)。
  • 异常处理:启动失败时进入Recovery模式或Fastboot,进行系统修复。

四、总结

  • 第一个用户进程:init进程(PID 1)。
  • 核心作用:架起内核与用户空间的桥梁,管理所有后续进程的启动。
  • 关键文件:/init二进制文件、init.rc配置文件。

五、常见误解澄清

  • Zygote不是第一个用户进程:虽然Zygote是Java层应用进程的起点,但它是由init进程通过解析init.rc脚本启动的。
  • 内核线程vs用户进程:内核启动阶段会运行内核线程(如kthreadd),但这些属于内核空间,不属于用户进程。

本文原文来自CSDN

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号