问题标签 [surfaceflinger]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
android - 在 Android 供应商软件中使用 AHardwareBuffer_fromHardwareBuffer()?
我正在实现一个 Android ODM 系统。我想创建一个围绕ImageReader构建的VirtualDisplay,以便提供虚拟显示的进程将接收来自 SurfaceFlinger 的一系列帧作为HardwareBuffer实例。
目的是通过使用AHardwareBuffer_fromHardwareBuffer()获取每个接收到的 HardwareBuffer 的 Linux dmabuf 句柄以获取相应的本机对象,然后使用 eglCreateNativeClientBufferANDROID() 将其转换为 EGLImage,最后使用eglExportDMABUFImageMESA()获取 dmabuf 文件描述符。
API 的关键部分——AHardwareBuffer_fromHardwareBuffer()——位于名为“libandroid”的本机库中。Google 文档(参见https://source.android.com/devices/architecture/images/vndk_design_android_o.pdf)明确指出禁止供应商程序在 libandroid 中使用 API。
这看起来很奇怪,因为 libandroid 已经暴露在应用程序 NDK 中。我认为这意味着 libandroid 已经要求所有未来 Android 版本的向后可移植性。
是否有任何现有方法可以使我的供应商程序链接到此 API?如果没有,AHardwareBuffer_fromHardwareBuffer() 是否可以像其他一些与 AHardwareBuffer 相关的本机 C++ API 一样迁移到 VNDK?
更新:
这是一项预安装的服务,需要(除了执行这些 VirtualDisplay 和 ImageReader 机制之外)与我的客户正在实施的自定义 HAL 进行一些交互(因此:不是任何实现标准 Google HIDL 接口之一的东西)。
我认为这让我们需要预先安装到 /vendor 分区,对吧?我不知道从技术上讲这是否使我成为“VNDK 进程”,但是在我将“vendor: true”放入蓝图文件的任何时候,对链接到 libandroid 的限制都会生效。
这个预安装的服务位于 AOSP 树中,因为我想使用平台密钥对其进行签名,以便该服务可以在 AndroidManifest.xml 中设置其android:persistent属性,以避免它被 ActivityManager 任意关闭。
如果这个 VirtualDisplay 没有最终被实例化,其他预安装的应用程序将会很糟糕。我不确定这对 GSI 意味着什么。也许您可能会说,安装了用于测试的 GSI 映像后,其他预安装的应用程序也不存在,因此没有问题。
android - How to boot a Qualcomm Snapdragon without HDMI
I am developing a video app for a Qualcomm Snapdragon which runs Android. I have an app that takes in a video stream, processes it, and sends a datastream out based on the image. It can also have a mode to display the images to HDMI, but it is not necessary. I have also configured my app to automatically run on startup.
It is important that the system can be started without an HDMI plugged in. However, when starting the system without a monitor plugged in, the boot process gets caught in an infinite loop where it seems to be trying to start video/audio services, failing, and trying again. When the HDMI is plugged in, the system is able to finish booting and then continue to the home screen. Here is the log I obtained over serial that is looped forever when trying to boot without HDMI:
I believe there should be some way to edit the init.rc file to prevent the audio/video services being run at bootup, then register some sort of "hot plug" in ueventd when HDMI is plugged in later, after boot.
While I have looked into these things, I am lost on how to actually go about implementing them and I do not know for sure if this is the correct path. Any help would be much appreciated!
Edit: It seems that the way to properly do this by editing Android source code is way above my pay grade, but an easy fix is to buy an HDMI dummy plug that simulates an HDMI monitor. Basically it just has EDID data in its registers and spits that back out when the operating system initially looks for its display.
android - AOSP/Android 7:EGL如何详细利用?
我试图从系统集成商的角度来理解 Android (7) 图形系统。我的主要关注点是 libegl 需要提供的最小功能。
据我了解,surfaceflinger 是该领域的主要参与者。Surfaceflinger 初始化 EGL,创建实际的 EGL 表面并充当应用程序创建的缓冲区(帧)的消费者。该应用程序再次执行所需 GLES 调用的主要部分。显然,这会导致限制,因为 Surfaceflinger 和应用程序存在于不同的进程中,这不是 GLES/EGL 的典型用例。
我不明白的事情:
Android 7 上的应用程序是否总是渲染到发送到 surfaceflinger 的 EGL_KHR_image 缓冲区?这意味着总会有一个额外的复制步骤(即使不需要合成),据我所知......或者是否还有某种优化的全屏模式,应用程序直接渲染到最终的 EGL 表面?
这里使用了哪些进程间共享机制?我的猜测是,与 EGL_NATIVE_BUFFER_ANDROID 一起使用的 EGL_KHR_image 定义了确切的二进制格式,以便可以在每个进程中创建一个图像对象,其中内存通过 ashmem 共享。这已经是完整/正确的图片还是我在这里错过了什么?
我想这些是我目前缺乏信心的主要观点。当然,我对此有一些后续问题(比如,gralloc/composition 如何适应这个?),但是,根据这个平台,我想尽可能地紧凑这个问题。尽管如此,除了主文档页面之外,我还缺少明确针对系统集成商的文档。因此,我们将不胜感激进一步的链接。
我目前的重点是典型的用例,这些用例将涵盖与 Android 7 兼容的绝大多数应用程序。如果存在诸如长期弃用的兼容性垫片之类的极端情况,我现在想忽略它们。
android - 如何找到 Android 的 SurfaceFlinger 服务的 pid?
我想调查 Android 上所述服务的进程 ID。我有一个 Android 9 并通过 adb 访问。谁能帮我?我可以使用命令找出 PID吗top
?pidof
还是有其他方法可以获取 SurfaceFlinger 的 PID?
android - 如何为 DisplayManager 创建的 VirtualDisplay 指定 layerStack?
根据android的官方文档: 虚拟显示器
虚拟显示器可以与主显示器(层堆栈)共享同一组图层,也可以拥有自己的一组。
众所周知,DisplayManager.createVirtualDisplay() 可以创建虚拟显示器。但它似乎总是与主显示(镜像内容)具有相同的层堆栈。如何设置不同的层堆栈?
android - 以编程方式更改主显示分辨率
我正在尝试更改 Android 8.1 上主显示器的显示分辨率。我从内核(基于 EDID)收到一个事件,告诉我需要更改模式。
然后我基本上做:
这会正确更新 surfaceflinger、显示 hal 和内核,但 windowmanager/display 在我运行之前不会更改分辨率:
但是 wm 调用这些函数,这似乎有点过于苛刻,并且还将大小/密度存储在持久设置中:
我一直在查看 windowmanager/display 中的代码,但没有找到我应该使用的 API。
有没有办法通知 windowmanager/display 有关 surfaceflinger 的变化,或者我错过了我可以使用的 API?
我会以错误的方式解决这个问题吗?是否有适当的方法可以更改主显示器的分辨率/模式,但我还没有找到?
android - 权限拒绝:SurfaceFlinger 无法识别请求代码:1128 - Unity,Android
我正在 Unity 中开发 2D Android 游戏。我已经开始在 Logcat 中收到这条消息 - 一直在重复:
错误 SurfaceFlinger:权限被拒绝:SurfaceFlinger 无法识别请求代码:1128
您知道可能导致这种行为的原因吗?谢谢
android - 为什么我在 logcat 中看到太多 surfaceflinger 屏幕截图条目?
在我的设备上,我在 logcat 中看到以下条目:
每当我在屏幕上做某事时,就会出现更多的surfaceflinger屏幕截图条目。我想知道是否有任何间谍活动,或者这有一些简单的解释。
任何帮助理解为什么这些条目不断出现?
android - Android 9:使用具有指定 minLayer 和 maxLayer 的 SurfaceControl 截屏时获取“黑色图像”
我正在 Android Pie (Android 9) 上开发一个系统应用程序。我需要捕获屏幕而不是整个屏幕,我只需要从第 1 层(用于墙纸)到第 2 层(用于应用程序)捕获。
我像这样使用 SurfaceControl:
但返回bitmap
的始终是黑色图像。
我的应用程序是系统私有应用程序,它被放置在/system/priv-app
. 此外,我已经在以下权限中添加了AndroidManifest.xml
我做错了什么?是否有另一种方法来捕获具有选定图层的屏幕
android - Android 设备 FPS 计算
我正在使用gfxinfo计算应用程序 FPS,但显然这不适用于游戏,因为它们不使用 UIKit 进行绘图。我尝试使用 SurfaceFlinger,但不知何故它不提供任何帧信息,只提供刷新周期。问题是,如何使用 adb 命令计算 Android 设备上的应用和游戏 FPS?提前非常感谢!