问题现象

[http://jira.it.chehejia.com/browse/XHMI-103352](https://prod-files-secure.s3.us-west-2.amazonaws.com/61f35fd0-f798-403b-bd25-9e0daf8b0eaf/02c0f10b-4d06-4255-bd30-bcb6ec527685/screenrecord.mp4)

http://jira.it.chehejia.com/browse/XHMI-103352

Force stop 或 kill 地图进程后,打开地图、返回桌面反复操作,最后打开地图后 SurfaceView 内容不显示。

问题分析

Dump 信息分析

Untitled

Dump 信息的 activeBuffer=[2840x1360:2880,RGBx_8888] 表示地图应用给 SurfaceFlinger 传递的 buffer 是有效的,说明绘制没有问题。但 Region VisibleRegion (this=0 count=0) 表示该 layer 没有可见区域,所以不会参与合成。

Untitled

上图也表示参与合成的 layer 中只有 MainActivity 的 layer,并没有 SurfaceView layer。所以现象是地图无内容。

VisibleRegion 空的其中一个原因是设置了 eLayerHidden。对于 SurfaceView,在 SurfaceView.performSurfaceTransaction() 中根据可见性设置的。我们加 log 确认了,问题发生时没有设置 eLayerHidden

对比正常和异常的 dump 信息。

异常 dump

异常 dump

正常 dump

正常 dump

SurfaceView 的信息没有变化,但是它的相对层级,即 activity 的 layer 信息有不同。正常中 activity 的 isOpaque=0,但异常中 activity 的 isOpaque=1。Opaque 表示 layer 是否不透明,当 activity 的 isOpaque=1 说明 activity 不透明,所以在 activity 下层显示的 SurfaceView 的 visibleRegion 是空的。

代码分析

问题在 Android 11 发现,而在 Android 12 中没有复现。所以我们先分析 Android 11 中 opaque 是如何设置的。