【问题标题】:Vimeo Networking Library Crash for Android 10 platform (api29)Android 10 平台 (api29) 的 Vimeo 网络库崩溃
【发布时间】:2021-04-20 14:10:05
【问题描述】:

我使用 vimeo 网络库 (https://github.com/vimeo/vimeo-networking-java)、exoplayer 实现了 vimeo 网络,并在这篇文章中解释了 https://stackoverflow.com/a/65737556/8814924

现在的问题是,当我使用 API 30 检查时出现错误

java.lang.RuntimeException: Unable to start Activity ComponentInfo{com.emergingit.emergingstudy/com.emergingit.emergingstudy.activities.course.ExoPlayerActivity}: java.lang.IllegalStateException: Unable to extract the trust manager on Android10Platform, sslSocketFactory是类 com.android.org.conscrypt.OpenSSLSocketFactoryImpl

原因:java.lang.IllegalStateException: Unable to extract the trust manager on Android10Platform, sslSocketFactory is class com.android.org.conscrypt.OpenSSLSocketFactoryImpl

表示错误

VimeoClient.initialize(configuration);

这里讨论了哪个问题:https://github.com/square/okhttp/issues/5878,问题讨论:

I assume you are calling the deprecated form of sslSocketFactory, which is broken on newer Android versions. https://github.com/square/okhttp/blob/master/okhttp/src/main/java/okhttp3/OkHttpClient.kt#L719

/**
 * Sets the socket factory used to secure HTTPS connections. If unset, the system default will
 * be used.
 *
 * @deprecated [SSLSocketFactory] does not expose its [X509TrustManager], which is a field that
 *     OkHttp needs to build a clean certificate chain. This method instead must use reflection
 *     to extract the trust manager. Applications should prefer to call
 *     `sslSocketFactory(SSLSocketFactory, X509TrustManager)`, which avoids such reflection.
 */
@Deprecated(
    message = "Use the sslSocketFactory overload that accepts a X509TrustManager.",
    level = DeprecationLevel.ERROR
)
fun sslSocketFactory(sslSocketFactory: SSLSocketFactory) = apply {
  if (sslSocketFactory != this.sslSocketFactoryOrNull) {
    this.routeDatabase = null
  }

  this.sslSocketFactoryOrNull = sslSocketFactory
  this.certificateChainCleaner = Platform.get().buildCertificateChainCleaner(sslSocketFactory)
}

使用当前版本的“1.1.3”网络库是否有任何解决方案,或者我必须等到库更新?

【问题讨论】:

    标签: runtime-error android-10.0 sslsocketfactory vimeo-android trustmanager


    【解决方案1】:

    我主要使用 Vimeo-Networking 库 (v1.1.3) 解决了 Android 10 平台上的 Vimeo 视频流问题。 因为主要问题出在 OkHttpClient 构建方法中

    builder.sslSocketFactory(sSLSocketFactory);
    //RetrofitClientBuilder.java#186    
    

    1 参数版本被贬低,我需要像这样将 X509TTrustManager 作为第二个参数传递:

    builder.sslSocketFactory(sSLSocketFactory, new X509TrustManager() {
                @Override
                public void checkClientTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {
    
                }
    
                @Override
                public void checkServerTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {
    
                }
    
                @Override
                public X509Certificate[] getAcceptedIssuers() {
                    return new X509Certificate[0];
                }
            });
    

    所以它解决了我的问题,直到这个更新出现在这个库的稳定版本中。我如何实现这一点如下所述:

    1. VimeoClient.initialize(accessToken); 行显示错误,我搜索了该错误并发现它是由于此 OkHttpClient 方法弃用(带有 1 个参数)引起的。

    2. 所以我进入 VimeoClient.java 并在其构造函数中看到 private Retrofit createRetrofit() 被调用,并且在其中 private OkHttpClient createOkHttpClient() 被调用。并且创建了 public class RetrofitClientBuilder 对象,它的问题方法是 public OkHttpClient build() 其中:if (sSLSocketFactory != null) { builder.sslSocketFactory(sSLSocketFactory); } 调用了这个已弃用的方法。

    3. 所以我只需要创建 2 个名为 VimeoClientUpdated.javaRetrofitClientBuilderUpdated.java 的新 java 文件,这只是 VimeoClient.java 和 RetrofitClientBuilder.java 现在我的 RetrofitClientBuilderUpdated.java 没有弃用的方法,而是正确的方法, VimeoClientUpdated.java 正在调用 RetrofitClientBuilderUpdated.java (由于最终类,我无法扩展,甚至无法将类包装为该解决方案的网关,我不得不面对无法在包装类中更改的私有方法)

    4. 最后,我没有调用 VimeoClient.initialize(accessToken),而是调用了我新创建的 VimeoClientUpdated(accessToken),它在 Android 10 上播放 Vimeo 视频时不会崩溃。

    如果有更好的方法来实现我的目的(解决从 android 活动调用已弃用的库方法),请建议我。 干杯..!!

    【讨论】:

    • 这会禁用您应用中的安全性。 Vimeo 库需要停止调用无法在所有平台上支持的长期弃用方法。
    • @YuriSchimke 它禁用了应用程序的安全性?能否请您详细说明一下...因为没有其他/更新版本的库并调用 depretricated 方法什么是恢复安全性的方法,因为我必须这样做才能使其正常工作?
    • 要构建 sslSocketFactory,您通常已经拥有真正的 truatmanager。传入 noop 版本只会使连接不安全。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多