use*_*072 5 android screenshot gpu framebuffer android-ndk
我的设备是运行Jelly Bean 4.2的Nexus 4.我正在尝试录制屏幕并将其发送出去.互联网上的大多数代码通过读取/ dev/graphics/fb0来执行上限.它在某些设备和旧系统中运行良好.但是当我在我的设备上试用它时,它会失败.它只给我黑屏和原始数据中的所有"0".我运行"adb root"获取root权限,尝试"chmod 777 fb0","cat fb0>/sdcard/fb0".我也试过像"mmap"和"memcpy"这样的代码来获取数据.但都失败了.我在互联网上搜索,似乎没有解决方案.有些线程说内核可能会禁止你读取fb0.有人对此有所了解吗?
随着硬件的进步,您越来越不可能找到包含屏幕内容的实际帧缓冲区.
如评论中所述,adb使用"screencap"命令,该命令通过Binder调用与surfaceflinger联系,/dev/graphcs/fb0如果失败则返回.后一条路现在很少使用.
如果你真的想深入了解它是如何工作的,你需要检查surfaceflinger如何组合,尤其是hwcomposer HAL.硬件编写器采用多个gralloc表面并在扫描期间将它们合成.这种工作原理因设备而异; hwcomposer实现通常由图形芯片制造商完成.
应用程序框架用于生成"最近应用程序"功能的缩略图的屏幕截图生成应用了HWC所做的相同组合步骤,但仅适用于GLES.从Android 4.2开始,硬件编写器无法合成缓冲区.
有时硬件组合器"支撑",例如因为有更多的层要复合而不是硬件可以处理.在这种情况下,surfaceflinger恢复为GLES组合,并且在某处有一个具有完整图像的缓冲区; 你是否会通过开放找到它/dev/graphics/fb0是另一回事.
一些起点:
adb shell dumpsys SurfaceFlinger| 归档时间: |
|
| 查看次数: |
4990 次 |
| 最近记录: |