Android Studio中Android 10(Q)模拟器熄屏时screencap截图异常问题
问题根因
该现象是Android 10(API 29)官方模拟器镜像的专属已知渲染逻辑bug,和操作流程无关:
- 灰白相间的小方格是Android图形栈默认的内存占位图案,用于标记未完成渲染、未写入有效内容的图形缓冲区
- Android 10模拟器熄屏时,SurfaceFlinger合成服务跳过了“向帧缓冲填充纯黑帧再提交”的步骤,直接把未写入有效内容的图形缓冲区暴露给了
screencap调用接口,最终导出的截图就会显示棋盘格占位图案 - Android 9及更早版本模拟器保留了熄屏填黑帧的逻辑,Android 11版本修复了该合成逻辑疏漏,因此同操作下这两个版本的模拟器熄屏截图为正常纯黑。
复现操作流程
- 在Android Studio中启动Android 10版本模拟器
- 触发模拟器熄屏操作,等待屏幕完全熄灭
- 在Android Studio终端执行
adb devices确认ADB连接正常 - 执行截图命令:
adb shell screencap -p /sdcard/cap_test.png - 将截图导出到本地:
adb pull /sdcard/cap_test.png ./ - 打开本地文件即可看到异常棋盘格截图,同操作在Android 9、Android 11模拟器上得到正常纯黑屏截图。
异常与正常效果参考


可用解决方案
- 临时逻辑规避:执行screencap前先通过命令
adb shell dumpsys power | grep mWakefulness=检测屏幕状态,若返回mWakefulness=Asleep即熄屏状态,可直接返回自定义纯黑图片作为截图结果,或先点亮屏幕再执行截图操作;若做自动化测试,可单独对API 29版本加熄屏场景的特殊判断逻辑。 - 镜像版本修复:将本地Android 10模拟器镜像更新到Google官方发布的API 29最新修订版,部分后续修订的镜像已经合入了该bug的修复补丁;若无严格的API 29版本强需求,直接迁移测试场景到Android 11(API 30)及以上版本模拟器即可完全规避该问题。
- 替换截图路径:放弃使用
adb shell screencap的截图方式,改用adb exec-out screencap -p > cap_test.png直接从宿主机端取帧,或使用Android Studio模拟器侧边栏自带的截图按钮,这两种方式不经过SurfaceFlinger熄屏状态的合成层输出,不会出现棋盘格异常。
内容的提问来源于stack exchange,提问作者It's Me SMA
相关产品推荐
相关产品推荐

