mapbox / mapbox/mapbox-navigation-android
OOM exception building really long routes
Dieses Issue hat noch niemand übernommen.
- Vorherrschende Sprache
- Kotlin
- Sterne
- 651
- Forks
- 321
- PR-Merge-Kennzahlen
- Keine gemergten PRs in 30 T.
Beschreibung
**Android API:any
**Mapbox Navigation SDK version:1.4.0
Steps to trigger behavior
- Build long route (thousand of kimoleters)
- App crashes randomly, depending on memory of the device.
Crash happens within DirectionsJsonObject at GSON serialization with the following stacktrace :
E/AndroidRuntime(11384): java.lang.OutOfMemoryError: Failed to allocate a 3690812 byte allocation with 2202366 free bytes and 2MB until OOM
E/AndroidRuntime(11384): at java.lang.String.<init>(String.java:400)
E/AndroidRuntime(11384): at java.lang.AbstractStringBuilder.toString(AbstractStringBuilder.java:633)
E/AndroidRuntime(11384): at java.lang.StringBuffer.toString(StringBuffer.java:723)
E/AndroidRuntime(11384): at java.io.StringWriter.toString(StringWriter.java:100)
E/AndroidRuntime(11384): at com.google.gson.Gson.toJson(Gson.java:639)
E/AndroidRuntime(11384): at com.google.gson.Gson.toJson(Gson.java:618)
E/AndroidRuntime(11384): at com.mapbox.api.directions.v5.models.DirectionsJsonObject.toJson(DirectionsJsonObject.java:30)
E/AndroidRuntime(11384): at com.mapbox.navigation.navigator.internal.MapboxNativeNavigatorImpl$setRoute$2.invokeSuspend(MapboxNativeNavigatorImpl.kt:150)
E/AndroidRuntime(11384): at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
E/AndroidRuntime(11384): at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:106)
E/AndroidRuntime(11384): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
E/AndroidRuntime(11384): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
E/AndroidRuntime(11384): at java.lang.Thread.run(Thread.java:818)
From my analysis reason is that nav native implementation accepts route as a single string thus fails if string becomes really large.
While possible solutions are to pass some Json/Route object entity instead of string, temporary workaround returning some error instead of throwing an exception from background thread would also be nice.
cc @mapbox/navigation-android @mskurydin
Beitragsleitfaden
Erste Schritte
- Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
- Schreib ins Issue, dass du es übernimmst — das erspart doppelte Arbeit.
- Forke das Repository und arbeite in einem Branch.
- Öffne einen Pull Request, der die Issue-Nummer nennt.
Rechercherichtung
Beginne mit services-directions-models/src/main/java/com/mapbox/api/directions/v5/models/DirectionsJsonObject.java und dessen toJson-Aufruf und verfolge dann MapboxNativeNavigatorImpl$setRoute$2 in Zeile 150. Reproduziere das Problem mit einer Route, die Tausende von Kilometern lang ist, und untersuche, wie die Route als einzelner String übergeben wird; die Änderung sollte den OutOfMemoryError im Hintergrundthread verhindern oder stattdessen einen Fehler zurückgeben.
Vom Indexierungsmodell aus dem Issue-Text verfasst.
Bewertung
- Tech-Stack
- android, kotlin
- Bereich
- mobile-dev
- Issue-Typ
- Bug
- Schwierigkeit
- 4/5
- Geschätzter Aufwand
- 3-5 Tage
- Aktivitätsstatus
- Veraltet
- Klarheit
- Größtenteils klar
- Anfängerfreundlichkeit
- 35/100