Много OutOfMemoryError от устройств Samsung Galaxy на Android 7.x

У меня есть активное приложение в Google Play Store. В течение нескольких месяцев я получаю много странных отчетов о сбоях в Play Console.

Поскольку я не могу вставить сюда все данные (есть МНОГО отчетов о сбоях), я пытаюсь показать хорошее резюме. Подробная информация по запросу.

Наиболее уязвимые устройства:

  • Samsung Galaxy A5 2016 (a5xelte)
  • Samsung Galaxy S5 (цветной)
  • Samsung Galaxy A5 (2017) (a5y17lte)
  • Samsung Galaxy Note3 (hte)
  • Samsung Galaxy S5 Neo (s5neolte)
  • Samsung Galaxy S6 (без файлов)

Н.Д.: Первое устройство очень критично по сравнению с остальными.

Типы сбоев:

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

Версии Android: 7.0, 7.1 и редко 6.0

Я не знаю, почему это происходит на этих устройствах, я не знаю, как отлаживать эти отчеты, и я не нашел ничего подобного в StackOverflow или каких-либо других источниках. Любая помощь?


ИЗМЕНИТЬ, некоторые трассировки стека:

Samsung Galaxy A5 (2016) (a5xelte), 2048 МБ ОЗУ, 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)

Samsung Galaxy S6 Edge (ноль), 3072 МБ ОЗУ, 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), 2048 МБ ОЗУ, 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: я обновил зависимости firebase-ads, но у меня все те же сбои. Плюс у меня появился новый тип краша в этой версии:

Samsung Galaxy A5 (2016 г.) (a5xelte), 2048 МБ ОЗУ, 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)

person Antonio Papalillo    schedule 08.08.2017    source источник
comment
Пожалуйста, публикуйте фактические полные трассировки стека, а не только сообщения об ошибках.   -  person CommonsWare    schedule 08.08.2017
comment
Отредактировано с некоторыми трассировками стека   -  person Antonio Papalillo    schedule 08.08.2017
comment
Последние два взяты из рекламного кода Play Services. Убедитесь, что вы используете последнюю версию их библиотеки.   -  person CommonsWare    schedule 08.08.2017
comment
Оказывается, я использую старую версию com.google.firebase:firebase-ads. Но как ты это предположил? Мне нужно знать для будущей отладки   -  person Antonio Papalillo    schedule 08.08.2017
comment
У меня также есть RuntimeExceptions на Android 7 и 7.1. Мы используем уведомления Firebase в нашем проекте.   -  person Rafael    schedule 10.08.2017
comment
об этой ошибке сообщалось в прошлом году. Admob просто предположил, что это проблема с реализацией пользователя, и закрыл вопрос. :( groups.google.com/forum/#! тема/google-admob-ads-sdk/   -  person Angel Koh    schedule 10.08.2017
comment
У меня к вам двоим два вопроса: 1) Использует ли ваше приложение небольшое количество ImageView? 2) у вас есть largeHeap="true" в вашем манифесте?   -  person Antonio Papalillo    schedule 10.08.2017


Ответы (2)


Я не хотел решать таким образом, но похоже это решается добавлением

largeHeap="true"

в мой манифест.

Что я выяснил: память устройств Samsung Galaxy плохо оптимизирована Samsung (у Galaxy A5 2016 года 2 ГБ ОЗУ. Этого более чем достаточно, но на Firebase я вижу OOM из-за очень маленькой кучи). Итак, я решил уладить все раз и навсегда и установил для largeHeap значение true. Я не горжусь этим выбором, но он казался единственно возможным.

Результат: все OOM, похоже, на данный момент исчезли.

