Api 28 미만 지도가 로드되지 않는 문제

안녕하세요. 버그인지는 모르겠지만 혼자 해결이 안돼서 질문드립니다.

현재 앱은 Flutter의 PlatformView를 이용해서 android, ios 각각 네이티브로 카카오 지도가 구현되어있는 상황입니다.
원래는 잘 동작하다가 어느 시점부터 안드로이드 api 28 미만에서 앱을 실행하면 지도가 제대로 나오지 않는 문제가 나타납니다.
아래는 api 28 미만에서 실행했을때 출력되는 로그입니다.

2024-09-16 23:48:35.936 14838-14843 zygote64 I Do partial code cache collection, code=61KB, data=50KB
2024-09-16 23:48:35.936 14838-14843 zygote64 I After code cache collection, code=61KB, data=50KB
2024-09-16 23:48:35.936 14838-14843 zygote64 I Increasing code cache capacity to 256KB
2024-09-16 23:48:36.017 14838-14905 K3fAApi W EngineHandler stop return. appEngineHandle = 0
2024-09-16 23:48:36.017 14838-14838 PlatformViewsController I Hosting view in a virtual display for platform view: 0
2024-09-16 23:48:36.017 14838-14838 PlatformViewsController I PlatformView is using SurfaceTexture backend
2024-09-16 23:48:36.023 14838-14906 NetworkSecurityConfig D No Network Security Config specified, using platform default
2024-09-16 23:48:36.024 14838-14906 K3fAApi D —> RequestHeader(https://dapi.kakao.com/v2/maps/vector/auth) {Accept=[application/json], Authorization=[KakaoAK {{key 출력되는 자리}}], KA=[sdk/8.0.0 mapSdk/2.9.5 os/android-26 lang/en-US device/Android SDK built for arm64 origin/s2wnvBgPpJctThpWlNM8vlpLGiw= android_pkg/{{package 출력되는 자리}}]}
2024-09-16 23:48:36.025 14838-14908 K3fAApi D —> RequestHeader(https://dapi.kakao.com/v2/maps/vector/auth) {Accept=[application/json], Authorization=[KakaoAK {{key 출력되는 자리}}], KA=[sdk/8.0.0 mapSdk/2.9.5 os/android-26 lang/en-US device/Android SDK built for arm64 origin/s2wnvBgPpJctThpWlNM8vlpLGiw= android_pkg/{{package 출력되는 자리}}]}
2024-09-16 23:48:36.033 14838-14907 K3fAApi W EngineHandler stop return. appEngineHandle = 0
2024-09-16 23:48:36.034 14838-14838 PlatformViewsController W Unexpected platform view context for view ID 0; some functionality may not work correctly. When constructing a platform view in the factory, ensure that the view returned from PlatformViewFactory#create returns the provided context from getContext(). If you are unable to associate the view with that context, consider using Hybrid Composition instead.
2024-09-16 23:48:36.034 14838-14913 K3fAApi D —> RequestHeader(https://dapi.kakao.com/v2/maps/vector/auth) {Accept=[application/json], Authorization=[KakaoAK {{key 출력되는 자리}}], KA=[sdk/8.0.0 mapSdk/2.9.5 os/android-26 lang/en-US device/Android SDK built for arm64 origin/s2wnvBgPpJctThpWlNM8vlpLGiw= android_pkg/{{package 출력되는 자리}}]}
2024-09-16 23:48:36.038 14838-14850 D HostConnection::get() New Host Connection established 0x7bc5231820, tid 14850
2024-09-16 23:48:36.046 14838-14911 D HostConnection::get() New Host Connection established 0x7ba9fafae0, tid 14911
2024-09-16 23:48:36.050 14838-14912 K3fAApi W EngineHandler stop return. appEngineHandle = 0
2024-09-16 23:48:36.051 14838-14916 K3fAApi D —> RequestHeader(https://dapi.kakao.com/v2/maps/vector/auth) {Accept=[application/json], Authorization=[KakaoAK {{key 출력되는 자리}}], KA=[sdk/8.0.0 mapSdk/2.9.5 os/android-26 lang/en-US device/Android SDK built for arm64 origin/s2wnvBgPpJctThpWlNM8vlpLGiw= android_pkg/{{package 출력되는 자리}}]}
2024-09-16 23:48:36.072 14838-14915 D HostConnection::get() New Host Connection established 0x7ba15e2060, tid 14915
2024-09-16 23:48:36.075 14838-14915 EGL_emulation D eglCreateContext: 0x7bb8c51600: maj 3 min 0 rcv 3
2024-09-16 23:48:36.078 14838-14915 EGL_emulation D eglMakeCurrent: 0x7bb8c51600: ver 3 0 (tinfo 0x7bb8d468a0)
2024-09-16 23:48:36.081 14838-14915 K3fAApi D AppSpec : High spec
2024-09-16 23:48:36.081 14838-14915 K3fCore I app diplay scale: 1.375000
2024-09-16 23:48:36.081 14838-14915 K3fAApi V + e s(2.9.5, f95e4aae, c908ed058 1.375000, c{{package 출력되는 자리}})
2024-09-16 23:48:36.083 14838-14915 DiskCache I DiskCache instance count : 1
2024-09-16 23:48:36.083 14838-14915 DiskCache I DB multithreading mode set to SQLITE_CONFIG_SINGLETHREAD
2024-09-16 23:48:36.089 14838-14878 EGL_emulation D eglMakeCurrent: 0x7bbb842aa0: ver 3 0 (tinfo 0x7bbb8c7da0)
2024-09-16 23:48:36.089 14838-14915 DiskCache I DiskCache db(/data/user/0/{{package 출력되는 자리}}/cache/vectormap/cache/db/cache.db) opened.
2024-09-16 23:48:36.090 14838-14915 DiskCache I Buffer initialize elapsed time : 0, buffer size : 0
2024-09-16 23:48:36.090 14838-14915 DiskCache I DiskCache initialized
2024-09-16 23:48:36.092 14838-14915 K3fCore I DownloadManager initialized
2024-09-16 23:48:36.137 14838-14915 K3fCore I >>> Initialize appEngine[RELEASE]{1726498116}
2024-09-16 23:48:36.145 14838-14915 K3fCore I >>> Start appEngine[RELEASE]{1726498116}
2024-09-16 23:48:36.145 14838-14915 K3fCore I android high
2024-09-16 23:48:36.149 14838-14915 DiskCache I DiskCache instance count : 2
2024-09-16 23:48:36.150 14838-14915 DiskCache I Buffer initialize elapsed time : 0, buffer size : 0
2024-09-16 23:48:36.150 14838-14915 DiskCache I DiskCache initialized
2024-09-16 23:48:36.150 14838-14915 K3fCore I DownloadManager initialized
2024-09-16 23:48:36.151 14838-14915 K3fCore I start to make a map view
2024-09-16 23:48:36.153 14838-14915 K3fAApi V + e c (1080, 1929, openmap)
2024-09-16 23:48:36.153 14838-14915 K3fCore I Engine{1726498116} resumed.
2024-09-16 23:48:36.154 14838-14915 K3fAApi V - allViewport(1080, 1929)
2024-09-16 23:48:36.161 14838-14916 K3fAApi V ← {null=[HTTP/1.1 200 OK], Connection=[keep-alive], Content-Length=[0], Date=[Mon, 16 Sep 2024 14:48:39 GMT], strict-transport-security=[max-age=31536000; includeSubDomains], X-Android-Received-Millis=[1726498116160], X-Android-Response-Source=[NETWORK 200], X-Android-Selected-Protocol=[http/1.1], X-Android-Sent-Millis=[1726498116129], X-Request-Id=[e19826fb454c5ec17efa4e59da61b789]}
2024-09-16 23:48:36.161 14838-14906 K3fAApi V ← {null=[HTTP/1.1 200 OK], Connection=[keep-alive], Content-Length=[0], Date=[Mon, 16 Sep 2024 14:48:39 GMT], strict-transport-security=[max-age=31536000; includeSubDomains], X-Android-Received-Millis=[1726498116160], X-Android-Response-Source=[NETWORK 200], X-Android-Selected-Protocol=[http/1.1], X-Android-Sent-Millis=[1726498116133], X-Request-Id=[44dc5fe1e286d8ba653be086c11dde96]}
2024-09-16 23:48:36.164 14838-14913 K3fAApi V ← {null=[HTTP/1.1 200 OK], Connection=[keep-alive], Content-Length=[0], Date=[Mon, 16 Sep 2024 14:48:39 GMT], strict-transport-security=[max-age=31536000; includeSubDomains], X-Android-Received-Millis=[1726498116164], X-Android-Response-Source=[NETWORK 200], X-Android-Selected-Protocol=[http/1.1], X-Android-Sent-Millis=[1726498116133], X-Request-Id=[160429e4501c100957ae01860a2493df]}
2024-09-16 23:48:36.168 14838-14908 K3fAApi V ← {null=[HTTP/1.1 200 OK], Connection=[keep-alive], Content-Length=[0], Date=[Mon, 16 Sep 2024 14:48:39 GMT], strict-transport-security=[max-age=31536000; includeSubDomains], X-Android-Received-Millis=[1726498116167], X-Android-Response-Source=[NETWORK 200], X-Android-Selected-Protocol=[http/1.1], X-Android-Sent-Millis=[1726498116135], X-Request-Id=[aec66df965ca9b3aa80e02abc7abbcea]}
2024-09-16 23:48:36.182 14838-14926 K3fCore I request time out
2024-09-16 23:48:36.201 14838-14915 K3fCore I onRenderViewFailure
2024-09-16 23:48:36.202 14838-14838 Map Callback D error RenderView Create Failure(map_b55c9a33-e3e4-46fa-b13c-cf3dd12c9fb5).
2024-09-16 23:48:36.202 14838-14838 System.err W com.kakao.vectormap.RenderViewException: RenderView Create Failure(map_b55c9a33-e3e4-46fa-b13c-cf3dd12c9fb5).
2024-09-16 23:48:36.202 14838-14838 System.err W at com.kakao.vectormap.internal.MapViewHolder.onRenderViewResult(MapViewHolder.java:97)
2024-09-16 23:48:36.202 14838-14838 System.err W at com.kakao.vectormap.internal.EngineHandler.render(Native Method)
2024-09-16 23:48:36.202 14838-14838 System.err W at com.kakao.vectormap.internal.EngineHandler.render(EngineHandler.java:140)
2024-09-16 23:48:36.202 14838-14838 System.err W at com.kakao.vectormap.internal.GLMapRenderer.onDrawFrame(GLMapRenderer.java:110)
2024-09-16 23:48:36.202 14838-14838 System.err W at com.kakao.vectormap.graphics.gl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1646)
2024-09-16 23:48:36.202 14838-14838 System.err W at com.kakao.vectormap.graphics.gl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1345)

카카오맵 sdk를 사용하기 위한 인터넷 권한, 아키텍쳐 조건 역시 문제없이 충족합니다.
테스트를 진행한 에뮬레이터는 다음과 같습니다.

api 26 에뮬레이터 정보
Properties
avd.ini.displayname Pixel 3a API 26
avd.ini.encoding UTF-8
AvdId Pixel_3a_API_26
disk.dataPartition.size 6442450944
fastboot.chosenSnapshotFile
fastboot.forceChosenSnapshotBoot no
fastboot.forceColdBoot no
fastboot.forceFastBoot yes
hw.accelerometer yes
hw.arc false
hw.audioInput yes
hw.battery yes
hw.camera.back virtualscene
hw.camera.front emulated
hw.cpu.ncore 4
hw.device.hash2 MD5:0e6953ebf01bdc6b33a2f54746629c50
hw.device.manufacturer Google
hw.device.name pixel_3a
hw.dPad no
hw.gps yes
hw.gpu.enabled yes
hw.gpu.mode auto
hw.initialOrientation Portrait
hw.keyboard yes
hw.lcd.density 440
hw.lcd.height 2220
hw.lcd.width 1080
hw.mainKeys no
hw.ramSize 1536
hw.sdCard yes
hw.sensors.orientation yes
hw.sensors.proximity yes
hw.trackBall no
image.androidVersion.api 26
image.sysdir.1 system-images/android-26/default/arm64-v8a/
PlayStore.enabled false
runtime.network.latency none
runtime.network.speed full
showDeviceFrame yes
skin.dynamic yes
tag.display Default Android System Image
tag.id default
vm.heapSize 228

api 28 에뮬레이터 정보
Properties
avd.ini.displayname Pixel 3a API 28
avd.ini.encoding UTF-8
AvdId Pixel_3a_API_28
disk.dataPartition.size 6442450944
fastboot.chosenSnapshotFile
fastboot.forceChosenSnapshotBoot no
fastboot.forceColdBoot yes
fastboot.forceFastBoot no
hw.accelerometer yes
hw.arc false
hw.audioInput yes
hw.battery yes
hw.camera.back virtualscene
hw.camera.front emulated
hw.cpu.ncore 4
hw.device.hash2 MD5:0e6953ebf01bdc6b33a2f54746629c50
hw.device.manufacturer Google
hw.device.name pixel_3a
hw.dPad no
hw.gps yes
hw.gpu.enabled yes
hw.gpu.mode auto
hw.initialOrientation portrait
hw.keyboard yes
hw.lcd.density 440
hw.lcd.height 2220
hw.lcd.width 1080
hw.mainKeys no
hw.ramSize 2048
hw.sdCard yes
hw.sensors.orientation yes
hw.sensors.proximity yes
hw.trackBall no
image.androidVersion.api 28
image.sysdir.1 system-images/android-28/google_apis_playstore/arm64-v8a/
PlayStore.enabled true
runtime.network.latency none
runtime.network.speed full
showDeviceFrame yes
skin.dynamic yes
tag.display Google ARM64-V8a Play
tag.displaynames Google ARM64-V8a Play
tag.id google_apis_playstore
tag.ids google_apis_playstore
vm.heapSize 256

올려주신 로그 정보를 보니, 지도자체는 request time out 네트워크(인터넷) 이슈로 실행이 안되고 있습니다.

인터넷이 잘 되는 실제 디바이스에서는 실행이 되는지, 테스트하셨던 api28 미만 에뮬레이터에서 네트워크에 다른 문제가 없는지 개발하시는 로컬 환경을 먼저 확인해 주시면 좋을 것 같습니다.

인터넷 문제는 아니라고 확신합니다.
앱에서 rest api 요청하는건 모두 정상적으로 들어오고 화면에 보여지고 있는데도 같은 오류로 지도가 보여지지 않습니다.

그리고 하나 더 이해가 되지 않는 부분이 있습니다. 로그상으로는 분명

← {null=[HTTP/1.1 200 OK], Connection=[keep-alive], Content-Length=[0], Date=[Mon, 16 Sep 2024 14:48:39 GMT], strict-transport-security=[max-age=31536000; includeSubDomains], X-Android-Received-Millis=[1726498116167], X-Android-Response-Source=[NETWORK 200], X-Android-Selected-Protocol=[http/1.1], X-Android-Sent-Millis=[1726498116135], X-Request-Id=[aec66df965ca9b3aa80e02abc7abbcea]}

라는 로그가 찍힙니다. 이 로그는 제가 이해한 바로는 MapAuthenticator에서 응답 코드가 200일때 찍히는 로그입니다. MapAuthHttpClient 코드를 뜯어보니 이는 지도 인증이 완료되었다는 뜻으로 이해됩니다. 근데 그 직후 0.02초만에 K3fCore I request time out 이라는 로그가 찍힙니다.

우선, 인터넷이 원할한 상태에서는 인증 connection 자체를 3번이나 시도하지 않습니다. 일반적으로 한번에 끝납니다.
K3fCore I request time out 는 인증과 별개로 비동기적으로 진행되는 지도 엔진의 리퀘스트이므로 0.02초만에 찍힐 수도 있고 그 전에 실행이 끝날 수도 있습니다.

어떤 이유에서든 현재 올려주신 로그와 정보만으로는 네트워크 이슈로 지도가 실행이 되지 않습니다.

  1. 추가적으로 궁금한 것은, 에뮬레이터가 아닌 인터넷이 정상 작동하는 실제 기기에서는 지도가 실행되시나요?

네 현재 내부테스터에 따르면 보이지 않는다고 합니다.

현재, 마켓에 나가있는 지도앱 뿐만 아니라 다른 데에서도 잘 실행되고 있기 때문에 해당 프로젝트를 살펴봐야 할 것 같습니다.

괜찮으시다면, 지도가 안나오는 부분에 대한 프로젝트를 공유해주실 수 있으실까요?
AndroidStudio 를 이용하신다면, File > Export > Export to Zip File... 메뉴를 통해 파일을 추출하시면 되십니다.

추가로, 현재 테스트해보니 Pixel 3a API 28 에뮬레이터에서 샘플 프로젝트 가 정상 동작하고 있습니다.