5

Mam aktywną aplikację w Google Play Store. Od kilku miesięcy otrzymuję wiele dziwnych raportów o awariach w konsoli Play.Wiele OutOfMemoryError z urządzeń Samsung Galaxy na Androida 7.x

Ponieważ nie mogę tu wkleić wszystkich danych (istnieje wiele raportów o awariach) Próbuję pokazać dobre podsumowanie. Szczegółowe informacje na życzenie.

urządzenia największym stopniu dotkniętych:

  • Samsung Galaxy A5 2016 (a5xelte)
  • Samsung Galaxy S5 (klte)
  • Samsung Galaxy A5 (2017) (a5y17lte)
  • Samsung Galaxy Uwaga 3 (hlte)
  • Samsung Galaxy S5 Neo (s5neolte)
  • Samsung Galaxy S6 (zeroflte)

ND: Pierwsze urządzenie jest bardzo krytyczny w stosunku do innych

Rodzaje wypadków:

  • java.lang.RuntimeException w android.app.ActivityThread.performLaunchActivity
  • java.lang.OutOfMemoryError w java.lang.StringFactory.newStringFromBytes
  • java.lang.OutOfMemoryError w libcore.util.CharsetUtils.toUtf8Bytes
  • java.lang.OutOfMemoryError w java.lang.StringFactory.newStringFromChars
  • java.lang.OutOfMemoryError w java.lang.StringBuilder.toString
  • java.lang.OutOfMemoryError w java.lang.StringFactory.newStringFromChars

Android wersjach: 7.0, 7.1 i 6.0 rzadko

Nie wiem, dlaczego tak się dzieje na tych urządzeniach, nie wiem jak debuguj te raporty i nie znalazłem nic podobnego na StackOverflow ani żadnych innych źródłach. Jakaś pomoc?


EDIT, niektóre stacktraces:

Galaxy A5 (2016) (a5xelte) 2048MB RAM, Android 7,0

java.lang.RuntimeException: 
    at android.app.ActivityThread.performLaunchActivity (ActivityThread.java:2984) 
    at android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:3045) 
    at android.app.ActivityThread.-wrap14 (ActivityThread.java) 
    at android.app.ActivityThread$H.handleMessage (ActivityThread.java:1642) 
    at android.os.Handler.dispatchMessage (Handler.java:102) 
    at android.os.Looper.loop (Looper.java:154) 
    at android.app.ActivityThread.main (ActivityThread.java:6776) 
    at java.lang.reflect.Method.invoke (Method.java) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run (ZygoteInit.java:1496) 
    at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1386) 

Galaxy S6 krawędź (zerolte) 3072MB RAM , Android 7.0

java.lang.OutOfMemoryError: 
    at java.lang.StringFactory.newStringFromBytes (StringFactory.java:185) 
    at java.lang.StringFactory.newStringFromBytes (StringFactory.java:63) 
    at android.util.Base64.encodeToString (Base64.java:456) 
    at org.chromium.android_webview.AwContents.loadDataWithBaseURL (AwContents.java:428) 
    at com.android.webview.chromium.WebViewChromium.loadDataWithBaseURL (WebViewChromium.java:188) 
    at android.webkit.WebView.loadDataWithBaseURL (WebView.java:1015) 
    at com.google.android.gms.ads.internal.webview.p.loadDataWithBaseURL (p.java:131) 
    at com.google.android.gms.ads.internal.webview.o.loadDataWithBaseURL (o.java:104) 
    at com.google.android.gms.ads.internal.renderer.i.a (i.java:8) 
    at com.google.android.gms.ads.internal.renderer.a.c (a.java:35) 
    at com.google.android.gms.ads.internal.renderer.g.a (g.java:11) 
    at com.google.android.gms.ads.internal.zzk.run (zzk.java:28) 
    at android.os.Handler.handleCallback (Handler.java:751) 
    at android.os.Handler.dispatchMessage (Handler.java:95) 
    at android.os.Looper.loop (Looper.java:154) 
    at android.app.ActivityThread.main (ActivityThread.java:6682) 
    at java.lang.reflect.Method.invoke (Method.java) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run (ZygoteInit.java:1520) 
    at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1410) 

