Android 개발/트러블슈팅

안드로이드 17 QPR1 베타 2 픽셀에 깔고 5일, 우리 앱이 깨진 자리 3곳

stackD 2026. 5. 21. 18:00

 

밤 11시, 픽셀 9(Pixel 9)에 안드로이드(Android) 17 QPR1 베타 2 OTA 알림이 떴습니다. '어차피 베타니까' 하고 눌렀더니, 다음 날 아침 우리 앱 BottomSheet가 네비게이션 바 뒤로 조용히 사라져 있더라고요.

 

5일 동안 하나씩 파고들어 보니 세 군데가 각각 다른 이유로 깨져 있었습니다. 어떤 건 릴리즈 직전이었다면 정말 아찔할 뻔한 상황이었거든요.

 

안드로이드 17 QPR1 베타 2, 앱 개발자가 챙겨야 할 변경 사항

이번 베타는 6월 정식 버전과는 별개로, 9월에 있을 픽셀 Feature Drop을 미리 시험하는 QPR1(Quarterly Platform Release) 빌드입니다. 그래서 구글(Google)이 손댄 영역이 생각보다 넓습니다. 크게 세 가지예요.

 

첫째는 백그라운드 서비스 실행 제한 강화입니다. 포그라운드 서비스 없이 백그라운드에서 특정 API를 호출하면 ForegroundServiceStartNotAllowedException을 맞이하게 됩니다. 안드로이드 12부터 점진적으로 강화되어 온 정책인데, 이번 QPR1에서는 시스템 리소스 관리 차원에서 더 깐깐하게 검사하는 것 같아요. 특히 targetSdkVersion 37로 올릴 예정인 앱들은 물론이고, OS의 바뀐 동작 방식 때문에 이전 버전을 타겟팅하는 앱들도 의도치 않은 제약을 받을 수 있다는 게 무서운 부분이거든요.

 

둘째는 비공개 내부 API 접근 차단 범위 확대입니다. 리플렉션이나 JNI를 통해 시스템 내부를 건드리던 코드가 NoSuchMethodError로 터질 수 있어요. 이번 빌드에서는 시스템 런타임과 프레임워크 내부 로직이 대거 최적화되면서 기존의 비공식적인 접근 경로들이 차단되었거든요. 오래된 서드파티 라이브러리를 그대로 들고 있는 앱이라면 특히 점검이 필요한 상황이에요.

 

셋째는 개인정보 보호 정책 강화입니다. 안드로이드 16부터 도입되었던 ACCESS_LOCAL_NETWORK 런타임 권한에 대한 강제성이 이번 빌드에서 더 눈에 띄게 나타나고 있어요. 연락처 접근도 전체 주소록 대신 사용자가 특정 연락처만 선택하는 방식이 표준으로 자리 잡으면서, 관련 UX 가이드가 더 촘촘해졌습니다.

 

 

픽셀 9에서 직접 확인한 안드로이드 17 회귀 버그 3곳

세 가지 모두 "분명히 동작하던 게 갑자기 안 된다"는 패턴이었습니다. 처음엔 제 코드가 잘못된 줄 알고 한참을 들여다봤어요.

 

1. 권한 다이얼로그 결과 콜백 누락 ActivityResultContracts.RequestMultiplePermissions()로 권한을 요청했을 때, 결과 콜백이 아예 오지 않는 상황이 생깁니다. 특정 순서로 권한을 요청할 때 내부 로직에서 경쟁 상태(race condition)가 생기는 것 같은데, 픽셀 9 실기기에서 꽤 빈번하게 발생하더라고요.

 

임시로는 requestCode 기반의 onActivityResult()로 폴백을 추가하거나, 콜백이 일정 시간 내에 오지 않을 때 처리하는 타임아웃 로직을 붙여서 우회하고 있습니다. onActivityResult()가 이제는 권장되지 않는(deprecated) 방식이지만, 베타 빌드의 불안정성을 막기 위한 임시 방편으로는 어쩔 수 없더라고요.

 

2. Edge-to-edge BottomSheet 인셋 계산 오류 도입부에서 말씀드린 그 문제입니다. ViewCompat.setOnApplyWindowInsetsListener()를 적용하는 시점이나 순서가 이번 베타에서 미묘하게 달라지면서, WindowInsets 객체가 제때 갱신되지 않았어요. 결과적으로 BottomSheet 하단이 시스템 네비게이션 바와 겹쳐서 터치가 먹히지 않는 영역이 생기더라고요.

BottomSheetDialogFragment에서 하단 인셋 패딩을 명시적으로 지정하거나, 
WindowInsetsAnimationCallback을 직접 재정의해서 해결했습니다.

 

3. Predictive Back 애니메이션 중단 뒤로 가기 제스처 시 애니메이션이 절반쯤 재생되다 뚝 끊기는 현상입니다. 프래그먼트 전환 중에 특히 자주 발생하는데요, onBackPressedDispatcher 콜백과 시스템의 애니메이션 렌더링 타이밍이 어긋나는 게 원인으로 보여요. 임시 해결책으로 전환 애니메이션을 명시하고 종료 전 아주 짧은 딜레이를 주는 방식을 썼는데, 정식 빌드에서는 수정되길 기다려야 할 부분입니다.

 

 

안드로이드 17 정식 출시 전 앱 호환성 체크리스트 5가지

지금 베타 상황을 보면, 6월 안정 버전 출시 전에 아래 다섯 가지를 챙겨두는 게 좋다고 봅니다.

 

1. 타겟 SDK 버전 37 마이그레이션 준비 백그라운드 작업을 포그라운드 서비스로 전환하고, ForegroundServiceStartNotAllowedException 예외 처리를 추가해야 합니다. 이 예외가 터지는 시나리오를 미리 테스트 케이스로 잡아두는 게 나중을 위해 훨씬 편하거든요.

 

2. 비공개 내부 API 사용 제거 StrictMode.detectNonSdkApiUsage()를 활성화해서 리플렉션 호출 위치를 먼저 찾아야 합니다. 공식 API로 대체할 수 없으면 라이브러리 업데이트를 기다려야 하는데, 이 작업이 생각보다 시간이 꽤 걸리거든요.

 

3. 권한 콜백 방어 코드 추가 콜백이 오지 않을 경우를 대비해 타임아웃 로직이나 데이터 상태를 재검증하는 로직을 넣어두는 게 안전합니다. 베타 기간에 확인된 이런 이슈들이 정식 버전에서 해소되겠지만, 미리 대비해서 나쁠 건 없으니까요.

 

4. Edge-to-edge 레이아웃 실기기 검증 에뮬레이터만으로는 인셋 문제를 잡기 어렵습니다. 실제 픽셀 기기에서 WindowInsetsCompat으로 인셋 값을 로깅하면서 하단 바 영역이 가려지지 않는지 꼭 확인해 보세요.

 

5. Predictive Back 수동 테스트 실제 픽셀 기기에서 직접 뒤로 가기 제스처를 해보면서 프래그먼트 전환 타이밍을 체크해야 합니다. 애니메이션이 자연스럽게 이어지는지 눈으로 직접 확인하는 게 가장 정확하더라고요.

 

 

마치며

6월 안정 버전이 나오면 이번 회귀 버그들이 얼마나 해결됐는지 다시 정리해 볼 생각입니다. 베타 테스트 기간에 발견된 이슈들이 개발자 커뮤니티에서 꾸준히 논의되고 있는 만큼, 정식 출시 전에는 픽스가 들어올 것 같아요. 다음 글에서는 안드로이드 17의 성능 측정 데이터와 함께 더 깊은 기술 이야기를 풀어볼게요!