本文试图讲述Android图形系统的底层实现。Android图形系统底层实现非常复杂,文档较少,没有使用比较流行的图形组建如X window, Cairo等。 Android中的图形系统采用Client/Server架构。Server (即SurfaceFlinger)主要由c++代码编写而成。Client端代码分为两部分,一部分是由Java提供的供应用使用的api,另一部分则是由c++写成的底层
转载
2024-01-18 17:21:59
122阅读
在现代 Android 应用开发中,显示子系统是一个重要的组成部分,它负责处理与设备屏幕、图形渲染和用户交互等相关的任务。然而,在开发过程中,我们可能会遭遇一系列问题。本文将详细分析一个具体的“android 显示子系统”相关问题,从背景到解决方案进行回顾,帮助大家更好地理解和应对类似问题。
### 问题背景
在最近的一个项目中,我们发现 Android 显示子系统出现了不稳定的表现,给产品的
应用侧渲染栈:View/HWUI/Skia 与 RenderThread 工作原理 Android 应用的渲染过程从用户界面的 Choreographer 安排的 doFrame 回调开始,该架构的目的是高效利用设备的图形能力,以流畅的用户体验为目标。 渲染流程 主线程:UI 布局和绘制 1. 主线程工作: • 在每个 doFrame 调用中,主线程负责 UI 控件的测量、布局和绘制(measur
aceFlinger 深入分析:图层树、合成与时间线 aceFlinger(SF)是 Android 系统的核心合成器,负责将各个应用和系统组件的图层组合成最终的显示输出。其高效地管理每一帧的合成功能,以确保流畅的用户体验。 图层树与属性管理 1. 图层树结构: • 每个窗口、壁纸、系统栏、截图、视频等在 SF 中对应一个或多个图层。 • 图层带有多个属性,如变换矩阵(rotation 和 sca
WindowManager 与图层管理:从窗口到 Layer 的映射 在 Android 系统中,窗口管理和图层管理是通过 WindowManagerService (WMS) 和 aceFlinger (SF) 实现的。这两者协调工作,以确保应用和系统界面的流畅渲染和交互。 窗口与图层的关联 WMS 的窗口管理 窗口逻辑树: WMS 维护一个逻辑树,其中每个窗口对应于一个 WindowState
Insets/IME 动画与渲染协作 在移动设备上,输入法编辑器(Input Method Editor, IME)即键盘的显示和隐藏会影响窗口的尺寸调整以及 Insets 分发。这些变化需要高效的动画和渲染协作以提供流畅的用户体验。 IME 显示与隐藏的挑战 传统方案的限制 调整模式: SOFT_INPUT_ADJUST_RESIZE/PAN 是传统用于管理键盘显示时窗口布局调整的模式。 此方法
视频、相机与图像流:零拷贝与颜色空间管理 在 Android 系统中,处理视频和相机流涉及到复杂的数据流动和颜色管理。通过高效的路径与适当的颜色空间处理,可以显著提升性能并改善用户体验。 高效数据流动与零拷贝 零拷贝流动 直接输出与消费: 视频与相机流通常使用 ace/BufferQueue 直接输出 YUV 格式的 Buffer(如 NV12、NV21)。 这些 Buffer 被 aceFlin
多显示与投屏:Display、VirtualDisplay 与镜像 Android 系统具备强大的多显示和投屏功能,支持通过 HDMI/USB-C DP 接口进行有线连接,以及通过 Miracast 和 Google Cast 等协议进行无线投屏。此外,虚拟显示(VirtualDisplay)为应用开发提供了扩展显示的灵活性。 多显示管理 Display 类型 物理显示: 包括外接显示器,通过 H
折叠屏与多态形态:窗口与布局的动态适配 折叠屏设备为应用布局和交互设计引入了全新的挑战,需要开发者在适配和设计上投入更多精力。设备拓展和折叠时形态的不断变化,以及折痕区域的存在,要求应用灵活地调整其窗口布局和内容展示。 系统支持与布局调整 系统与 WMS/Transition 管理 形态变化处理: 随着设备形态变化,WMS 和 Transitions 处理物理屏幕区域和姿态(posture)变化,
常见卡顿与掉帧模式:识别与对症下药 在移动设备的应用开发中,卡顿和掉帧是影响用户体验的常见问题。识别这些问题的来源并采取针对性解决方案,可以有效提升应用的流畅度和响应速度。 常见问题模式 主线程卡顿 复杂布局与测量: 处理复杂的布局和测量可能导致主线程的长期阻塞,进而影响 doFrame 的执行时间。 同步操作: 使用同步 IO、锁机制、反射或 JSON 解析会增加线程的等待时间。 Bitmap
调试工具与方法:Perfetto、AGI、RenderDoc 与 dumpsys 优化和调试 Android 应用的性能需要一整套工具和方法,以帮助开发者识别和排查从应用级别到系统级别的瓶颈。下面介绍一些常用工具及其应用方法论: 工具介绍 Perfetto 功能:系统级别的时序分析工具。提供 FrameTimeline 支持,使用 SQL 查询来分析特定的 slice,如 DrawFrame、co
安全与隐私:截图、防录屏与图层隔离 在现代应用开发中,保护用户隐私和数据安全是至关重要的,尤其是在处理敏感信息时。Android 提供了一些机制来帮助开发者管理截图和录屏的权限,以及防止未授权的图层访问。 防止截图与录屏 FLAG_SECURE 标志 禁止截图与录屏: 窗口设置 FLAG_SECURE,系统会阻止该窗口在截图或录屏时被捕获。 aceFlinger 会在相关图层上标注保护属性,使得系
面向工程的性能基线与最佳实践清单 在现代应用开发中,提升图形性能、保持流畅的用户体验是关键目标。以下是面向工程的性能基线和最佳实践清单,涵盖从架构到质量保障层面的多个方面,帮助开发团队实现“稳帧、低延迟、长续航”的产品目标。 架构层 BLAST 友好模式: 使用 BLAST 为核心架构,确保窗口和 Layer 的创建频率最低。 合并事务,批量更新 aceControl 属性以提高效率。 UI 层
ace、aceControl 与 BufferQueue:缓冲区生产与消费机制 在 Android 图形子系统中,ace、aceControl 和 BufferQueue 是关键组件,构成了一套高效的图像生产与消费机制,实现流畅的图形渲染。 缓冲生产与消费 ace 与 BufferQueue 1. ace: • 作为图像生产者端的接口,提供给应用、Camera、视频解码器等内容生产方。 2. Bu
刷新率、自适应帧率与功耗管理 现代移动设备通过支持多种刷新率(如 60Hz、90Hz、120Hz)与可变刷新率(Variable Refresh Rate, VRR),为用户提供了更流畅的视觉体验和更有效的功耗管理。 刷新率与应用场景 刷新率切换与自适应策略 场景适应: 系统可以根据不同的应用场景(如视频播放、静止页面、游戏)调整刷新率。 例如,视频播放时,可以采用与内容帧率匹配的刷新率(如 24
过渡动画与 Transitions:从 AppTransition 到新引擎 在 Android 系统中,过渡动画的演变从传统的 AppTransition 和 WindowAnimation 驱动机制扩展到更加灵活和统一的 Transitions 框架。这一框架在处理应用的视觉过渡时,提供了一种更加高效和可扩展的方式。 Transitions 框架介绍 核心功能 统一描述: Transition
Jetpack Compose 在图形管线中的表现 Jetpack Compose 作为 Android 的现代 UI 框架,以声明式的方式构建界面,为开发者提供了一种更具灵活性和效率的 UI 开发体验。它通过 Recomposer 根据变化的状态进行 UI 更新,将生成的 UI 树交由 RenderNode/HWUI 进行绘制。利用 Skia 加速绘制节点,Compose 在性能优化方面有其独特
总览:Android 图形显示子系统的组成与数据流 Android 的图形显示子系统负责从应用到屏幕的整个图像渲染和显示链路,确保高效且一致的用户界面呈现。 应用层绘制与缓冲管理 1. 绘制流程: • 应用线程在主线程和 RenderThread 使用 Skia 和 HWUI 生成显示列表或者直接进行绘制,形成图像缓冲。 • 这些缓冲通过 ace/BufferQueue 机制交付到系统进行进一步处
BLAST 架构:缓解窗口尺寸变化与转场闪烁的关键机制 BLAST(Buffer and Layer Submission Together)是一种将 Buffer 提交与 Layer 事务整合的方法,通过近似原子更新内容与几何信息,有效解决了窗口尺寸变化与界面转场时的视觉不一致问题,提升了系统的视觉连续性和用户体验。 传统路径的挑战 在传统的图形更新路径中,当窗口尺寸改变时,新的 Buffer
硬件合成器 HWC:Overlay 与省电的博弈 硬件合成器(Hardware Composer,HWC)作为 Android 的 HAL(硬件抽象层)接口,在 aceFlinger 和显示硬件之间构建了高效的桥梁。它的核心功能在于优化每帧的图层合成,以实现较低功耗和高性能的图形渲染。 合成流程与决策 HWC 的角色 1. 帧属性评估: • aceFlinger 每帧会提交图层列表及其属性(如像素