반응형
SMALL

2026/07 26

Navigation 3로 갈아타 봤습니다 — 화면 백스택을 상태로 직접 들고 있게 된 자리

예전에 멀티 백스택 구현하느라 popUpTo saveState 옵션을 3시간 동안 붙들고 있었던 적이 있어요. Navigation 3 백스택을 처음 본 순간, 그 3시간이 좀 허무해지더라고요. 지난달에 사이드 프로젝트 하나를 통째로 Navigation 3 (1.0 stable, 작년 11월 출시) 로 갈아끼워봤습니다. 화면 12개짜리 작은 앱이라 부담이 적었는데요, 갈아끼우면서 느낀 차이를 정리해두려 합니다. Navigation 2 멀티 백스택의 한계 — 백스택을 못 만지는 답답함내비게이션 2(Nav2)를 쓰면서 가장 답답했던 건 백스택을 직접 만질 수 없다는 점이었습니다. NavController.backQueue 가 외부에서 못 만지게 막혀 있어서, 멀티 백스택을 구현하려면 popUpTo + save..

안드로이드 스크린샷 테스트 3종 비교 — Roborazzi·Paparazzi·Compose Preview 갈라 써본 한 주

코드 리뷰어 4명이 통과시킨 PR에서 패딩 2dp가 슬쩍 깎였습니다. 14개 화면 중 4개가 깨졌는데 머지될 때까지 아무도 몰랐어요. QA가 다음 날 다크 모드 캡처 비교본을 슬랙에 올리고 나서야 알았습니다. Modifier.padding(16.dp) 가 14.dp 로 바뀐 한 줄이었는데, diff 만 보면 그저 숫자 두 자리지요. 렌더링 결과를 보지 않으면 잡히지 않는 회귀였습니다. 이 사건을 계기로 안드로이드 스크린샷 테스트 도구 세 개를 같은 화면에 붙여보고 CI에 뭘 박을지 골랐는데, 그 한 주짜리 비교 기록을 남겨봅니다. 코드 리뷰가 못 잡는 1px UI 회귀CI 한 사이클을 90초 안에 끝내는 게 우리 팀 목표였어요. 그러니 에뮬레이터 띄우는 데만 5분 넘게 잡아먹는 Espresso 계열은 후..

Conventional Commits로 정리한 git log, 안드로이드 팀 도입 30일 회고

5월 스프린트 412개 커밋 중 51개가 'fix bug' 였습니다. 릴리즈 노트 한 장 만드는 데 두 시간이 날아갔고, 그동안 PR 리뷰는 전부 멈춰 있었어요. 저희는 안드로이드 단일 레포를 굴리는 5명짜리 팀인데, 이날을 기점으로 컨벤셔널 커밋(Conventional Commits)을 강제 도입하기로 결정했습니다. 한 달 굴려본 기록을 정리해봤어요. 'fix bug' 51개에 깔린 릴리즈 회고, 두 시간을 날린 이유5월 한 달 커밋 메시지를 훑어보니 fix bug, 수정, ㅇㅇ, . 같은 메시지가 51개였습니다. 릴리즈 직전에 QA가 "이번 빌드에 PG사 콜백 핫픽스 들어갔어요?" 라고 물었는데, 단번에 답을 못 드렸어요. 결국 git log -S "PaymentCallback" 으로 코드 변경 흔적..

로컬 초록불, CI 빨간불 — Flaky 테스트 격리로 5주 만에 18.3%→2.1% 잡은 기록

금요일 저녁 6시, PR 머지만 하면 퇴근이었습니다. 근데 CI가 또 빨간불이더라고요. 로컬에선 100번을 돌려도 초록불인데 말이죠. 재시도 버튼을 세 번 누르고서야 겨우 통과했습니다. 다음 주에 또 같은 테스트가 빨간불을 띄웠을 때, 이제는 격리 외에 답이 없겠다 싶었어요. Flaky 테스트가 PR 머지 시간을 1.7배로 늘린 대목수치를 한 달 모아봤더니 멘붕이 오더라고요. PR 평균 머지 시간이 38분에서 65분으로 늘었고, 수동 재시도가 월 142회까지 갔어요. 1.7배라는 수치보다, PR 하나가 다음 PR을 잡고 늘어진다는 점이 더 큰 그림이었습니다. 더 무서운 건 따로 있었어요. "재시도 세 번에 통과했으니 됐다"고 넘긴 결제 로직 테스트가, 알고 보니 0.3% 확률의 경쟁 상태(race con..

안드로이드 ANR 해결, Play Console '메인 5초' 리포트만 보고 범인 찾은 자리

월요일 아침에 Play Console 열었더니 ANR 발생률이 0.62%로 빨갛게 떠 있었어요. 재현은 안 되고, 스택 최상단은 nativePollOnce 한 줄이 전부였습니다. 기준치는 0.47%인데, 한 줄로 0.15%p 차이지만 Store 노출 불이익이 28일 롤링 평균으로 평가되는 수치라 한가하게 둘 상황이 아니었습니다. 다행히 안드로이드 스튜디오(Android Studio)에서 R8 매핑 파일을 번들에 자동 포함시키도록 해둔 덕에 난독화 해제는 그대로 됐어요. 거기서부터 한 줄씩 클러스터를 까보기 시작했습니다. Play Console ANR 리포트, 'nativePollOnce' 클러스터 걸러내기가장 먼저 한 일은 nativePollOnce 가 top frame인 클러스터를 일단 옆으로 치워두는..

Play가 16KB 페이지 크기를 요구합니다 — 네이티브 라이브러리 안 깨지게 맞춘 자리

릴리즈 빌드 올린 다음 날, Pixel 8 사용자 크래시 리포트가 쏟아졌습니다. logcat엔 cannot map segment, not page aligned. 4KB 환경에선 멀쩡하던 앱이 16KB 단말에서 그대로 죽어버린 현장이었어요. Pixel 8에서만 SIGSEGV로 죽던 16KB 충돌의 정체Pixel 8·9 같은 16KB 페이지 크기 단말에서 linker64 가 cannot map segment from ... 메시지와 함께 앱을 끝내버립니다. 4KB 환경에선 멀쩡하니까 처음엔 기기 호환성 이슈로 오해하기 쉽던데요. logcat에 page size 16384, not page aligned, dlopen failed 가 같이 찍히면 거의 정렬 문제입니다. 직접 NDK 코드를 빌드한 적이 없어도..

반응형
LIST