Samsung Galaxy A5 (2016) (a5xelte), 2048MB RAM, Android 7,0

java.lang.OutOfMemoryError: 
    at libcore.util.CharsetUtils.toUtf8Bytes (CharsetUtils.java) 
    at java.lang.String.getBytes (String.java:879) 
    at java.lang.String.getBytes (String.java:851) 
    at org.chromium.android_webview.AwContents.loadDataWithBaseURL (AwContents.java:428) 
    at com.android.webview.chromium.WebViewChromium.loadDataWithBaseURL (WebViewChromium.java:188) 
    at android.webkit.WebView.loadDataWithBaseURL (WebView.java:1015) 
    at com.google.android.gms.ads.internal.webview.p.loadDataWithBaseURL (p.java:131) 
    at com.google.android.gms.ads.internal.webview.o.loadDataWithBaseURL (o.java:104) 
    at com.google.android.gms.ads.internal.renderer.i.a (i.java:8) 
    at com.google.android.gms.ads.internal.renderer.a.c (a.java:35) 
    at com.google.android.gms.ads.internal.renderer.g.a (g.java:11) 
    at com.google.android.gms.ads.internal.zzk.run (zzk.java:28) 
    at android.os.Handler.handleCallback (Handler.java:751) 
    at android.os.Handler.dispatchMessage (Handler.java:95) 
    at android.os.Looper.loop (Looper.java:154) 
    at android.app.ActivityThread.main (ActivityThread.java:6776) 
    at java.lang.reflect.Method.invoke (Method.java) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run (ZygoteInit.java:1496) 
    at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1386) 

EDIT 2: zaktualizowałem zależnościami firebase-ads ale mam wciąż te same awarie.Plus, miałem nowy rodzaj awarii w tej wersji:

Samsung Galaxy A5 (2016) (a5xelte), 2048MB RAM, Android 7,0

java.lang.InternalError: 
    at java.lang.Thread.nativeCreate (Thread.java) 
    at java.lang.Thread.start (Thread.java:731) 
    at java.util.concurrent.ThreadPoolExecutor.addWorker (ThreadPoolExecutor.java:941) 
    at java.util.concurrent.ThreadPoolExecutor.processWorkerExit (ThreadPoolExecutor.java:1009) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1151) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run (ThreadPoolExecutor.java:607) 
    at java.lang.Thread.run (Thread.java:762) 
+1

proszę pisać kompletne rzeczywiste ślady stosu, a nie tylko komunikaty o błędach. – CommonsWare

+0

Edytowane ze śladami stosu – AndroidGuy

+1

Te dwa ostatnie pochodzą z kodu reklam Usług Play. Upewnij się, że masz najnowszą wersję swojej biblioteki. – CommonsWare

Odpowiedz

3

nie chciałem rozwiązać w ten sposób, ale to wydaje być rozwiązany poprzez dodanie

largeHeap="true" 

na mój manifest.

Co rozumiem: pamięć urządzeń Samsung Galaxy jest słabo zoptymalizowana przez Samsunga (Galaxy A5 2016 ma 2 GB pamięci RAM, to więcej niż wystarcza, ale w Firebase widzę OOM z powodu bardzo małej sterty). Postanowiłem więc załatwić wszystko raz na zawsze i ustawić TrueHeap w prawdę. Nie jestem dumny z tego wyboru, ale wydawało się, że to jedyne możliwe rozwiązanie.

Wynik: wszystkie Ooms wydaje być usunięte, na razie

+0

Czy ta pomoc została wyświetlona z pierwszym wyświetlonym błędem? RuntimeException w android.app.ActivityThread.performLaunchActivity (ActivityThread.java: 2984) (Samsung Galaxy A5) – OferR

+0

@OferR powinieneś opublikować pełny ślad stosu – AndroidGuy

+0

Moje pytanie brzmi, czy to rozwiązanie pomogło ci z problemem * ty * miałeś, jak wymieniono w * twoim * pytaniu. Pierwszy ślad stosu, który wymieniono na liście. Czy te błędy zniknęły po zastosowaniu metody largeHeap = "true"? (Problem, który wymieniono na liście i odnoszę się do niego, jest pierwszy: pokazuje RuntimeException w android.app.ActivityThread.performLaunchActivity, gdzie pozostałe ślady stosu pokazują OutOfMemoryError) ... Dzięki ... – OferR

