安卓应用、Android 8(.1)、90% 华为设备中的 ANR 和崩溃

Posted

技术标签:

【中文标题】安卓应用、Android 8(.1)、90% 华为设备中的 ANR 和崩溃【英文标题】:ANR and crash in an android app, Android 8(.1), 90% Huawei devices 【发布时间】:2019-08-04 05:29:44 【问题描述】:

自从最近一次 android 应用更新以来,我遇到了 ANR 和崩溃问题,这主要出现在运行 Android 8 的华为设备上。(我设法在 Honor 7x、Android 8.0 上重现了 ANR)。

根据 Google Play 控制台日志,崩溃仅发生在 Android 8.1 上,93% 发生在华为设备上。 另一方面,ANR(同样主要出现在华为设备上)不会出现在 Android 8.1 上(如上面提到的崩溃),而几乎只出现在 Android 8.0 上。

这两个问题似乎有关联——我猜原因是一样的,但在 Android 8.0 和 Android 8.1 上的结果不同。

关于原因

最近,一个视频广告库 (https://www.teads.tv/) 已添加到应用程序中,我认为它导致了问题。 如果不加载这些广告,就不会发生崩溃。

但是,我在互联网上找不到与此问题相关的任何内容。 我想知道,由于我无法访问图书馆,也没有任何线索,因此是否真的可以对此做任何事情,为什么这几乎只发生在华为设备上。

我也在联系视频广告库的作者,但也许有人面临/已经解决了类似的问题。


Android 8.1-Crash 的控制台日志

java.lang.RuntimeException: 
  at com.android.org.conscrypt.ConscryptFileDescriptorSocket.newSsl (ConscryptFileDescriptorSocket.java:161)
  at com.android.org.conscrypt.ConscryptFileDescriptorSocket.<init> (ConscryptFileDescriptorSocket.java:152)
  at com.android.org.conscrypt.OpenSSLSocketFactoryImpl.createSocket (OpenSSLSocketFactoryImpl.java:155)
  at okhttp3.internal.connection.RealConnection.connectTls (RealConnection.java:307)
  at okhttp3.internal.connection.RealConnection.establishProtocol (RealConnection.java:282)
  at okhttp3.internal.connection.RealConnection.connect (RealConnection.java:167)
  at okhttp3.internal.connection.StreamAllocation.findConnection (StreamAllocation.java:257)
  at okhttp3.internal.connection.StreamAllocation.findHealthyConnection (StreamAllocation.java:135)
  at okhttp3.internal.connection.StreamAllocation.newStream (StreamAllocation.java:114)
  at okhttp3.internal.connection.ConnectInterceptor.intercept (ConnectInterceptor.java:42)
  at okhttp3.internal.http.RealInterceptorChain.proceed (RealInterceptorChain.java:147)
  at okhttp3.internal.http.RealInterceptorChain.proceed (RealInterceptorChain.java:121)
  at okhttp3.internal.cache.CacheInterceptor.intercept (CacheInterceptor.java:93)
  at okhttp3.internal.http.RealInterceptorChain.proceed (RealInterceptorChain.java:147)
  at okhttp3.internal.http.RealInterceptorChain.proceed (RealInterceptorChain.java:121)
  at okhttp3.internal.http.BridgeInterceptor.intercept (BridgeInterceptor.java:93)
  at okhttp3.internal.http.RealInterceptorChain.proceed (RealInterceptorChain.java:147)
  at okhttp3.internal.http.RetryAndFollowUpInterceptor.intercept (RetryAndFollowUpInterceptor.java:126)
  at okhttp3.internal.http.RealInterceptorChain.proceed (RealInterceptorChain.java:147)
  at okhttp3.internal.http.RealInterceptorChain.proceed (RealInterceptorChain.java:121)
  at okhttp3.RealCall.getResponseWithInterceptorChain (RealCall.java:200)
  at okhttp3.RealCall$AsyncCall.execute (RealCall.java:147)
  at okhttp3.internal.NamedRunnable.run (NamedRunnable.java:32)
  at java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1162)
  at java.util.concurrent.ThreadPoolExecutor$Worker.run (ThreadPoolExecutor.java:636)
  at java.lang.Thread.run (Thread.java:784)
