- 博客(149)
- 收藏
- 关注
原创 Android 如何实现 Vulkan
是一个适用于高性能 3D 图形的低开销、跨平台 API。与一样,Vulkan 提供用于在应用中创建高品质实时图形的工具。使用 Vulkan 的优势包括降低 CPU 开销以及支持语言。:本部分介绍的是 Vulkan 实现;如需详细了解 Vulkan 架构、优势、API 和其他资源,请参阅。如果设备包含 Vulkan 驱动程序,则该设备需要声明和系统功能,并且相关版本能够准确反映设备的功能。这有助于确保设备符合(CDD) 的要求。
2024-07-04 09:11:49
1447
原创 Android 实现 OpenGL ES 和 EGL
aclass="external" l10n-attrs-original-order="href,class" l10n-encrypted-href="npC2I0v1QdyEcSFsO8sdQMjFEOn7Tv25TU27pstn8iE=">OpenGL 是一种跨平台的图形 API,用于为 3D 图形处理硬件指定标准的软件接口。是 OpenGL 规范的子集,适用于嵌入式设备。为了与 Android,设备需要提供适用于 EGL、OpenGL ES 1.x 和 OpenGL ES 2.0 的驱动程序。
2024-07-03 10:56:06
622
原创 Android EGLSurface 和 OpenGL ES
Android 使用API 渲染图形。为了创建 GLES 上下文并为 GLES 渲染提供窗口系统,Android 使用。GLES 调用用于渲染纹理多边形,而 EGL 调用用于将渲染放到屏幕上。在使用 GLES 进行绘制之前,您需要创建 GL 上下文。在 EGL 中,这意味着要创建一个 EGLContext 和一个 EGLSurface。GLES 操作适用于当前上下文,该上下文通过线程局部存储访问,而不是作为参数进行传递。渲染代码应该在当前 GLES 线程(而不是界面线程)上执行。
2024-07-03 10:55:09
416
原创 Android Frame pacing
Android Frame Pacing 库(也称为 Swappy)是的一部分。它可帮助和游戏在 Android 上实现流畅的渲染和正确的帧同步。帧同步是指游戏的逻辑和渲染循环与操作系统的显示子系统和底层显示硬件之间的同步。Android 显示子系统旨在避免某些视觉伪影,例如画面撕裂。帧展示时间不一致是因为游戏渲染循环的运行速率与本机显示硬件支持的速率不同。如果底层显示硬件的游戏渲染循环运行速度过慢,会产生问题,导致展示时间不一致。
2024-07-03 10:10:44
267
原创 Android VSYNC
VSYNC 信号可同步显示管道。显示流水线由应用渲染、SurfaceFlinger 合成以及用于在屏幕上显示图像的硬件混合渲染器 (HWC) 组成。VSYNC 可同步应用唤醒以开始渲染的时间、SurfaceFlinger 唤醒以合成屏幕的时间以及屏幕刷新周期。这种同步可以消除卡顿,并提升图形的视觉表现。HWC 可生成 VSYNC 事件并通过回调将事件发送到 SurfaceFlinger:HWC 从的线程触发,延迟时间尽可能短,通常小于 0.5 毫秒。SurfaceFlinger 通过调用。
2024-07-03 09:34:47
853
原创 Android 减少图形的内存消耗
在图形堆栈中,每层的缓冲区缓存位于混合渲染器 HAL 和 SurfaceFlinger 之间,从而减少与通过 IPC 发送文件描述符相关的开销。在 Android 14 之前的版本中,当与 SurfaceFlinger断开连接时(例如 MediaCodec 与 SurfaceView 断开连接时),此缓冲区缓存不会被完全清除。从 Android 14 开始,您可以强制完全清除此缓冲区缓存,以减少图形的内存消耗。
2024-07-03 09:32:51
624
原创 Android 适用于硬件混合渲染器 HAL 的 AIDL
从 Android 13 起,我们开始使用定义硬件混合渲染器 (HWC) HAL,还废弃了 HIDL 版本至。本页将介绍适用于 HWC 的 AIDL HAL 与 HIDL HAL 之间的区别,以及 AIDL HAL 的实现和测试。鉴于 AIDL 的,从 Android 13 起,我们鼓励供应商实现混合渲染器 HAL,而不是 HIDL 版本。如需了解详情,请参阅这一节。
2024-07-03 09:20:00
1024
原创 Android显示设备热插拔处理
在 Android TV 机顶盒 (STB) 和 OTT 服务 (OTT) 设备等具有外接显示器(通过 HDMI 或 DisplayPort 连接)的设备上,显示模式和受支持的 HDR 类型等显示功能会动态变化。而 HDMI 热插拔信号正是引发此变化的原因。例如,当用户从一个显示器切换到另一个显示器,或在没有连接显示器的情况下启动设备时,便会出现这种情况。为处理热插拔和显示功能的动态变化,Android 12 及更高版本中包含对框架的一些更改。
2024-07-03 09:19:13
944
原创 Android 硬件混合渲染器 (HWC) HAL
硬件混合渲染器 (HWC) HAL 用于合成从 SurfaceFlinger 接收的图层,从而减少和 GPU 执行的合成量。HWC 可以抽象出叠加层和 2D 位块传送器等对象来合成 Surface,并与专门的窗口合成硬件进行通信以合成窗口。使用 HWC 来合成窗口,而不是让 SurfaceFlinger 与 GPU 进行合成。大多数 GPU 都未针对合成进行过优化,当 GPU 合成来自 SurfaceFlinger 的图层时,应用就无法使用 GPU 进行自我渲染。
2024-07-03 09:18:23
330
原创 Android SurfaceFlinger 中的系统属性
ConfigStore HAL 保留在 AOSP 中以支持旧版 vendor 分区。在搭载 Android 10 及更高版本的设备上,首先读取系统属性;如果没有为中的配置项定义任何系统属性,会回退到 ConfigStore HAL。
2024-07-03 09:17:40
292
原创 Android SurfaceFlinger 和 WindowManager
SurfaceFlinger 接受缓冲区,对它们进行合成,然后发送到屏幕。WindowManager 为 SurfaceFlinger 提供缓冲区和窗口元数据,而 SurfaceFlinger 可使用这些信息将 Surface 合成到屏幕。
2024-07-03 09:16:39
567
原创 Android SurfaceTexture
是 Surface 和纹理的组合。实例用于提供输出到 GLES 纹理的接口。包含一个以应用为使用方的实例。当生产方将新的缓冲区排入队列时,回调会通知应用。然后,应用调用。此时会释放先前占用的缓冲区,从队列中获取新缓冲区并执行调用,从而使 GLES 可将此缓冲区作为外部纹理使用。
2024-07-02 16:05:28
365
原创 Android SurfaceView 和 GLSurfaceView
Android 应用框架界面是以使用开头的对象层次结构为基础。所有界面元素都会经过一系列的测量和一个布局过程,该过程会将这些元素融入到矩形区域中。然后,所有可见 View 对象都会渲染到一个 Surface(当应用置于前台时,由 WindowManager 进行设置)。应用的界面线程会按帧执行布局并渲染到缓冲区。
2024-07-02 16:04:39
333
原创 Android Surface 和 SurfaceHolder
Surface 对象使应用能够渲染要在屏幕上显示的图像。通过 SurfaceHolder 接口,应用可以编辑和控制 Surface。
2024-07-02 16:04:04
438
原创 Android NDK 针对中间件供应商的建议
分发使用 NDK 构建的中间件会引发其他问题,但应用开发者无需对此感到担心。预构建库会为用户提供一些实现选项。
2024-07-02 15:50:03
249
原创 Android NDK 常见问题和解决方案
您可能会在 C++ 中看到以下错误:错误:使用了未声明的标识符“mmap”或在 C 中看到以下错误:警告:函数“mmap”的隐式声明在 C99 中无效使用会指示 C 库使用mmap64,而不是mmap。在android-21之前,无法使用mmap64。如果值低于 21,则 C 库不包含与兼容的mmap,因此该函数不可用。注意mmap只是此问题的最常见表现。C 库中包含off_t参数的任何函数都是如此。注意:从 r16 Beta 版 2 开始,C 库把mmap64。
2024-07-02 15:03:24
261
原创 Android JNI
JNI 是指 Java 原生接口。它定义了 Android 从受管理代码(使用 Java 或 Kotlin 编程语言编写)编译的字节码与原生代码(使用 C/C++ 编写)进行交互的方式。JNI 不依赖于供应商,支持从动态共享库加载代码,虽然有时较为繁琐,但效率尚可。:由于 Android 采用与 Java 编程语言类似的方式将 Kotlin 编译为适合 ART 的字节码,因此您可以根据 JNI 架构及其相关成本将本页中的指南应用于 Kotlin 和 Java 编程语言。如需了解详情,请参阅。
2024-07-02 15:02:41
313
原创 Android NDK 概念
本部分简要介绍了 NDK 的工作原理。Android NDK 是一组使您能将 C 或 C++(“原生代码”)嵌入到 Android 应用中的工具。在平台之间移植其应用。重复使用现有库,或者提供其自己的库供重复使用。在特定情况下提高性能,特别是像游戏这种计算密集型应用。
2024-07-02 15:00:38
307
原创 Android NDK 使用入门
原生开发套件 (NDK) 是一套工具,使您能够在 Android 应用中使用 C 和 C++ 代码,并提供众多,您可使用这些平台库管理原生 activity 和访问实体设备组件,例如传感器和触控输入。NDK 可能不适合大多数 Android 编程初学者,这些初学者只需使用 Java 代码和框架 API 开发应用。您可以在中使用 NDK 将 C 和 C++ 代码编译到原生库中,然后使用 Android Studio 的集成构建系统 Gradle 将原生库打包到 APK 中。Java 代码随后可以通过。
2024-07-02 14:59:27
326
原创 Android 使用 Winscope 跟踪窗口转换
Winscope 是一款 Web 工具,可以让用户在动画和转换期间和之后记录、重放和分析多个系统服务的状态。Winscope 将所有相关的系统服务状态记录在一个跟踪文件中。使用带有跟踪文件的 Winscope 界面,您可以通过重放、单步执行和调试转换来针对每个动画帧检查这些服务的状态(无论是否有屏幕录制)。
2024-07-02 13:41:19
1342
2
原创 Android 12 实现 DMABUF 和 GPU 内存计算
因此,在计算 RAM 损失时,系统会将内存映射到 GPU 地址空间的 DMA-BUFF 减去两次。Android 12 实施了一个解决方案,可以计算映射到 GPU 地址空间的 DMA-BUF 的大小,这意味着它在 RAM 损失计算中只计算一次。下表比较了 Android 12 中的 ION 统计信息接口与使用 DMA-BUF 堆框架的设备中的对应接口。,此外,有关如何在 Android 12 中加以实现的说明已作为注释包含在代码中。统计信息,以便显示每个导出器和每个缓冲区的统计信息。
2024-07-02 13:39:05
1099
原创 Android BufferQueue 和 Gralloc
BufferQueue 类将可生成图形数据缓冲区的组件(生产方)连接到接受数据以便进行显示或进一步处理的组件(使用方)。几乎所有在系统中移动图形数据缓冲区的内容都依赖于 BufferQueue。Gralloc 内存分配器会进行缓冲区分配,并通过两个特定于供应商的 HIDL 接口来进行实现(请参阅和allocate()函数采用预期的参数(宽度、高度、像素格式)以及一组用法标志。
2024-07-02 13:38:22
725
原创 Android 图形
Android 框架提供了各种用于 2D 和 3D 图形渲染的 API,可与制造商的图形驱动程序实现代码交互,因此务必更好地了解这些 API 的工作原理。这类驱动程序的构建基于图形硬件抽象层 (HAL),本页介绍了相关图形 HAL。在继续学习本部分之前,请先熟悉以下术语:画布(通用术语)、Canvas(API 元素)画布是一种绘图 Surface,用于对照位图或对象来处理实际位合成。Canvas包含关于位图、线条、圆形、矩形、文字等的标准计算机绘制方法,并与位图或 Surface 相关联。
2024-07-02 09:31:51
625
原创 Android 实现自定义字体
有些 OEM 会在 AOSP 中安装或替换字体文件以展示自己的品牌。Android 12 支持此功能,但增加了保持更新设备中的表情符号字体的要求。不修改或不更新表情符号字体文件的 OEM 无需使用此功能。Google 会更新字体文件,尤其是通过 GMS Core 更新文件,因此请不要修改或移除/system分区中的文件,也不要从移除该文件。将文件替换为 OEM 品牌的表情符号字体。根据当地市场的需求修改文件。替换或修改其他字体文件。如果不打算在 AOSP 中修改表情符号字体,就无需执行任何操作。
2024-07-02 09:30:57
500
1
原创 Android WindowManager 扩展
WindowManager 扩展(简称“扩展”)是一个可选择启用的 Android 平台模块,支持各种 Jetpack WindowManager 功能。该模块在 AOSP 中的中实现,并搭载在支持 WindowManager 功能的设备上。
2024-07-02 09:27:17
709
原创 Android 零售演示模式
设备制造商可以通过替换config.xml文件中指定的框架资源来指定自定义启动器,如下所示。位于的零售演示 DemoPlayer 应用,是 Android 开放源代码项目 (AOSP) 中的默认自定义启动器。该应用会在设备分区(例如 /data/preloads/demo/retail_demo.mp4)中查找视频并进行循环播放。当用户触摸屏幕时,自定义启动器会停用其活动组件,然后默认的系统启动器便会启动。自定义启动器必须将其自定义组件标记为默认停用,从而避免该组件在非演示情境下出现。
2024-07-02 09:26:36
967
原创 Android 显示屏支持
根据 HWC 屏幕 ID(可能是不透明的且并非始终稳定),此方法会返回(特定于平台的)8 位端口号,该端口号可标识用于屏幕输出的物理连接器,以及屏幕的 EDID blob。属性声明某个 activity 与多窗口模式不兼容,且该 activity 满足下面描述的条件之一,那么当已应用的屏幕配置必须要更改时,activity 和进程将与原始配置一起保存,并且系统会向用户提供一种方式来重新启动应用进程以使用更新后的屏幕配置。否则,它会被分派到聚焦屏幕(即用户最近与之交互的屏幕)中的聚焦窗口。
2024-07-01 16:46:31
742
原创 Android 多屏幕推荐做法
在这种情况下,SystemUI(或其他系统组件)应检测设备是否处于折叠状态,确定是否应该执行操作,然后启动目标 activity 并指定一个外部屏幕 ID 作为启动目标。在大多数情况下,应用应该能够适应在不同尺寸的屏幕上工作,而系统应控制应用的放置位置。例如,针对可折叠设备打造新颖独特的体验,并且当设备处于折叠状态时,在外部屏幕上启动特定的应用。如果所有者在某个屏幕上启动了一个 activity,则该 activity 可以在此屏幕上启动其他 activity。要识别屏幕,请使用唯一 ID(这默认使用。
2024-07-01 16:09:20
267
原创 Android 窗口放大功能
Android 12 中引入的局部屏幕放大功能为用户提供了经过改进的视图选项。弱视用户可能佩戴有一定度数的眼镜,或者由于环境条件或疾病而暂时难以看清屏幕。暂时性困难可能由过度照明或用户极度疲劳等原因导致。Android 12 中的局部屏幕放大功能让用户能够在整个屏幕放大和局部屏幕放大之间切换。使用局部屏幕放大功能,用户可以在屏幕上拖动放大的局部屏幕来查看不同区域。放大功能启用时,系统会显示一个可让用户切换到整个屏幕放大功能的切换按钮。
2024-07-01 15:55:05
1028
原创 Android PIP画中画
借助 Android 手持设备的画中画 (PIP) 功能,用户可以将当前正在运行 activity 的应用缩到小窗口中显示。画中画对视频应用来说尤其有用,因为用户可以随时执行其他操作,不必打断内容播放。用户可以通过 SystemUI 操控该窗口的位置,并通过应用提供的操作(最多三项)与当前处于画中画模式的应用流畅地互动。画中画功能需要在支持它的应用中明确选择启用,并按 activity 运作(一个应用可以有多个 activity,但其中只有一个可处于画中画模式)。Activity 通过调用。
2024-07-01 15:54:30
896
原创 Android 分屏交互
在 Android 7.0 及更高版本中,用户可以借助这一平台功能在设备屏幕上同时显示多个应用。默认模式是分屏,该模式可为用户提供两个活动窗格供他们放置应用。Android 8.0 通过优化分屏功能并为其添加更多功能来改进分屏模式。在默认实现中,如果用户在进入分屏模式后点按,则系统会压缩顶部窗格,并调整启动器的大小。这是为了向用户展示顶部应用依然处于打开状态,同时保持用户的启动器布局,以便用户从主屏幕中查找和启动应用。
2024-07-01 14:30:56
254
原创 Android Material You 设计
如果您使用的是 AOSP ThemePicker 应用,当同时满足以下两个中的flag_monet为true。在文件的中定义了含有软件包名称的系统桩 APK。
2024-07-01 13:36:36
1040
原创 Android 窗口模糊处理
在 Android 12 中,我们提供了一些用于实现窗口模糊处理效果(例如背景模糊处理和模糊处理后方屏幕)的公共 API。窗口模糊处理或跨窗口模糊处理用于模糊处理给定窗口后方的屏幕。有两种窗口模糊处理方式,可用于实现不同的视觉效果:背景模糊处理:可用于创建具有模糊背景的窗口,创造出磨砂玻璃效果。模糊处理后方屏幕:可用于模糊处理(对话框)窗口后方的整个屏幕,创造出景深效果。仅背景模糊处理 (a)、仅模糊处理后方屏幕 (b)、背景模糊处理和模糊处理后方屏幕 (c)
2024-07-01 11:46:26
1643
原创 Android 应用快捷方式
Android 7.1.1 版本允许开发人员定义应用内特定操作的快捷方式,这些快捷方式可以显示在启动器中。这些可让用户在应用中快速启动常用或推荐的任务。每个快捷方式都会引用一个 intent,这些 intent 在用户选择相应快捷方式时会在应用中启动特定操作。
2024-07-01 11:26:50
533
原创 Android 实现自适应图标
如果开发者仅提供一个图标素材资源,自适应图标的形状在设备内会保持一致,但在设备之间会有所差异。此外,图标支持两个图层(前景和背景),可用于实现动画效果,从而为用户提供愉悦的视觉体验。设备实现人员会提供一个设备遮罩,该遮罩将决定设备上所有图标的形状。该图标将在任何使用启动器图标(例如,启动器、概览、设置和分享表单)的系统界面上使用。
2024-07-01 11:25:09
716
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人