当前位置: 首页 > article >正文

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

目录

一、平台架构模块

1.1 Linux 内核 

1.2 硬件抽象层 (HAL) 

1.3 Android 运行时 

1.4 原生 C/C++ 库 

1.5 Java API 框架 

1.6 系统应用 

二、系统启动流程

2.1 Bootloader阶段

2.2 内核启动

2.3 Init进程(PID 1)

2.4 Zygote与System Server

2.5 系统就绪与用户界面

2.6 优化与安全机制

三、关键分区与故障处理

四、总结

五、常见误解澄清


一、平台架构模块

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性能的质的飞跃:

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

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

二、系统启动流程

Android启动流程的大致步骤:

1. 电源启动,执行Boot ROM中的代码,加载Bootloader。

2. Bootloader加载内核和initramfs到内存。

3. 内核初始化硬件和驱动,挂载文件系统,启动init进程

4. init进程解析init.rc,启动系统服务,包括Zygote

5. Zygote启动System Server,System Server启动各种系统服务。

6. 系统服务启动完成后,启动Launcher,进入用户界面。

此流程体现了Android从硬件初始化到用户交互的完整链路,结合Linux内核与独特的Android服务设计,确保了系统的高效启动与运行。

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),但这些属于内核空间,不属于用户进程。

相关文章:

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

目录 一、平台架构模块 1.1 Linux 内核 1.2 硬件抽象层 (HAL) 1.3 Android 运行时 1.4 原生 C/C 库 1.5 Java API 框架 1.6 系统应用 二、系统启动流程 2.1 Bootloader阶段 2.2 内核启动 2.3 Init进程(PID 1) 2.4 Zygote与System Serv…...

【C++设计模式】第四篇:建造者模式(Builder)

注意:复现代码时,确保 VS2022 使用 C17/20 标准以支持现代特性。 分步骤构造复杂对象,实现灵活装配 1. 模式定义与用途 核心目标:将复杂对象的构建过程分离,使得同样的构建步骤可以创建不同的表示形式。 常见场景&am…...

使用GitLink个人建站服务部署Allure在线测试报告