Caused by: javax.net.ssl.SSLException: 
      at com.android.org.conscrypt.NativeCrypto.SSL_new (NativeCrypto.java)
      at com.android.org.conscrypt.SslWrapper.newInstance (SslWrapper.java:58)
      at com.android.org.c`enter code here`onscrypt.ConscryptFileDescriptorSocket.newSsl (ConscryptFileDescriptorSocket.java:159)
      at com.android.org.conscrypt.ConscryptFileDescriptorSocket.<init> (ConscryptFileDescriptorSocket.java:152)
      at com.android.org`enter code here`.conscrypt.OpenSSLSocketFactoryImpl.createSocket (OpenSSLSocketFactoryImpl.java:155)
      at okhttp3.internal.connection.RealConnection.connectTls (RealConnection.java:307)
      at okhttp3.internal.connection.RealConnection.establishProtocol (RealConnection.java:282)
      at okhttp3.internal.connection.RealConnection.connect (RealConnection.java:167)
      at okhttp3.internal.connection.StreamAllocation.findConnection (StreamAllocation.java:257)
      at okhttp3.internal.connection.StreamAllocation.findHealthyConnection (StreamAllocation.java:135)
      at okhttp3.internal.connection.StreamAllocation.newStream (StreamAllocation.java:114)
      at okhttp3.internal.connection.ConnectInterceptor.intercept (ConnectInterceptor.java:42)
      at okhttp3.internal.http.RealInterceptorChain.proceed (RealInterceptorChain.java:147)
      at okhttp3.internal.http.RealInterceptorChain.proceed (RealInterceptorChain.java:121)
      at okhttp3.internal.cache.CacheInterceptor.intercept (CacheInterceptor.java:93)
      at okhttp3.internal.http.RealInterceptorChain.proceed (RealInterceptorChain.java:147)
      at okhttp3.internal.http.RealInterceptorChain.proceed (RealInterceptorChain.java:121)
      at okhttp3.internal.http.BridgeInterceptor.intercept (BridgeInterceptor.java:93)
      at okhttp3.internal.http.RealInterceptorChain.proceed (RealInterceptorChain.java:147)
      at okhttp3.internal.http.RetryAndFollowUpInterceptor.intercept (RetryAndFollowUpInterceptor.java:126)
      at okhttp3.internal.http.RealInterceptorChain.proceed (RealInterceptorChain.java:147)
      at okhttp3.internal.http.RealInterceptorChain.proceed (RealInterceptorChain.java:121)
      at okhttp3.RealCall.getResponseWithInterceptorChain (RealCall.java:200)
      at okhttp3.RealCall$AsyncCall.execute (RealCall.java:147)
      at okhttp3.internal.NamedRunnable.run (NamedRunnable.java:32)
      at java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1162)
      at java.util.concurrent.ThreadPoolExecutor$Worker.run (ThreadPoolExecutor.java:636)
      at java.lang.Thread.run (Thread.java:784)

发布 ANR 日志可能不会很有用,或者会吗?

【问题讨论】:

您的 https(安全)连接 URL 导致崩溃。您通过网络连接设置它们的方式是要解决的基础部分。 【参考方案1】:

貌似是a similar bug reported against OkHttp,判断是资源耗尽导致http无法打开文件句柄。

我猜是视频广告库打开了太多文件而没有正确关闭它们,或者类似的东西。听起来解决方案是使用具有更好代码的不同广告库。

【讨论】:

以上是关于安卓应用、Android 8(.1)、90% 华为设备中的 ANR 和崩溃的主要内容,如果未能解决你的问题,请参考以下文章

谷歌安卓改用aab格式,助攻华为鸿蒙OS?

我可以在华为 AppGallery 上发布的安卓应用中使用 AdMob 吗?

华为宣布方舟编译器8月31日开源,鸿蒙还会远吗?

安卓 12 崩溃。华为服务

终于等到你!MobileTest免费公测,华为带你走出安卓适配大坑

怎么玩sdk低的安卓游戏