[Android KNSDK 1.12.8-hotfix02] Galaxy A시리즈에서 2D KNMapView Graphics 메모리 급증 후 LOW_MEMORY 종료

안녕하세요.

Android 카카오내비 길찾기 SDK로 자체 내비게이션 UI를 구성하고 있습니다.
저사양 단말에서 KNMapView 주행 화면을 표시하면 Graphics 메모리가 매우 빠르게 증가하고,
약 1~2분 내 Android Low Memory Killer에 의해 앱 프로세스가 종료되는 현상이 있어 문의드립니다.

A31, A32 같은 gpu 낮은 저사양 기기에서 발생중입니다. 그외 기기는 전혀 문제가 없습니다.

[사용 환경]

  • 디벨로퍼스 앱 ID: 1450551
  • SDK: com.kakaomobility.knsdk:knsdk_ui:1.12.8-hotfix02
  • 앱 버전: 3.0.3 (versionCode 181)
  • 단말: Samsung Galaxy A31 / SM-A315N
  • Android: 12 / API 31
  • 단말 RAM: 약 3,667 MB
  • ActivityManager memoryClass: 256 MB
  • largeMemoryClass: 512 MB
  • isLowRamDevice: false
  • 지도 크기: 약 1988 × 1080
  • KNTrip, KNGuidance, KNMapView를 이용한 자체 내비 UI
  • KNSDK.bindingMapView()로 KNMapView를 바인딩해서 사용
  • 재현 화면은 3D/Bird View가 아니라 tilt 0도의 2D TOP View입니다.

[재현 방법]

  1. 앱을 완전히 종료한 뒤 다시 실행합니다.
  2. 경로 안내 또는 모의주행을 시작합니다.
  3. KNMapView를 2D TOP View로 표시합니다.
  4. 안내 위치에 따라 FOLLOW 카메라와 userLocation을 계속 이동시킵니다.
  5. 약 1~2분 후 앱이 별도 Java Exception이나 ANR 없이 종료됩니다.

문제가 발생하는 동안 KNMapView를 다시 생성하거나 bindingMapView()를 반복 호출하지 않습니다.
아래 측정 구간에서도 viewHash와 controlManagerHash가 동일해 하나의 KNMapView 세션이 유지되고 있었습니다.

[메모리 측정 결과]

지도 Scene 시작 후 약 29초:

  • totalPss: 474,953 KB
  • graphics: 132,265 KB
  • Java heap: 45,368 KB

약 59초:

  • totalPss: 1,077,915 KB
  • graphics: 714,397 KB
  • Java heap: 36,356 KB

약 89초:

  • totalPss: 1,675,915 KB
  • graphics: 1,257,889 KB
  • Java heap: 35,304 KB

Graphics 메모리만 30초 동안 약 582 MB, 다음 30초 동안 약 543 MB 증가했습니다.
반면 Java heap은 약 35~45 MB로 유지됩니다.

Android ApplicationExitInfo에서도 다음 종료가 기록됐습니다.

  • reason: 3 (LOW_MEMORY)
  • importance: 100
  • lastSampledPss: 1,878,013 KB
  • diagnosis: Android low-memory killer terminated the app

동일 단말에서 LOW_MEMORY 종료가 여러 차례 기록됐습니다.
KNMapView를 화면에서 제거하면 Graphics 메모리는 감소하지만,
내비게이션이 앱의 주요 기능이기 때문에 주행 중 MapView를 제거하는 방식은 사용할 수 없습니다.

1.12.8 릴리스 노트에 다음 개선 내용이 기재되어 있는 것도 확인했습니다.

  • 렌더링 리소스 할당 시 메모리 스파이크 방어
  • 저사양 단말 메모리 절감
  • 지도 성능 개선

하지만 1.12.8-hotfix02에서도 위 현상이 재현됩니다.

[문의 사항]

  1. KNMapView에서 카메라가 계속 이동할 때 지도 타일, 텍스처 또는 렌더링 리소스가 누적되는 알려진 문제가 있는지 궁금합니다.

  2. 1.12.8-hotfix02 이후 이 문제를 추가로 수정한 SDK 또는 패치 버전이 있는지 궁금합니다.

  3. 주행과 KNMapView를 유지하면서 Graphics 리소스나 지도 캐시를 정리할 수 있는 공식 API가 있나요?
    KNSDK 전체 종료나 MapView 제거가 아닌, 개별 MapView 단위의 trim/release 방법이 필요합니다.

  4. 저사양 단말에서 사용할 수 있는 공식 설정이 있나요?
    예:

    • 지도 타일/텍스처 캐시 제한
    • 렌더링 품질 또는 해상도 조절
    • GLES 버전 선택
    • 프레임 레이트 제한
    • onTrimMemory 발생 시 호출해야 하는 SDK API
  5. 원인 확인을 위해 필요한 추가 로그, bugreport, dumpsys meminfo 또는 최소 재현 프로젝트가 있다면 제공하겠습니다.
    민감 정보가 포함될 수 있는 전체 로그의 별도 전달 경로도 알려주시면 감사하겠습니다.

이정도의 대규모 메모리 할당 이슈는 안티엘리어싱을 위한 FXAA에서 사용되는 FBO가 의심됩니다.
혹시 관련되어 덤프정보, 로그데이터를 전달해주실수 있으실까요?

그걸 볼수있는 정보인지는 모르겠습니다.
일단 내비를 켜고 나면 메모리가 어떻게 증가하는지만 메모리 체크만하였습니다.

pasted-text.txt (49.3 KB)

안드로이드 스튜디오에서 프로파일러를 통해 메모리 덤프가 가능합니다.

메모리 측정

위 가이드대로 가능하시다면 해당 툴로 측정 후 hprof파일을 첨부해주시면 원인 파악하는데 도움이 될거 같습니다.

a31 기기가 없어서 실유저 데이터로 받을수있는것만 받아서 관련 이슈가 있었는지 해결 방법은 있는지 알고 싶었던것입니다.

a31,a32 같은 기기외에는 안정적입니다. gpu 저사양 기기에서만 메모리가 확늘었고 폰에서 앱을 종료 시키는 상황이라고 합니다.

갤럭시노트10 같은 기기에서도 정상작동합니다.

현재 첨부해주신 로그상으로는 surfaceView가 아주 잦은 간격으로 갱신되는것으로 확인됩니다.
77.6s kakao_map_start 1862x1080
100.9s mode_changed 1988x1080
116.9s kakao_map_start 1862x1080
117.5s bind_callback 1988x1080 ← 0.4초 만에 변경
303.8s kakao_map_start 1988x1080
304.4s bind_callback 1862x1080 ← 다시 변경

334.1s memory_sample 1988x1080

지도를 올리는 컨테이너를 고정 크기로 지정해주시고 뷰레이아웃의 갱신이 생기지 않도록 변경해주시면 좋을듯 합니다.
→ React.memo + collapsable = false 등의 수시 갱신 방지.
이슈의 검증은 mapView.holder.setFixedSize(device w, h) 을 통해 메모리의 증가현상이 지속적으로 발생되는지 체크 가능 하실듯합니다.

네 사이즈를 최대한 바꾸지 않도록 한번 적용해보겠습니다.

다만 사이즈 변경으로 인해서 팅겼다기 보다 2~3분뒤에 운행중에 메모리가 증폭되는 이슈라 이게 맞는 방식인지는 모르겠네요
→ React.memo + collapsable = false 등의 수시 갱신 방지.
이건 이미 되어있습니다.