카카오맵 V2 ANR 오류

[FAQ] 지도/로컬 API 문의 전 꼭 읽어 주세요.
https://devtalk.kakao.com/t/faq-api/125610

안녕하세요!

카카오맵 V2 사용 중 화면이 멈춰 어떠한 상호작용도 일어나지 않는 오류가 발생하였는데요,

상황은 다음과 같습니다.

  • Fragment 를 사용 중이다.
  • 레이아웃은 ConstraintLayout 이다.
  • 맵뷰의 높이는 명시되어 있어야 한다.
  • 맵뷰는 자신의 위에 있는 View 에 관계를 지니고 있다.
  • 맵뷰가 초기화 되기 전, 위에 있는 View 가 Gone, 혹은 Visible 처리되어야 한다.
  • 홈 화면을 갔다가 다시 카카오맵에 접근하면 화면이 터치되지 않는 오류가 발생한다. (ANR)

이렇게 ANR이 발생하는 것이 의도된 동작인지 궁금합니다!

버그 재현 코드도 함께 첨부하오니 확인 부탁드립니다.

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/white">

    <TextView
        android:id="@+id/text"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginTop="16dp"
        android:gravity="center"
        android:text="Test"
        android:textSize="36sp"
        android:visibility="gone"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <com.kakao.vectormap.MapView
        android:id="@+id/work_place_map_view"
        android:layout_width="0dp"
        android:layout_height="247dp"
        android:layout_marginTop="10dp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@id/text"
        app:layout_goneMarginTop="18dp" />
</androidx.constraintlayout.widget.ConstraintLayout>

class SecondFragment : Fragment() {
    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        return inflater.inflate(R.layout.fragment_second, container, false)
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        val mapView = view.findViewById<MapView>(R.id.work_place_map_view)
        val text = view.findViewById<TextView>(R.id.text)

        MainScope().launch {
            delay(120)
            text.visibility = View.VISIBLE
        }

        mapView.start(
            object : MapLifeCycleCallback() {
                override fun onMapDestroy() = Unit
                override fun onMapError(error: Exception?) = Unit
            },
            object : KakaoMapReadyCallback() {
                override fun onMapReady(kakaoMap: KakaoMap) = Unit
            }
        )
    }
}

감사합니다.

갤럭시 S22(SM-S901N), OS 13 환경에서 발생하였습니다.

안녕하세요. 좀 더 정확한 원인파악을 위해 몇 가지 추가 확인이 필요합니다.

  1. 사용하셨던 v2 SDK 버전(최신은 2.6.3)은 어떻게 되나요?

  2. 홈 화면을 갔다가 다시 카카오맵에 접근하면 화면이 터치되지 않는 오류가 발생한다. (ANR) 고 얘기해주셨는데, 100% 재현되는 현상인가요? 아니면, 가끔 혹은 간헐적으로 발생하나요?

  3. ANR 이 발생하는 상황 (홈 화면을 갔다가 다시 카카오맵에 접근하면 화면이 터치되지 않는 오류가 발생) 에서 Logcat 로그 중 “k3f” 필터링 된 로그 첨부도 부탁 드립니다.

안녕하세요. 문제 발생 상황 추가로 전달드립니다.

  1. 사용하셨던 v2 SDK 버전(최신은 2.6.3)은 어떻게 되나요?
    → 2.6.0 버전에서 테스트를 진행하였습니다.
    → 추가로 확인해보니 2.6.3 버전에서도 동일하게 버그가 발생합니다.

  2. 홈 화면을 갔다가 다시 카카오맵에 접근하면 화면이 터치되지 않는 오류가 발생한다. (ANR) 고 얘기해주셨는데, 100% 재현되는 현상인가요? 아니면, 가끔 혹은 간헐적으로 발생하나요?
    → ‘맵뷰가 초기화 되기 전(Before Start), 위에 있는 View 가 Gone, 혹은 Visible 처리되어야 한다.’ 라는 조건을 채우면 100% 재현됩니다.
    → 즉 원래는 Visibility 가 ‘Gone’ 인 View를 ‘Visible’ 하도록 처리하면 발생합니다. 그 반대도 성립합니다.

  3. ANR 이 발생하는 상황 (홈 화면을 갔다가 다시 카카오맵에 접근하면 화면이 터치되지 않는 오류가 발생) 에서 Logcat 로그 중 “k3f” 필터링 된 로그 첨부도 부탁 드립니다.
    → ANR이 발생한 상황에서는 아무런 상호작용도 할 수 없고, 로그도 전혀 발생하지 않습니다. 대신 해당 오류 발생 전 출력하는 로그를 아래에 첨부드립니다.

