Android 7.x 上的三星 Galaxy 设备出现大量 OutOfMemoryError

Posted

技术标签:

【中文标题】Android 7.x 上的三星 Galaxy 设备出现大量 OutOfMemoryError【英文标题】:A lot of OutOfMemoryError from Samsung Galaxy devices on Android 7.x 【发布时间】:2018-01-16 08:30:00 【问题描述】:

我在 Google Play 商店中有一个有效的应用程序。几个月以来,我在 Play 管理中心收到了很多奇怪的崩溃报告。

由于我无法在此处粘贴所有数据(有很多崩溃报告),我试图展示一个很好的摘要。根据要求提供详细信息。

受影响最大的设备:

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

ND:与其他设备相比,第一个设备非常关键

崩溃类型:

java.lang.RuntimeExceptionandroid.app.ActivityThread.performLaunchActivity java.lang.OutOfMemoryErrorjava.lang.StringFactory.newStringFromBytes java.lang.OutOfMemoryErrorlibcore.util.CharsetUtils.toUtf8Bytes java.lang.OutOfMemoryErrorjava.lang.StringFactory.newStringFromChars java.lang.OutOfMemoryErrorjava.lang.StringBuilder.toString java.lang.OutOfMemoryErrorjava.lang.StringFactory.newStringFromChars

Android 版本:7.0、7.1,很少有 6.0

我不知道为什么会在这些设备上发生这种情况,我不知道如何调试这些报告,而且我在 *** 或任何其他来源上也没有找到类似的东西。有什么帮助吗?


EDIT,一些堆栈跟踪:

三星 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)

三星 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)

三星 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)

编辑 2:我更新了 firebase-ads 的依赖项,但我仍然遇到同样的崩溃。另外,我在这个版本中有一个新的崩溃类型:

三星 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)

【问题讨论】:

请发布实际完整的堆栈跟踪,而不仅仅是错误消息。 编辑了一些堆栈跟踪 后两者来自 Play Services 的广告代码。确保您使用的是他们图书馆的最新版本。 原来我使用的是旧版本的 com.google.firebase:firebase-ads。但你是怎么假设的?我需要知道以备将来调试 我在 Android 7 和 7.1 上也有 RuntimeExceptions 。我们在项目中使用 Firebase 通知。 【参考方案1】:

我不想这样解决,但是似乎可以通过添加来解决

largeHeap="true"

进入我的清单。

我发现了什么:三星对三星 Galaxy 设备的内存优化不佳(Galaxy A5 2016 有 2GB 的 RAM。这绰绰有余,但在 Firebase 上我可以看到 OOM,因为堆很少)。因此,我决定一劳永逸地解决问题,并将 largeHeap 设置为 true。我并不为这个选择感到自豪,但它似乎是唯一可行的选择。

结果:所有 OOM 似乎现在都消失了

【讨论】:

这对第一个列出的错误有帮助吗? android.app.ActivityThread.performLaunchActivity 中的 RuntimeException (ActivityThread.java:2984) (Samsung Galaxy A5) @OferR 你应该发布完整的堆栈跟踪 我的问题是,该解决方案是否能帮助您解决遇到的问题,如您的问题中所列。您列出的第一个堆栈跟踪。应用 largeHeap="true" 后这些错误消失了吗? (你列出的问题,我指的是第一个。它在 android.app.ActivityThread.performLaunchActivity 中显示 RuntimeException,而其余的堆栈跟踪显示 OutOfMemoryError)...谢谢... @OferR 是的,对我来说真的很有帮助。但这可能是另一回事,因为 RuntimeException 不一定会因为小堆而被抛出。如果您遇到很多来自三星设备的类似堆栈跟踪,您可以尝试设置largeHeap="true",它可能会修复。如果你这样做了,请再次来这里让其他用户知道它是否有帮助。 谢谢。我将会。我没有收到那么多这样的错误,但这些总是三星设备(包括 S8)并且总是在 performLaunchActivity 上。【参考方案2】:

让我们看一下最后的堆栈跟踪,分段:

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()。这表明某些东西正在使用相当大的 URL 调用 loadDataWithBaseURL()data: URL 是一种可能性。

  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 Services 的***包,所以 com.google.android.gms.ads 大概是他们的广告库之一。我很少使用 Play 服务,因此我不知道他们仍然拥有哪些广告网络品牌以及哪些品牌映射到 com.google.android.gms.ads

因此,请检查您的广告网络库,并确保您使用的是您可以支持的最新、最好的版本。幸运的是,这是他们在他们的库中修复的一个错误。

【讨论】:

感谢您指出这一点。我在firebase-corefirebase-ads 上都使用了旧版本。我希望最新版本能解决所有与 Galaxy 设备有关的问题(甚至是 performLaunchActivity 上的匿名 RuntimeException)。手指交叉:) @AndroidGuy:对于第一个堆栈跟踪,如果没有更多内容,您将无能为力。没有指向您的代码或库的识别特征。而且,如果这就是您所得到的,请考虑使用其他东西来获取您的崩溃日志。通常这些堆栈跟踪有多个节(RuntimeException 和一堆行,然后是 Caused by 和另一个异常和一堆行)。你真正的问题可能会在后面的一节中报告,但如果你没有堆栈跟踪的那部分,那么你就不走运了。 这就是问题所在。但我注意到,像第一个堆栈跟踪中的所有崩溃都来自 Android 7.0 上的 Galaxy 设备。这让我认为它与firebase-ads 库或firebase-core 中的问题有关(它们都有相同的旧版本号)。我发布了最新的两个库的更新。如果这不起作用,我已将 firebase-crash 添加到依赖项中,它将启用向 Firebase 控制台报告崩溃,我希望它能帮助我获得更准确的堆栈跟踪。 不幸的是,上次更新似乎没有解决任何问题。请参阅主帖中的第二个编辑。 @AndroidGuy:如果没有更多来自崩溃日志的详细信息,很难甚至不可能查明此类崩溃的根源。

以上是关于Android 7.x 上的三星 Galaxy 设备出现大量 OutOfMemoryError的主要内容,如果未能解决你的问题,请参考以下文章

三星 Galaxy S3 Android 浏览器上的 Web 套接字?

三星 Galaxy S3 上的原生窗口渲染问题

三星 Galaxy 手机在 Android Studio 上无法识别

三星 Galaxy J1 4G 上的 webRTC 应用程序崩溃

三星 Galaxy s3 4.1.1 和 4.1.2 上的 Canvas globalCompositeOperation 问题

信标 - 三星 Galaxy Tab A6 SM-T280 上的 RSSI 错误