EEltaCrew
홈 › 블로그

지도 왼쪽 아래 로고를 누르면 앱이 꺼졌다: 네이버 지도 SDK 와 AppCompat 테마

게시 2026-10-19실측 기준 2026-10-18읽는 시간 약 5분elta · EltaCrew

로또 판매점 지도 앱의 Crashlytics 에 「You need to use a Theme.AppCompat theme」 크래시가 4건 올라왔습니다. 사용자가 아니라 Play 사전 출시 보고서의 테스트 로봇이 지도 왼쪽 아래 NAVER 로고를 누른 것이었습니다. 원인, 앱 전체 테마를 바꾸지 않고 지도만 감싼 수정, 다크 모드에서 생긴 두 번째 문제를 정리합니다.

처음 본 크래시

10월 17일 저녁, 로또 판매점 지도 앱의 Crashlytics 에 처음 보는 크래시가 올라왔습니다.

java.lang.IllegalStateException: You need to use a Theme.AppCompat theme
(or descendant) with this activity.
    at com.naver.maps.map.widget.LogoView$3.onClick

10월 19일에 다시 세어 보니 최근 14일 동안 4건, 영향 사용자 2명이었습니다. 1.0.78 에서 3건, 1.0.79 에서 1건이고 기기는 4건 모두 OnePlus 8 Pro, Android 11 이었습니다. 이 기기는 Play 사전 출시 보고서에서 앱을 자동으로 눌러 보는 테스트 로봇이 쓰는 기기로 자주 보던 것입니다. 실제 사용자 기기에서 난 건은 없었습니다.

로봇이 낸 크래시라도 넘기지 않았습니다. 스택이 우리 코드가 아니라 지도 SDK 안이었고, 로봇이 한 일은 화면에 보이는 걸 눌러 본 것뿐이라, 사용자도 같은 곳을 누르면 똑같이 꺼질 것이었기 때문입니다.

로고를 누르면 SDK 가 대화상자를 띄운다

네이버 지도 SDK 는 지도 왼쪽 아래에 NAVER 로고를 그립니다. 이 로고를 누르면 SDK 가 대화상자를 하나 띄우는데, 안에 SDK 정보, 지도 범례, 법적 공지, 오픈소스 라이선스 메뉴가 들어 있습니다. 이 대화상자가 androidx.appcompat 의 대화상자라서, 그것을 띄우는 화면의 테마가 AppCompat 계열이어야 합니다.

우리 앱은 화면을 전부 Jetpack Compose 로 그리고, 색은 Compose 테마가 정합니다. 그래서 액티비티 테마는 창 바탕색만 정하는 가벼운 것으로 두었습니다.

<style name="Theme.Lotto" parent="android:Theme.Material.Light.NoActionBar">
    <item name="android:windowBackground">@color/window_bg</item>
    ...
</style>

android:Theme.Material 은 AppCompat 계열이 아닙니다. 지도를 띄우고 스크롤하고 마커를 누르는 동안에는 아무 문제가 없었고, 로고를 누르는 순간에만 대화상자가 테마를 확인하다가 예외를 던졌습니다. 개발하면서 로고를 눌러 본 적이 없어서 몰랐습니다.

고친 방법: 지도만 AppCompat 으로 감싸기

앱 전체 테마의 부모를 AppCompat 으로 바꾸는 방법도 있지만, 그러면 지도와 상관없는 화면까지 모두 다시 확인해야 합니다. 문제가 생기는 곳은 지도 뷰 하나라서, 지도 뷰를 만들 때 넘기는 Context 만 AppCompat 테마로 감쌌습니다.

<!-- 지도 뷰 전용 -->
<style name="Theme.LottoMap" parent="Theme.AppCompat.Light.NoActionBar" />
val mapView = remember {
    MapView(ContextThemeWrapper(ctx, R.style.Theme_LottoMap)).also { it.onCreate(null) }
}

ContextThemeWrapper 로 감싼 Context 로 MapView 를 만들면, 지도 안에서 뜨는 대화상자는 이 테마를 보고, 앱의 나머지 화면은 원래 테마를 그대로 씁니다. 스타일은 라이브러리 리소스를 직접 가리키지 않고 앱의 themes.xml 에 따로 두었습니다.

두 번째 문제: 다크 모드에서 글자가 안 보인다

처음에는 앱이 다크 모드를 지원하니 Theme.AppCompat.DayNight.NoActionBar 로 감쌌습니다. 크래시는 사라졌지만, 갤럭시 노트10+ 를 다크 모드로 두고 로고를 눌러 보니 대화상자 배경은 어두워졌는데 SDK 가 쓰는 글자색이 어두운 그대로라 메뉴 글자가 거의 보이지 않았습니다.

그래서 지도 테마는 Light 로 고정했습니다. 다크 모드에서도 이 대화상자만 밝게 뜹니다. 앱의 다른 화면과 어울리지는 않지만, 읽히지 않는 것보다 낫다고 판단했습니다.

갤럭시 노트10+ 에 디버그 빌드를 설치해 로고 → 대화상자 → 범례, 법적 공지, 오픈소스 라이선스를 차례로 모두 열어 보고 크래시가 없는 것을 확인했습니다. 이 수정은 10월 18일에 1.0.80 으로 Play 에 제출했습니다.

같은 SDK 를 쓰는 다른 앱

네이버 지도를 쓰는 앱이 셋 더 있어서 테마를 확인했습니다.

셋 다 AppCompat 계열이라 이 크래시는 나지 않는 구조입니다(테마를 보고 판단했고, 세 앱에서 로고를 직접 눌러 보지는 않았습니다). 또 셋 다 DayNight 이라, 다크 모드에서 같은 대화상자의 글자가 안 보이는지도 아직 확인하지 않았습니다.

정리

이 글에 나온 앱은 로또 당첨번호·명당 판매점 앱(Google Play) 입니다.

Android네이버 지도 SDKJetpack ComposeCrashlytics크래시

함께 읽기

광고 SDK 초기화가 끝나기 전에 광고를 요청하면 꺼진다: 막는 장치를 만들고도 세 번 다시 나온 이유운영 중인 앱에서 「MobileAds.initialize must be called」 크래시를 처음 고친 뒤에도 같은 크래시가 다른 모양으로 세 번 더 나왔습니다. 초기화 완료를 기다리는 장치는 있었지만, 시작 시점에 켜지는 값, 동의만 보고 켜지는 값, 그 장치를 거치지 않는 새 광고 자리가 빈틈이었습니다. 각 경우의 원인과 23개 앱 전수 점검 결과를 정리합니다.이미지 줄여 읽기 한 줄이 만든 크래시: inSampleSize 는 0 에서 시작한다메모리를 아끼려고 QR 스캐너 앱 문서함의 썸네일을 줄여 읽게 바꿨더니, 다음 버전에서 문서 목록을 열 때마다 앱이 꺼졌습니다. 원인은 BitmapFactory.Options 의 inSampleSize 기본값이 0 이라는 것이었습니다. 바꾼 코드, 크래시 기록, 고친 코드, 같은 실수를 다른 곳에서 찾은 방법을 정리합니다.Crashlytics 에 안 잡힌 크래시: 넣은 버전부터만 보인다앱 21개에 Firebase Crashlytics 를 넣고 사흘 뒤, 사용자가 겪은 크래시를 Play Console 에서 먼저 발견했습니다. Crashlytics 는 SDK 를 넣은 빌드부터만 보고하고, 사용자 폰에 남아 있는 옛 버전의 크래시는 Play vitals 에만 쌓입니다. 21앱 전수 결과와 지금 쓰는 확인 순서를 정리합니다.