Many OutOfMemoryError from Samsung Galaxy devices on Android 7.x

I have an active application in the Google Play Store. I have been getting a lot of weird crash reports in the Play Console for months.

Since I cannot insert all the data here (there are a lot of accident reports), I am trying to show a good resume. Detailed information on request.

The most vulnerable 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 others

Types of Failures:

  • 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 did not find anything similar in StackOverflow or any other sources. Any help?


EDIT , several stacktraces elements:

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.ia (i.java:8) at com.google.android.gms.ads.internal.renderer.ac (a.java:35) at com.google.android.gms.ads.internal.renderer.ga (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.ia (i.java:8) at com.google.android.gms.ads.internal.renderer.ac (a.java:35) at com.google.android.gms.ads.internal.renderer.ga (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 firebase-ads dependencies, but I still have the same crashes. In addition, I had a new type of crash in this version:

Samsung Galaxy A5 (2016) (a5xelte) , 2048 MB 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) 
+5
source share
2 answers

I did not want to allow this path, but it seems he decided by adding

 largeHeap="true" 

in my manifest.

What I found out: Samsung Galaxy memory is poorly optimized by Samsung (Galaxy A5 2016 has 2 GB of RAM. This is more than enough, but on Firebase I see OOM due to a very small heap). So, I decided to sort things out once and for all, and I set greatHeap to true. I am not proud of this choice, but it seemed the only viable one.

Result: all OOM seem to have disappeared until

+3
source

Look at the last stack trace in the 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 exploded turned a String into byte[] . Either you are very short in the heap area, or in a rather large line.

  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 String is equal to WebView , through loadDataWithBaseURL() . This suggests that something is calling loadDataWithBaseURL() with a rather large url. A data: URL will be one of the possibilities.

  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.ia (i.java:8) at com.google.android.gms.ads.internal.renderer.ac (a.java:35) at com.google.android.gms.ads.internal.renderer.ga (g.java:11) at com.google.android.gms.ads.internal.zzk.run (zzk.java:28) 

Here we have six lines, which are all from one Java package. com.google.android.gms is the top-level package for most of the Services Services, so com.google.android.gms.ads supposedly one of their advertising libraries. I donโ€™t use many Services of the Service, so I donโ€™t understand which brands of the advertising network they still have and which cards correspond to com.google.android.gms.ads .

So, check your ad network libraries and make sure that you are at the last and largest that you can support. With any luck, this is a mistake that they corrected in their library somewhere along the line.

+2
source

Source: https://habr.com/ru/post/1270689/


All Articles