안녕하세요.
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입니다.
[재현 방법]
- 앱을 완전히 종료한 뒤 다시 실행합니다.
- 경로 안내 또는 모의주행을 시작합니다.
- KNMapView를 2D TOP View로 표시합니다.
- 안내 위치에 따라 FOLLOW 카메라와 userLocation을 계속 이동시킵니다.
- 약 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에서도 위 현상이 재현됩니다.
[문의 사항]
-
KNMapView에서 카메라가 계속 이동할 때 지도 타일, 텍스처 또는 렌더링 리소스가 누적되는 알려진 문제가 있는지 궁금합니다.
-
1.12.8-hotfix02 이후 이 문제를 추가로 수정한 SDK 또는 패치 버전이 있는지 궁금합니다.
-
주행과 KNMapView를 유지하면서 Graphics 리소스나 지도 캐시를 정리할 수 있는 공식 API가 있나요?
KNSDK 전체 종료나 MapView 제거가 아닌, 개별 MapView 단위의 trim/release 방법이 필요합니다. -
저사양 단말에서 사용할 수 있는 공식 설정이 있나요?
예:- 지도 타일/텍스처 캐시 제한
- 렌더링 품질 또는 해상도 조절
- GLES 버전 선택
- 프레임 레이트 제한
- onTrimMemory 발생 시 호출해야 하는 SDK API
-
원인 확인을 위해 필요한 추가 로그, bugreport, dumpsys meminfo 또는 최소 재현 프로젝트가 있다면 제공하겠습니다.
민감 정보가 포함될 수 있는 전체 로그의 별도 전달 경로도 알려주시면 감사하겠습니다.