升级到 4.3 后的 ScreenshotClient 错误

Posted

技术标签:

【中文标题】升级到 4.3 后的 ScreenshotClient 错误【英文标题】:ScreenshotClient error after upgrading to 4.3 【发布时间】:2013-09-02 14:10:28 【问题描述】:

我开发了一个使用ScreenshotClient 捕获设备屏幕的本机进程(仅限root 设备) 我有一个循环,ScreenshotClient 在每个循环中都执行update()。在 4.3 之前一切正常。 当我在 4.3 上运行它时,第一次调用 update 成功,但在第二次调用中调用结果为 -2 ,我在 logcat 中收到这些错误:

E/BufferQueue( 8166): [ScreenshotClient] connect: already connected (cur=1,req=1)
E/libEGL ( 2463): EGLNativeWindowType 0x4116d5f8 already connected to another API
E/libEGL ( 2463): eglCreateWindowSurface:376 error 300b (EGL_BAD_NATIVE_WINDOW)
E/SurfaceFlinger( 2463): captureScreenImplLocked: eglCreateWindowSurface() failed 0x300b

知道 4.3 中的哪些更改导致了这种情况,或者这些错误的含义。

我的代码大致如下:

int main(int argc, char** argv) 

    ProcessState::self()->startThreadPool();

    sp < IBinder > display = SurfaceComposerClient::getBuiltInDisplay(
            DEFAULT_DISPLAY_ID);

    ScreenshotClient client;
    while (true) 
        client.update(display);
        pixels = screenshot.getPixels();
        // do something with the data
    

【问题讨论】:

错误消息表明本机窗口已绑定到另一个上下文。我不知道为什么它停止在 4.3 上工作。也许你应该检查一下你是如何破坏你的上下文的,或者在这里提供一个更好的见解。 我添加了一些示例代码,也许这有助于解释我的情况 你在framework/base/cmd中查看screenshot或者screencap的原始源码了吗? 是的。我查看了源代码,没有找到任何解决方案。这些来源只使用一次更新方法,也许需要做一些事情才能做多个截图。 嘿,我知道这是一个旧帖子,但您似乎没有我遇到的问题,并且无法发送私人消息。你做了什么来真正编译程序?我有所有需要的静态对象,但它仍然说它缺少标题。 【参考方案1】:

我们的产品中有类似的问题,我们能够通过使用更新版本的标头部分解决这个问题(它现在适用于 Galaxy Nexus,但在 4.3 上的其他 Nexus 设备上仍然存在问题)

例如:frameworks/native/include/gui/SurfaceComposerClient.h

这在 4.2 之后发生了变化,因此需要为 4.3 重新编译可执行文件。

我仍在试图理解为什么同样的方法对 N4 和 N7 不起作用,但至少我能够在我的 GN 上取得进展。

希望这会有所帮助。

编辑:进一步检查,这看起来像是 SurfaceFlinger 界面中的一个错误,用于进行屏幕捕获。 SurfaceComposerClient 在内部调用 SurfaceFlinger 并尝试抓取屏幕。在 4.3 版本的 SurfaceFlinger 中,有两种截屏方式。一个适用于现代设备,如 N4/N7(它使用某种优化的 GL->CPU 路由来抓取帧)和传统版本(内部使用一种称为“glReadPixels”的方法,该方法使用更昂贵的 CPU->CPU 路由抓取屏幕),用于 Galaxy Nexus 等设备。

现在在优化的代码路径上,调用了 native_window_api_connect 方法,这在第二次调用 update() 时会失败。这是因为之前的 update 调用也调用了 this 并获得了与从未释放的本机窗口的连接。它应该通过调用 native_window_api_disconnect 来释放,但这永远不会发生。

但在未优化的代码路径中,会发生连接调用和随后断开连接的调用,因此一切正常(假设您首先使用 4.3 标头构建了本机模块)。

:-)

【讨论】:

我知道这是一个老问题,但我已经回到我的产品中的这个错误,刚刚看到你的答案。你设法让它在 N4 和 N7 上工作吗?怎么样?

以上是关于升级到 4.3 后的 ScreenshotClient 错误的主要内容,如果未能解决你的问题,请参考以下文章

从 xcode3.2 升级到 xcode4.3.2 后的 Builderror

Xcode:升级到 Xcode 4.4 后如何恢复 4.3 模拟器? [复制]

安卓4.3怎么升级到4.4

将我的 nexus 4 升级到 4.3 后,adb 无法识别它

Hibernate 4.3 到 5.2 升级 - 不能同时获取多个包

升级到 XCode 4.3 后 FPS 下降