Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

A lot of OutOfMemoryError from Samsung Galaxy devices on Android 7.x

I have an active app on Google Play Store. Since a few months I'm getting a lot of weird crash reports on Play Console.

Since I can't paste all the data here (there are A LOT of crash reports) I'm trying to show a good summary. Detailed info on request.

Mostly affected devices:

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

ND: The first device is very critical compared to the others

Types of crashes:

  • 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 versions: 7.0, 7.1 and rarely 6.0

I don't know why this is happening on these devices, I don't know how to debug these reports and I didn't find anything similar on StackOverflow or any other sources. Any help?


EDIT, some stacktraces:

Samsung 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)

Samsung Galaxy S6 Edge (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: I updated the dependencies of firebase-ads but I'm having still the same crashes. Plus, I had a new crash type in this version:

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)
like image 281
Antonio Papalillo Avatar asked Aug 08 '17 16:08

Antonio Papalillo


Video Answer


2 Answers

I didn't want to resolve this way, but it seems to be solved by adding

largeHeap="true"

into my Manifest.

What did I figure out: Samsung Galaxy devices' memory are poorly optimized by Samsung (the Galaxy A5 2016 has 2GB of RAM. That's more than enough, but on Firebase I can see OOMs because of very little heap). So, I decided to settle things once and for all and I set largeHeap to true. I'm not proud of this choice but it seemed the only viable.

Result: all of OOMs seems to be gone, for now

like image 200
Antonio Papalillo Avatar answered Oct 09 '22 11:10

Antonio Papalillo


Let's look at the last stack trace, in segments:

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)

So, the specific thing that blew up was converting a String to a byte[]. Either you are very short on heap space, or that's a rather big string.

  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)

So, here we see that the thing with the String is WebView, via loadDataWithBaseURL(). This suggests that something is calling loadDataWithBaseURL() with a rather big URL. A data: URL would be one possibility.

  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)

Here, we have six lines that all come from the same Java package. com.google.android.gms is the top-level package for much of Play Services, so com.google.android.gms.ads presumably is one of their ad libraries. I don't use much of Play Services, so I'm not expert on exactly what ad network brands they still have and which one(s) map to com.google.android.gms.ads.

So, check your ad network libraries and make sure that you are on the latest-and-greatest that you can support. With luck, this is a bug that they fixed in their library somewhere along the line.

like image 32
CommonsWare Avatar answered Oct 09 '22 13:10

CommonsWare