webview 是否像 videoview 那样创建一个单独的表面?

Does webview create a separate surface like videoview does?

我有一个困惑,期待对此的一些评论。我假设 WebView 创建了一个单独的表面来绘制并且不使用 activity 的默认表面来绘制。但是,在 Surfaceflinger 转储中,我没有看到使用 webview 时创建的新表面。

当我使用 videoview 进行类似的实验时,我看到创建了一个单独的表面。

在 webview 上,我也想播放视频,所以假设将创建一个单独的表面,因此表面分辨率将与视频分辨率一致。但是如果它使用应用程序的表面,那么视频的最大分辨率必须是 UI 分辨率。

在 chromium 代码中,我看到了单独表面的代码,但实际上我看不到创建的代码。

谁能帮我澄清一下。

谢谢。

如果你看VideoView inheritance graph you'll notice that it inherits from SurfaceView, while WebView does not,那么WebView只能通过创建一个外部SurfaceView来实现。

虽然如果您 search for usages of ExternalVideoSurface in WebView part of Chromium code, you will notice that it is only enabled if "video hole" is enabled, which is intended to be used only for decoding encrypted videos, where WebView needs to do "hole punching". There is a System API-level setting in WebView 启用此行为,但它有其自身的局限性,因此一般不建议使用。

我也很好奇 webview 不在 sufaceflinger 转储中。

我认为原因是 webview 也渲染到相关的 activity 本机 window,所以在这种情况下没有另一个表面。

但根据开发者的选择,最新的 Android 和 Webview 版本的情况似乎有所不同。