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