Series · 13 stories
안드로이드를 만들며 배운 것
빌드는 통과했는데 화면과 뜻이 조용히 틀어져 있던 것들
-
안드로이드를 만들며 13 — 검사는 겨눈 것만 셉니다 - 11개 언어와 strings-parity의 맹점
11개 언어 리소스의 누락을 잡는 strings-parity.sh 스크립트가 있었습니다. 스크립트는 항상 초록불이었지만, 실제 스페인어 파일에는 영어가 섞여 있고 프랑스어 파일에는 스페인어가 오염되어 있었습니다. 검사는 열쇠만 세지, 그 안의 뜻을 보지 못합니다.
-
안드로이드를 만들며 12 — 광고가 이상한 줄 알았더니 위의 Scaffold가 둘이었어요
하단 광고 배너 아래에 정체불명의 빈 여백이 생겼습니다. 광고 뷰의 픽셀을 의심했지만, 원인은 화면 상단에 겹쳐 있던 2중 Scaffold와 두 번 더해진 윈도우 인셋이었습니다. 눈에 보이는 자리와 원인이 있는 자리를 분리해 디버깅한 기록입니다.
-
안드로이드를 만들며 11 — 글자층을 싣는 것과 검색이 되는 것은 다른 말입니다
이미지 스캔본 위에 투명 텍스트를 얹어 검색 가능한 PDF를 만들었습니다. 그런데 글꼴 파일이 PDF에 들어갔다는 것과 뷰어에서 실제로 검색이 된다는 것은 전혀 다른 문제였습니다. ToUnicode 맵과 폰트 서브셋 베이킹의 집착을 정리합니다.
-
안드로이드를 만들며 10 — 스퀴클은 원이 아니에요 - 앱 아이콘을 세 번 틀리고 굽는 법
둥근 타일 원본을 적응형 아이콘에 넣는 단순한 일에서 세 번 틀렸습니다. 모서리가 두 겹이 되고, 검은 초승달이 남고, 아이콘이 제 칸의 절반도 못 채웠어요. 틀릴 때마다 배운 건 하나였습니다 — 짐작하지 말고 그림에게 물어라.
-
안드로이드를 만들며 9 — QR을 찍은 사람이 앱이 있는데도 스토어로 갔어요
공유 그림의 QR이 스토어 주소를 직접 담고 있었습니다. 앱을 이미 깐 사람도 찍으면 스토어로 떨어졌어요. 주소를 우리 도메인으로 바꾸고 App Links를 세우면 링크 하나가 두 경우를 다 받습니다 — 그 구현을 처음부터 끝까지 적었습니다.
-
안드로이드를 만들며 8 — MainActivity 다이어트 - 생명주기를 Compose 트리로 내렸어요
결제와 인앱 업데이트가 Activity의 생명주기를 요구해서 MainActivity가 온갖 SDK의 진입점이 돼 있었어요. onResume·onDestroy 오버라이드를 걷어내고 그 책임을 컴포저블 하나로 내린 이야기입니다.
-
안드로이드를 만들며 7 — 화면이 콜백 열세 개를 들고 있었어요 - MVI로 입구를 하나로
상태 끌어올리기를 하다 보니 화면 컴포저블의 시그니처가 끝없이 길어졌어요. 버튼 하나를 더할 때마다 화면·껍데기·ViewModel 세 곳을 고쳐야 했습니다. 사용자의 행동을 sealed interface 하나로 묶어 입구를 하나로 줄인 이야기예요.
-
안드로이드를 만들며 6 — 저장소가 둘인데 화면은 하나로 봅니다 - AppRepository와 SSOT
목록은 Room이, 설정값은 DataStore가 들고 있어요. 화면이 그 둘을 다 알아야 할 이유는 없었습니다. combine으로 하나의 Flow로 묶어 단일 진실 공급원을 세운 이야기, 그리고 옛 저장본과 맺은 약속에 대한 이야기예요.
-
안드로이드를 만들며 5 — 하루에 구조를 세 번 바꿨어요 - Hilt · Navigation · 걷어낸 것들
돌아가는 앱을 스토어에 올리고 나서, 하루를 통째로 구조에 썼어요. 손으로 만든 DI를 Hilt로, 손으로 만든 화면 전환을 Navigation으로, 그리고 이미 낡은 것들을 걷어냈습니다.
-
안드로이드를 만들며 4 — 검증은 한 번, 증명은 타입이 들고 다닙니다
같은 날 버그 둘이 나왔어요. 하나는 같은 규칙이 두 곳에 다르게 적혀 있었고, 하나는 아무도 검증하지 않는 칸이 있었습니다. 값을 맞추는 데서 멈추면 셋째 버그가 옵니다.
-
안드로이드를 만들며 3 — aapt는 줄바꿈을 공백 하나로 접습니다
strings.xml에 두 줄로 적은 문장이 화면에서는 띄어쓰기 하나로 이어 붙었어요. 네 문자열이 그랬고, 번역된 열한 언어가 똑같이 그랬습니다.
-
안드로이드를 만들며 2 — 위를 향한 꼭지는 그늘로 설 수 없어요
셀렉트 위에 붙인 삼각형 꼭지가 라이트 모드에서 사라졌어요. elevation을 아무리 올려도 살아나지 않았습니다. 값의 문제가 아니라 방향의 문제였어요.
-
안드로이드를 만들며 1 — 비워둔 타이포 슬롯은 남의 글꼴이 들어오는 문이었어요
Material3의 Typography 슬롯 열다섯 중 열하나만 정의하고 넷을 비워뒀어요. 그런데 비운 넷은 없는 칸이 되지 않았습니다. Roboto로 채워졌고, 화면은 그 넷을 실제로 부르고 있었어요.