person Antonio Papalillo    schedule 10.08.2017
comment
Помогло ли это с первой перечисленной ошибкой? RuntimeException в android.app.ActivityThread.performLaunchActivity (ActivityThread.java:2984) (Samsung Galaxy A5) - person OferR; 11.10.2017
comment
@OferR, вы должны опубликовать полную трассировку стека - person Antonio Papalillo; 11.10.2017
comment
Мой вопрос заключается в том, помогло ли это решение решить проблему, которая возникла у вас, как указано в вашем вопросе. Самая первая трассировка стека, которую вы указали. Эти ошибки исчезли после применения largeHeap=true? (Проблема, которую вы перечислили, и на которую я ссылаюсь, является первой. Она показывает RuntimeException в android.app.ActivityThread.performLaunchActivity, где остальные трассировки вашего стека показывают OutOfMemoryError)... Спасибо... - person OferR; 11.10.2017
comment
@OferR да, мне это действительно помогло. Но может быть и по-другому, так как RuntimeException не обязательно выбрасывается из-за маленькой кучи. Если у вас много похожих трассировок стека от устройств Samsung, вы можете попробовать установить largeHeap="true", и, возможно, это исправит. Если вы это сделаете, пожалуйста, зайдите сюда снова, чтобы сообщить другим пользователям, помогло ли это. - person Antonio Papalillo; 13.10.2017
comment
Спасибо. Я буду. У меня не так много таких ошибок, но это всегда устройства Samsung (включая S8) и всегда на PerformLaunchActivity. - person OferR; 15.10.2017

Давайте посмотрим на последнюю трассировку стека по сегментам:

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)

Итак, конкретная вещь, которая взорвалась, заключалась в преобразовании String в byte[]. Либо у вас очень мало места в куче, либо это довольно большая строка.

  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)

Итак, здесь мы видим, что вещь с String есть WebView через loadDataWithBaseURL(). Это говорит о том, что что-то вызывает loadDataWithBaseURL() с довольно большим URL-адресом. URL-адрес data: был бы одним из возможных вариантов.

  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)

Здесь у нас есть шесть строк, которые все взяты из одного и того же пакета Java. com.google.android.gms — это пакет верхнего уровня для большинства сервисов Play, поэтому com.google.android.gms.ads предположительно является одной из их рекламных библиотек. Я почти не пользуюсь сервисами Play, поэтому я не знаю, какие именно бренды рекламных сетей у них все еще есть и какие из них соответствуют com.google.android.gms.ads.

Итак, проверьте свои библиотеки рекламных сетей и убедитесь, что вы используете самые последние и лучшие из тех, которые вы можете поддерживать. К счастью, это ошибка, которую они исправили в своей библиотеке где-то в процессе.

person CommonsWare    schedule 08.08.2017
comment
Спасибо, что указали мне на это. Я использовал старую версию как на firebase-core, так и на firebase-ads. Я надеюсь, что последний выпуск исправит все проблемы с устройствами Galaxy (даже это анонимное исключение RuntimeException в PerformLaunchActivity). Скрещенные пальцы :) - person Antonio Papalillo; 08.08.2017
comment
@AndroidGuy: Для этой первой трассировки стека, если больше ничего не нужно, вы ничего не можете с этим поделать. Нет никаких идентифицирующих характеристик, указывающих на ваш код или библиотеку. И, если это все, что вы получаете, рассмотрите возможность использования чего-то еще для получения журналов сбоев. Обычно эти трассировки стека состоят из нескольких строф (RuntimeException и несколько строк, за которыми следует Caused by и еще одно исключение и несколько строк). Ваша реальная проблема может быть описана в более поздней строфе, но если у вас нет этой части трассировки стека, вам не повезло. - person CommonsWare; 08.08.2017
comment
Это проблема. Но я заметил, что все сбои, подобные тому, что в первой трассировке стека, происходят с устройств Galaxy на Android 7.0. Это заставляет меня думать, что это связано с проблемой в библиотеке firebase-ads или в firebase-core (они оба имели один и тот же старый номер версии). Я выпустил обновление с двумя обновленными библиотеками. Если это не сработает, я добавил firebase-crash к зависимостям, это позволит сообщать о сбоях в консоль Firebase, и я надеюсь, что это поможет мне с более точными трассировками стека. - person Antonio Papalillo; 08.08.2017
comment
К сожалению, кажется, что с последним обновлением ничего не было исправлено. Смотрите второе редактирование в основном посте. - person Antonio Papalillo; 09.08.2017
comment
@AndroidGuy: Без более подробной информации из ваших журналов сбоев будет трудно или невозможно определить источник такого сбоя. - person CommonsWare; 09.08.2017