2023-11-02 13:07:38.421  9715-9715  K3fAApi                 com.gaon.kakaomaptest                D  finish failed. SurfaceView is null.
2023-11-02 13:07:38.445  9715-9803  K3fAApi                 com.gaon.kakaomaptest                D  ---> RequestHeader(https://dapi.kakao.com/v2/maps/vector/auth) {Accept=[application/json], Authorization=[KakaoAK 248b07a1aa55d23bc7ba5f8562780bdb], KA=[sdk/13 mapSdk/2.6.0 os/android-33 lang/ko-KR device/SM-S901N origin/lZ8bHI+w3XYXbhZO+Ocri3S/kXo= android_pkg/com.gaon.kakaomaptest]}
2023-11-02 13:07:38.473  9715-9802  K3fAApi                 com.gaon.kakaomaptest                D  AppSpec : High spec
2023-11-02 13:07:38.473  9715-9802  K3fCore                 com.gaon.kakaomaptest                I  app diplay scale: 1.326694
2023-11-02 13:07:38.473  9715-9802  K3fAApi                 com.gaon.kakaomaptest                V  + e s(2.6.0, ae903e05, 6d1812236 1.326694, com.gaon.kakaomaptest)
2023-11-02 13:07:38.474  9715-9802  K3fCore                 com.gaon.kakaomaptest                I  DB multithreading mode set to SQLITE_CONFIG_SINGLETHREAD
2023-11-02 13:07:38.479  9715-9802  K3fCore                 com.gaon.kakaomaptest                I  DiskCache initialized
2023-11-02 13:07:38.479  9715-9802  K3fCore                 com.gaon.kakaomaptest                I  DownloadManager initialized
2023-11-02 13:07:38.501  9715-9802  K3fCore                 com.gaon.kakaomaptest                I  >>> Initialize appEngine[RELEASE]{1698898058}
2023-11-02 13:07:38.506  9715-9802  K3fCore                 com.gaon.kakaomaptest                I  >>> Start appEngine[RELEASE]{1698898058}
2023-11-02 13:07:38.507  9715-9802  K3fCore                 com.gaon.kakaomaptest                I  android high
2023-11-02 13:07:38.510  9715-9802  K3fCore                 com.gaon.kakaomaptest                I  DiskCache initialized
2023-11-02 13:07:38.512  9715-9802  K3fCore                 com.gaon.kakaomaptest                I  DownloadManager initialized
2023-11-02 13:07:38.512  9715-9802  K3fCore                 com.gaon.kakaomaptest                I  start to make a map view
2023-11-02 13:07:38.615  9715-9803  K3fAApi                 com.gaon.kakaomaptest                V  <-- {null=[HTTP/1.1 200 OK], Connection=[keep-alive], Content-Length=[0], Date=[Thu, 02 Nov 2023 04:07:38 GMT], X-Android-Received-Millis=[1698898058613], X-Android-Response-Source=[NETWORK 200], X-Android-Selected-Protocol=[http/1.1], X-Android-Sent-Millis=[1698898058587], X-Request-Id=[5c839960-7935-11ee-9f8c-6f6805fe3c7a]}
2023-11-02 13:07:38.662  9715-9802  K3fCore                 com.gaon.kakaomaptest                I  onRenderViewSuccess
2023-11-02 13:07:38.668  9715-9802  K3fAApi                 com.gaon.kakaomaptest                V  + e c (1080, 741, openmap)
2023-11-02 13:07:38.668  9715-9802  K3fCore                 com.gaon.kakaomaptest                I  Engine{1698898058} resumed.
2023-11-02 13:07:38.669  9715-9802  K3fAApi                 com.gaon.kakaomaptest                V  - allViewport(1080, 741)
2023-11-02 13:07:38.669  9715-9802  K3fCore                 com.gaon.kakaomaptest                E  unsupported image format.
2023-11-02 13:07:40.141  9715-9802  K3fCore                 com.gaon.kakaomaptest                I  Engine{1698898058} paused
2023-11-02 13:07:40.626  9715-9802  K3fCore                 com.gaon.kakaomaptest                I  Engine{1698898058} resumed.
2023-11-02 13:07:40.627  9715-9802  K3fAApi                 com.gaon.kakaomaptest                V  - allViewport(1080, 741)
2023-11-02 13:07:40.641  9715-9802  K3fCore                 com.gaon.kakaomaptest                I  Engine{1698898058} paused
2023-11-02 13:07:40.642  9715-9802  K3fCore                 com.gaon.kakaomaptest                I  Engine{1698898058} resumed.
2023-11-02 13:07:40.642  9715-9802  K3fAApi                 com.gaon.kakaomaptest                V  - allViewport(1080, 741)

추가로 위 로그 발생 후 뒤로가기 등 상호작용을 시도하면

2023-11-02 13:08:56.008  9715-9722  on.kakaomaptest         com.gaon.kakaomaptest                I  Thread[5,tid=9722,WaitingInMainSignalCatcherLoop,Thread*=0xb4000076f6b1db20,peer=0x13600260,"Signal Catcher"]: reacting to signal 3
2023-11-02 13:08:56.008  9715-9722  on.kakaomaptest         com.gaon.kakaomaptest                I  
2023-11-02 13:08:56.175  9715-9722  on.kakaomaptest         com.gaon.kakaomaptest                I  Wrote stack traces to tombstoned
2023-11-02 13:08:59.772  2403-9913  ActivityManager         system_server                        E  ANR in com.gaon.kakaomaptest (com.gaon.kakaomaptest/.MainActivity)
                                                                                                    PID: 9715
                                                                                                    Reason: Input dispatching timed out (Application does not have a focused window)

위와 같은 에러가 발생합니다.

kakaomaptest.zip (4.1 MB)

버그 재현 프로젝트도 함께 첨부드립니다!

상세한 답변 감사합니다. 올려주신 프로젝트를 보니 코루틴이 사용 된 부분이 있는데, 혹시 코루틴 없이 text.visibility = View.GONE 만 실행 했을 경우에도 ANR 이 발생하나요?

아니요! 코루틴 사용 없이 가시성을 변경하면 오류가 나타나지 않네요. 추가로 스레드를 사용해서도 아래 코드처럼 테스트를 해보았는데요,

  val handler = Handler(Looper.getMainLooper())
  val runnable = Runnable {
      Log.w("k3f", "view gone")
      text.visibility = View.GONE
  }

  handler.postDelayed(runnable, 80)

  mapView.start(
      object : MapLifeCycleCallback() {
          override fun onMapDestroy() = Unit
          override fun onMapError(error: Exception?) = Unit
      },
      object : KakaoMapReadyCallback() {
          override fun onMapReady(kakaoMap: KakaoMap) = Unit
      }
  )

코루틴과 동일하게 ANR 오류가 발생합니다.
아무래도 동시성으로 인해 어떠한 부분에서 오류가 발생하지 않나 싶네요. :cry:

확인 감사합니다. 동시성 뿐만 아니라 코루틴이나 쓰레드를 사용하더라도 View.GONE 대신 View.INVISIBLE 일 때는 ANR 이 발생하지 않는 등 일반적인 ANR 원인과는 좀 다른 부분이 있습니다. ANR 이 발생하지 않도록 우회하거나 방법을 찾아서 다음 버전에 배포하고 코멘트 드리도록 하겠습니다.

네~ 확인 감사드립니다 :smiley:

1개의 좋아요

답변이 늦었습니다. 위의 이슈는 2.9.2 버전에서 문제가 해결됐습니다.

1개의 좋아요