Android 8(.1)系统下华为设备90%出现ANR和应用崩溃问题。

4

最近一次安卓应用更新以来,我遇到了ANR和崩溃问题,这些问题主要出现在运行Android 8的华为设备上。(我已经成功地在Honor 7x, Android 8.0上重现了ANR)。

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

这两个问题似乎是相关的-我猜原因是相同的,但在Android 8.0和Android 8.1上的结果不同。

关于原因

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

然而,我在互联网上找不到与这个问题有关的任何信息。我想知道,是否可以实际处理这个问题,因为我无法访问该库,也不知道为什么这几乎只在华为设备上发生。

我也正在联系视频广告库的作者,但是也许有人遇到过/解决了类似的问题。


Android 8.1崩溃的控制台日志:

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导致了崩溃。你设置它们的方式与网络连接是解决问题的基础部分。 - Viraj S
2个回答

0
在Android 8.1中,尝试替换Provider来修复它。
  • implementation 'org.conscrypt:conscrypt-android:2.5.2'

请查看https://github.com/google/conscrypt#android上的最新版本。

  • 在Application静态方法中修复它
static {
    if (Build.VERSION.SDK_INT == Build.VERSION_CODES.O_MR1) {
        Security.insertProviderAt(Conscrypt.newProvider(), 1);
        Log.e("sslProvider", SSLSocketFactory.getDefault().getClass().getName());
    }
}

看到日志中的sslProvider: org.conscrypt.OpenSSLSocketFactoryImpl表示成功


0

看起来有一个针对OkHttp报告的类似错误,他们得出结论是由于资源耗尽导致http无法打开文件句柄。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接