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:
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)
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
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With