모래게임 Sandrop TIL 35
태블릿에서 게임을 켰더니
세로 고정이라고 정해 둔 것이 안 지켜졌다
태블릿으로 게임을 켰더니 가로로 떴다. 이 게임은 세로 전용이라 세로로 고정해 뒀는데도 그랬다.
알아보니 Android 16부터는 화면이 큰 기기에서 앱의 세로 고정을 무시한다. 기준은 짧은 쪽이 600dp 이상인데, dp는 기기마다 다른 화소 밀도를 걷어낸 길이 단위다. 같은 600dp라도 촘촘한 화면이면 화소는 더 많다. 태블릿·폴더블 안쪽 화면·크롬북이 여기 해당하고, 분할 화면이나 제조사의 회전 강제에서도 같은 일이 생긴다.
폰만 보고 만든 게임이라도 태블릿에서 받아 간다. 내려받는 쪽을 막지 않는 한 “우리는 세로 앱”이라는 전제는 기기가 지켜 주지 않는다.
- 내가 정한 제약이 OS 버전이 올라가면 무효가 될 수 있다. 화면을 어떻게 쓰겠다는 약속일수록 기기가 커질 때 먼저 깨진다
- 약속이 깨졌을 때 무엇이 보일지를 정해 두는 게 진짜 대응이다. 우리는 가로가 되면 세로 비율 상자를 가운데 두고 양옆을 여백으로 채우는 레터박스(원래 비율을 지키려고 남는 자리를 여백으로 채우는 방식)를 걸어 뒀다
확인하려고 깔았더니 그 기기의 기록이 지워졌다
수정한 것을 태블릿에서 보려면 개발판을 깔아야 했다. 그런데 그 태블릿에는 스토어에서 받은 게임이 이미 깔려 있었다.
둘은 같이 못 깐다. 앞선 TIL 20에서 업로드 키와 앱 서명 키가 다르다는 걸 정리했는데, 그 결과가 여기서 나온다. 스토어로 나간 앱은 구글이 앱 서명 키로 다시 서명한 것이라 이쪽에서 만든 빌드와 서명이 다르다. 덮어 깔리지 않으니 먼저 지워야 하고, 지우면 그 기기의 진행 기록도 같이 없어진다.
그 태블릿은 테스트용이라 지우기로 했다. 대신 고를 수 있는 길이 둘 더 있었다. 내부 테스트 트랙(스토어에 올리되 지정한 사람에게만 보이는 배포 통로)에 올려 스토어로 받으면 서명이 같아 기록이 남는다. 그리고 앞선 TIL 30에서 넣은 클라우드 저장에 연결해 둔 기기라면, 지우고 다시 깔아도 진행 상황은 불러올 수 있다.
- 확인 방법을 고를 때 그 기기에 쌓인 것이 얼마짜리인지 먼저 본다. 지우는 쪽은 빠르고, 기록을 지키는 쪽은 한 번 올렸다 받는 수고가 든다
- 지워도 되는 기기를 하나 정해 두면 이 판단을 매번 안 해도 된다. 클라우드 저장을 붙여 둔 뒤로는 그 기기 범위가 넓어졌다
재현이 안 되는 증상 앞에서
테스트를 조일까, 내가 본 것을 의심할까
태블릿에서 찍은 화면에서 일일 보상 화면이 세로 상자를 다 덮지 않고 있었다. 같은 상황을 위젯 테스트(기기 없이 화면 구조만 메모리에서 조립해 크기를 재는 시험)로 만들어 봤더니 문제가 없었다.
여기서 갈 길이 둘이다. 테스트가 실제 조건을 못 담았다고 보고 조건을 더 얹거나, 내가 본 것을 잘못 읽었다고 보고 관측부터 다시 읽거나. 둘 다 그럴듯해서 먼저 집는 쪽으로 시간이 흐른다.
이번에 정한 기준은 이렇다. 관측이 몇 겹인지를 센다. 스크린샷 한 장에는 화소 위치와 색까지만 들어 있고, 어느 색이 무엇이 칠한 것인지는 내가 얹은 해석이다. 해석이 한 겹 끼어 있으면 그쪽을 먼저 의심한다. 반대로 숫자가 기기에서 직접 나온 것이면 테스트 쪽을 조인다.
- 테스트를 조이는 작업은 끝이 없고 조일수록 그럴듯해진다. 해석을 다시 읽는 일은 십 분이면 끝난다. 싼 쪽부터 한다
- 재현 실패는 실패가 아니라 정보다. 내가 본 것과 코드가 하는 일 사이 어딘가가 어긋났다는 뜻이고, 그 어딘가에는 내 눈도 들어간다
반례가 있는 근거는 근거가 아니다
해석을 다시 읽을 때 근거를 둘 잡았다. 하나는 여백 색이 앱의 창 배경색과 같다는 것이고, 다른 하나는 어두운 화면이 화면 한가운데가 아니라 왼쪽에 붙어 있다는 것이었다. 앱이 스스로 가운데 두는 방식이면 한쪽으로 쏠릴 리 없다고 봤다.
두 번째 근거는 무를 수밖에 없다. 앞선 TIL 2에서 같은 함정을 이미 겪었다. 그때도 앱은 가운데 정렬을 하고 있었는데 화면에서는 치우쳐 보였다. 기준이 화면 전체가 아니라 남은 자리였기 때문이다. 가운데로 두라고 해 놓아도 무엇의 가운데인지에 따라 치우친다.
- 근거를 셀 때 개수보다 반례를 먼저 찾는다. 앞 글에 이미 반례가 있으면 그 근거는 남 앞에서 못 쓴다
- 자기 프로젝트의 앞 기록이 가장 가까운 반례 창고다. 남이 반박하기 전에 거기부터 뒤진다
재 보니 두 번째 추측도 틀렸다
남은 근거가 색 하나뿐이라 “OS가 준 창일지도 모른다”까지가 한계였다. 태블릿을 연결해 앱이 받은 창 크기를 쟀다. 창은 화면 전체였다. OS는 아무것도 줄이지 않았다.
재 보니 층이 갈렸다. 이 게임은 가로 화면을 받으면 세로 비율 상자를 만들어 그 안에 화면을 그리는데, 상자도 594였고 화면이 받은 크기도 594였다. 그런데 칠해진 배경은 394였다.
원인은 배경이 자기 내용물 크기로 줄어든 것이었다. 화면 틀은 본문에 “최대 이만큼까지 써도 된다”고만 알려 주는데, 배경이 자기 크기를 안 정해 두면 그 말을 “자식만큼만 쓰겠다”로 받는다. 그래서 배경 폭이 카드 세 장 폭과 같아졌다. 폰에서는 카드 세 장이 화면 폭을 거의 채워서 안 보였고, 태블릿에서만 드러났다.
- 추측은 두 번 틀릴 수 있다. 첫 해석이 틀린 걸 알고 세운 두 번째 해석도 근거가 하나뿐이면 마찬가지다
- “최대 이만큼”과 “여기까지 채워라”는 다른 말이다. 배경처럼 끝까지 차야 하는 것은 스스로 크기를 정하게 한다
- 폰에서만 보면 이 차이가 영영 안 보인다. 화면이 넓은 기기가 이런 종류의 버그를 드러낸다