更多技术文章,访问软件测试社区 文章目录 🚀前言🔑开通GitLink个人建站服务1. 前提条件2. 登录GitLink平台(https://www.gitlink.org.cn/login)3. 进入设置>个人建站>我的站点4. 新建站点5. 去仓部进行部署6. 安…...

WHAT - 前端异步事件流处理场景梳理

目录 一、典型场景二、解决方案与技术选型1. 基础异步控制2. 状态管理方案3. 复杂任务调度4. 任务取消机制5. 微任务队列优化 三、最佳实践建议四、工具链推荐 前端异步任务流处理是现代Web开发中常见的需求,尤其在复杂业务逻辑、高交互性应用中不可或缺。以下是常见…...

专业学习|多线程、多进程、多协程加速程序运行

学习资料来源:【2021最新版】Python 并发编程实战,用多线程、多进程、多协程加速程序运行_哔哩哔哩_bilibili 若有侵权,联系删除。 一、程序的提速方法——多线程、多进程、多协程 在现代编程中,多线程、多进程和多协程是三种常见…...

C/C++蓝桥杯算法真题打卡(Day3)

一、P8598 [蓝桥杯 2013 省 AB] 错误票据 - 洛谷 算法代码&#xff1a; #include<bits/stdc.h> using namespace std;int main() {int N;cin >> N; // 读取数据行数unordered_map<int, int> idCount; // 用于统计每个ID出现的次数vector<int> ids; …...

烟花燃放安全管控:智能分析网关V4烟火检测技术保障安全

一、方案背景 在中国诸多传统节日的缤纷画卷中&#xff0c;烟花盛放、烧纸祭祀承载着人们的深厚情感。一方面&#xff0c;烟花璀璨&#xff0c;是对节日欢庆氛围的热烈烘托&#xff0c;寄托着大家对美好生活的向往与期许&#xff1b;另一方面&#xff0c;袅袅青烟、点点烛光&a…...

【Bert系列模型】

目录 一、BERT模型介绍 1.1 BERT简介 1.2 BERT的架构 1.2.1 Embedding模块 1.2.2 双向Transformer模块 1.2.3 预微调模块 1.3 BERT的预训练任务 1.3.1 Masked Language Model (MLM) 1.3.2 Next Sentence Prediction (NSP) 1.4 预训练与微调的关系 1.5 小结 二、BERT…...

9.1 Kubelet Eviction驱逐解读

驱逐文档 https://kubernetes.io/zh/docs/concepts/scheduling-eviction/node-pressure-eviction/ 驱逐的含义 节点压力驱逐是 kubelet 主动终止 Pod 以回收节点上资源的过程。这在处理内存和磁盘这种不可压缩资源时&#xff0c;驱逐pod回收资源的策略&#xff0c;显得尤为重…...

播放器系列4——PCM重采样

FFmpeg重采样过程 #mermaid-svg-QydNPsDAlg9lTn6z {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-QydNPsDAlg9lTn6z .error-icon{fill:#552222;}#mermaid-svg-QydNPsDAlg9lTn6z .error-text{fill:#552222;stroke:#5…...

android接入rocketmq

一 前言 RocketMQ 作为一个功能强大的消息队列系统&#xff0c;不仅支持基本的消息发布与订阅&#xff0c;还提供了顺序消息、延时消息、事务消息等高级功能&#xff0c;适应了复杂的分布式系统需求。其高可用性架构、多副本机制、完善的运维管理工具&#xff0c;以及安全控制…...

《长文本处理新曙光:深入剖析多头隐式注意力机制显存优化奥秘》

在人工智能领域&#xff0c;Transformer架构无疑是璀璨的明星&#xff0c;为自然语言处理、计算机视觉等众多领域带来了革命性的变革。但Transformer架构在处理长文本时&#xff0c;其多头注意力机制&#xff08;MHA&#xff09;会产生显存占用呈几何级数增长的问题&#xff0c…...

Spring Boot面试问答

1. Spring Boot 基础知识 问题 1:什么是Spring Boot?它与Spring框架有何不同? 回答: Spring Boot是基于Spring框架的一个开源框架,旨在简化新Spring应用的初始化和开发过程。与传统的Spring框架相比,Spring Boot提供了以下优势: 自动配置:根据项目依赖自动配置Spring…...

前端数据模拟 Mock.js 学习笔记

mock.js介绍 Mock.js是一款前端开发中拦截Ajax请求再生成随机数据响应的工具&#xff0c;可以用来模拟服务器响应 优点是&#xff1a;非常方便简单&#xff0c;无侵入性&#xff0c;基本覆盖常用的接口数据类型支持生成随机的文本、数字、布尔值、日期、邮箱、链接、图片、颜…...

用DeepSeek-R1-Distill-data-110k蒸馏中文数据集 微调Qwen2.5-7B-Instruct!

下载模型与数据 模型下载&#xff1a; huggingface&#xff1a; Qwen/Qwen2.5-7B-Instruct HF MirrorWe’re on a journey to advance and democratize artificial intelligence through open source and open science.https://hf-mirror.com/Qwen/Qwen2.5-7B-Instruct 魔搭&a…...

DeepSeek大模型 —— 全维度技术解析

DeepSeek大模型 —— 全维度技术解析 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;可以分享一下给大家。点击跳转到网站。 https://www.captainbed.cn/ccc 文章目录 DeepSeek大模型 —— 全维度技术解析一、模型架构全景解析1…...

DeepSeek + 沉浸式翻译 打造智能翻译助手

本文详细介绍如何使用 DeepSeek API 沉浸式翻译插件打造个性化翻译助手。 一、DeepSeek API 配置 基础配置 API 基础地址&#xff1a;https://api.deepseek.com需要申请 API Key支持与 OpenAI SDK 兼容的调用方式 可用模型 deepseek-chat&#xff1a;已升级为 DeepSeek-V3&am…...

EasyRTC嵌入式音视频通话SDK:基于ICE与STUN/TURN的实时音视频通信解决方案

在当今数字化时代&#xff0c;实时音视频通信技术已成为人们生活和工作中不可或缺的一部分。无论是家庭中的远程看护、办公场景中的远程协作&#xff0c;还是工业领域的远程巡检和智能设备的互联互通&#xff0c;高效、稳定的通信技术都是实现这些功能的核心。 EasyRTC嵌入式音…...

React Native 0.76 升级后 APK 体积增大的原因及优化方案

在将 React Native 从 0.71 升级到 0.76 后,打包体积从 40 多 MB 增加到了 80 MB。经过一系列排查和优化,最终找到了解决方案,并将优化过程整理如下。 1. React Native 0.76 体积增大的可能原因 (1) 新架构默认启用 React Native 0.76 默认启用了 New Architecture(新架…...

qt open3dAlpha重建

qt open3dAlpha重建 效果展示二、流程三、代码效果展示 二、流程 创建动作,链接到槽函数,并把动作放置菜单栏 参照前文 三、代码 1、槽函数实现 void on_actionAlpha_triggered();//alpha重建 void MainWindow::...

PyQt高亮代码

PyQt高亮代码 安装 Pygments支持的格式支持的样式详解参考 Qt中使用 安装 Pygments Pygments 是Python中的一个高亮代码的包&#xff0c;挺好用的 pip install Pygments支持的格式 支持的格式比较多&#xff0c;不列出来了 # coding:utf-8 from pygments.lexers import get_all…...

《深入浅出数据索引》- 公司内部培训课程笔记

深入浅出数据索引 内容&#xff1a;索引理论&#xff0c;索引常见问题&#xff0c;索引最佳实践&#xff0c;sql优化实战&#xff0c;问答 哈希不支持范围查询 4层 几个亿 5层 几十亿上百亿 B树的分裂&#xff0c;50-50分裂 都是往上插一个元素&#xff08;红黑树是左右旋转&a…...

PPT 技能:巧用 “节” 功能,让演示文稿更有序

在制作PPT时&#xff0c;你是否遇到过这样的情况&#xff1a;幻灯片越来越多&#xff0c;内容越来越杂&#xff0c;找某一页内容时翻得眼花缭乱&#xff1f;尤其是在处理大型PPT文件时&#xff0c;如果没有合理的结构&#xff0c;编辑和调整都会变得非常麻烦。这时候&#xff0…...

如何禁止电脑中某个应用联网

一、通过防火墙基础设置&#xff08;快速操作&#xff09; 打开控制面板 在任务栏搜索框输入“控制面板”并打开&#xff0c;将右上角“查看方式”切换为“大图标”。 进入防火墙设置 点击 Windows Defender防火墙 → 左侧选择 允许应用或功能通过Windows Defender防火墙。…...

Xss漏洞问题

https://bu1.github.io/2021/01/12/%E7%AC%AC%E5%8D%81%E4%BA%8C%E5%91%A8%EF%BC%9AXSS%E6%BC%8F%E6%B4%9E%E5%AD%A6%E4%B9%A0%E5%AE%9E%E6%88%98/ 后端绕开了前端&#xff0c;直接调用接口入库&#xff1a; <select οnchange“alert(1)”>12 前端拿到这个文本后&…...

Python MongoDB速成教程

一、基础 1. 安装pymongo库 pymongo 是 Python 操作 MongoDB 的官方驱动&#xff0c;你可以使用 pip 来安装它&#xff1a; pip install pymongo 2. 连接到 MongoDB 首先&#xff0c;你需要建立与 MongoDB 服务器的连接。以下是一个简单的示例&#xff1a; from pymongo …...

Docker概念与架构

文章目录 概念docker与虚拟机的差异docker的作用docker容器虚拟化 与 传统虚拟机比较 Docker 架构 概念 Docker 是一个开源的应用容器引擎。诞生于 2013 年初&#xff0c;基于 Go 语言实现。Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中&#xf…...

基于opencv消除图片马赛克

以下是一个基于Python的图片马赛克消除函数实现&#xff0c;结合了图像处理和深度学习方法。由于马赛克消除涉及复杂的图像重建任务&#xff0c;建议根据实际需求选择合适的方法&#xff1a; import cv2 import numpy as np from PIL import Imagedef remove_mosaic(image_pat…...

3.使用ElementUI搭建侧边栏及顶部栏

1. 安装ElementUI ElementUI是基于 Vue 2.0 的桌面端组件库。使用之前&#xff0c;需要在项目文件夹中安装ElementUI&#xff0c;在终端中输入以下命令&#xff0c;进行安装。 npm i element-ui -S并在main.js中引入ElementUI 2. 使用elmentUI组件进行页面布局 2.1 清空原…...

golang将大接口传递给小接口以及场景

文章目录 golang将大接口传递给小接口背景什么是大接口传递给小接口使用场景 golang将大接口传递给小接口 背景 在 Go 语言中&#xff0c;接口是一种强大的工具&#xff0c;它允许我们定义对象的行为而不关心其具体实现。特别是在复杂的应用程序中&#xff0c;将一个实现了较…...