2

Spójrzmy na ostatni ślad stosu, w segmentach :

java.lang.OutOfMemoryError: 
    at libcore.util.CharsetUtils.toUtf8Bytes (CharsetUtils.java) 
    at java.lang.String.getBytes (String.java:879) 
    at java.lang.String.getBytes (String.java:851) 

więc specyficzna sprawa, że ​​wysadzili zostało przekształcenie String do byte[]. Albo masz bardzo mało miejsca na sterty, albo jest to raczej duży ciąg.

at org.chromium.android_webview.AwContents.loadDataWithBaseURL (AwContents.java:428) 
    at com.android.webview.chromium.WebViewChromium.loadDataWithBaseURL (WebViewChromium.java:188) 
    at android.webkit.WebView.loadDataWithBaseURL (WebView.java:1015) 

Tak, tutaj widzimy, że coś z String jest WebView poprzez loadDataWithBaseURL(). Sugeruje to, że coś nazywa się loadDataWithBaseURL() z dość dużym adresem URL. Adres URL byłby jedną z możliwości.

at com.google.android.gms.ads.internal.webview.p.loadDataWithBaseURL (p.java:131) 
    at com.google.android.gms.ads.internal.webview.o.loadDataWithBaseURL (o.java:104) 
    at com.google.android.gms.ads.internal.renderer.i.a (i.java:8) 
    at com.google.android.gms.ads.internal.renderer.a.c (a.java:35) 
    at com.google.android.gms.ads.internal.renderer.g.a (g.java:11) 
    at com.google.android.gms.ads.internal.zzk.run (zzk.java:28) 

Tutaj mamy sześć linii, które wszystkie pochodzą z tego samego pakietu Java. com.google.android.gms to pakiet najwyższego poziomu dla większości Usług Play, więc jest prawdopodobnie jedną z ich bibliotek reklamowych. Nie korzystam z wielu usług Play, więc nie jestem ekspertem od tego, jakie dokładnie marki sieci reklamowych mają nadal i które z nich są powiązane z com.google.android.gms.ads.

Sprawdź więc swoje biblioteki sieciowe reklam i upewnij się, że korzystasz z najnowszej i największej wersji, którą możesz obsługiwać. Przy odrobinie szczęścia jest to błąd, który naprawili w swojej bibliotece gdzieś po drodze.

+0

Dzięki za wskazanie mi tego. Używałem starej wersji zarówno w "firebase-core', jak i' firebase-ads'. Mam nadzieję, że najnowsza wersja naprawi wszystkie problemy z urządzeniami galaktyki (nawet ten anonimowy wyjątek RuntimeException na performLaunchActivity).Fingers crossed :) – AndroidGuy

+1

@AndroidGuy: Dla tego pierwszego śledzenia stosu, jeśli nie ma w nim nic więcej, nic nie można z tym zrobić. Nie ma charakterystycznych cech wskazujących na twój kod lub bibliotekę. A jeśli to wszystko, co dostajesz, rozważ użycie czegoś innego w celu uzyskania logów awarii. Zwykle te ślady stosu zawierają wiele zwrotek ('RuntimeException' i pęczek linii, po których następuje' Caused by' oraz inny wyjątek i pęczek linii). Twój prawdziwy problem może zostać zgłoszony w późniejszej zwrotce, ale jeśli nie masz tej części śladu stosu, nie masz szczęścia. – CommonsWare

+0

To jest problem. Ale zauważyłem, że wszystkie awarie, takie jak te na pierwszym śladzie stosu pochodzą z urządzeń Galaxy na Androida 7.0. To sprawia, że ​​myślę, że jest ona powiązana z problemem w bibliotece 'firebase-ads' lub' 'firebase-core' (oba miały taki sam stary numer wersji). Wydałem aktualizację z dwoma bibliotekami na bieżąco. Jeśli to nie zadziała, umieściłem 'firebase-crash' w zależnościach, umożliwi to zgłaszanie awarii do konsoli firebase i mam nadzieję, że pomoże mi to w dokładniejszym śledzeniu stosu. – AndroidGuy