adb exec-out screencap 하면 PNG가 안 열릴 때 — [Warning] Multiple displays 해결
adb로 스크린샷을 뜨면 파일은 생기는데 열리지 않는 경우가 있습니다. 용량도 정상이고 확장자도 .png인데 이미지 뷰어와 파이썬 Pillow가 둘 다 "열 수 없다"고 합니다.
원인은 파일 맨 앞에 붙은 영어 경고문 347바이트였습니다. 갤럭시 Z 플립4에서 직접 확인한 내용을 정리했습니다.
결론부터
- 기기에 디스플레이가 둘 이상이면 screencap이 경고문을 출력하고, adb exec-out은 그 경고문까지 같은 스트림으로 내보내서 PNG 앞에 글자가 섞입니다.
- 해결은 두 가지입니다. 디스플레이 ID를 지정(-d)하거나, 경고만 버립니다(2>/dev/null).
- 어느 쪽이든 속도 차이는 없었습니다. 5회 평균 289ms / 294ms / 298ms였습니다.
1. 증상 — 파일은 있는데 안 열린다
아래 명령으로 받은 파일이 열리지 않았습니다.
adb exec-out screencap -p > screen.png
| 항목 | 확인한 값 |
| 파일 크기 | 83,364바이트 (정상 파일과 비슷) |
| 파일 맨 앞 바이트 | 5B 57 61 72 6E … (글자 "[Warn") |
| PNG 시그니처(89 50 4E 47) 위치 | 347바이트 뒤 |
| Pillow로 열기 | UnidentifiedImageError |
파일을 텍스트로 열어 보면 맨 앞에 이런 문장이 있습니다. "Multiple displays were found, but no display id was specified!" 디스플레이가 여러 개인데 어느 것을 찍을지 지정하지 않았다는 경고입니다.
2. 원인 — 화면이 두 개인 기기
플립4는 내부 디스플레이가 두 개입니다. 아래 명령으로 확인했습니다.
adb shell dumpsys SurfaceFlinger --display-id
결과에 port=130과 port=131 두 개가 나옵니다. 메인 화면(1080×1920)과 보조 화면(1920×1080)입니다. 화면을 PC로 띄우는 도구를 켜면 dumpsys display 목록에 가상 디스플레이도 하나 더 잡힙니다.
경고문은 "지정하지 않으면 첫 번째 디스플레이를 찍지만, 매번 같다는 보장은 없다"는 뜻도 담고 있습니다. 그래서 ID를 지정하는 쪽이 더 안전합니다.
3. 해결 방법
① 디스플레이 ID를 지정한다 (권장)
위에서 확인한 ID를 -d 뒤에 붙입니다.
adb exec-out screencap -p -d 4630947232161729154 > screen.png
메인 화면은 1600×900 PNG(83,017바이트)로 정상 저장됐고 Pillow로 바로 열렸습니다. 보조 화면(ID 끝자리 155)을 찍으면 1920×1080 크기로 저장되지만 모든 픽셀 값이 0, 즉 완전히 검은 화면입니다. 접힌 상태의 보조 화면은 꺼져 있기 때문입니다.
② 경고만 버린다
adb exec-out "screencap -p 2>/dev/null" > screen.png
ID를 몰라도 되고, 결과는 1600×900 PNG로 정상이었습니다. 다만 어느 화면이 찍히는지는 기기가 정합니다.
③ 이미 받은 파일은 앞부분을 잘라낸다
PNG 시그니처(89 50 4E 47) 위치를 찾아 그 앞을 버리면 됩니다. 이번 기기에서는 347바이트였지만, 경고문 길이는 안드로이드 버전에 따라 다를 수 있으니 길이를 고정하지 말고 시그니처를 찾으세요.
4. 속도 비교 (5회)
| 방법 | 5회 측정(ms) | 평균 | 파일 열림 |
| 그대로 (경고문 포함) | 326, 286, 303, 300, 274 | 298ms | 실패 |
| -d 로 ID 지정 | 323, 296, 279, 274, 273 | 289ms | 성공 |
| 2>/dev/null | 305, 309, 288, 292, 276 | 294ms | 성공 |
측정 환경: Galaxy Z Flip4 (SM-F721N) · Android 14 · USB가 아닌 유선 네트워크(이더넷) 경유 adb · Windows 11 · 한 번에 한 대. 차이는 측정 편차 안쪽이라 속도를 이유로 고를 필요는 없습니다.
5. 안 된 방법 — adb shell로 받기
exec-out 대신 adb shell screencap -p로 받아 보았습니다. ID를 지정해도 열리지 않았습니다. 파일 맨 앞이 89 50 4E 47 0D 0D 0A 1A로, 원래 0D 0A여야 할 줄바꿈 바이트 앞에 0D가 하나 더 끼어 있었습니다. 터미널을 거치면서 줄바꿈이 변환된 것입니다. 이런 경우에는 경고 문제가 아니라 exec-out을 써야 하는 문제입니다.
정리
스크린샷 파일이 열리지 않을 때는 먼저 파일 맨 앞 바이트를 보세요. 89 50 4E 47이 아니라 글자가 보이면 경고문이 섞인 것이고, 0D 0D 0A가 보이면 exec-out을 쓰지 않은 것입니다. 두 경우의 해결법이 다릅니다.
같은 방식으로 기기 상태를 읽는 방법은 adb로 안드로이드 게임 프레임 측정하는 법에, 설정을 바꾸고 효과를 직접 재 본 기록은 개발자 옵션 애니메이션 배율 19회 실측에 정리해 두었습니다.
최종 수정일: 2026년 10월 3일