【问题标题】:Legacy httpclient createClientConnectionManager() not called in proguard-enabled release variants在启用 proguard 的版本变体中未调用旧版 httpclient createClientConnectionManager()
【发布时间】:2015-10-07 22:05:25
【问题描述】:

在遗留代码库上工作仍然坚持使用过时的 Apache HttpClient(摆脱它是在“下一次发布之后”路线图中)。使用通过在扩展 DefaultHttpClient 的类中覆盖 createClientConnectionManager() 实现的证书固定:

public class CustomHttpClient extends DefaultHttpClient {
    public CustomHttpClient() {
        // calling no-arg super ctor implicitly
    }

    @Override
    protected ClientConnectionManager createClientConnectionManager() {
        // return ThreadSafeClientConnManager
        // using a SchemeRegistry for https port 443
        // with certificate-pinning SSLSocketFactory for https port 443
    }

这适用于使用compileSdkVersion 23useLibrary 'org.apache.http.legacy' 的调试版本。这适用于没有旧支持库的较小编译 SDK 版本的调试和发布版本。

这不适用于带有 compileSdkVersion 23 和旧支持库的发布版本。 createClientConnectionManager() 未被调用。

Proguard 已启用发布版本,其设置遵循 SDK proguard-android-optimize.txt,并为旧支持库添加了以下内容:

-dontwarn org.apache.http.**

添加-dontoptimize 没有效果。

使用minifyEnabled false 禁用proguard 会再次调用覆盖。然而,禁用 proguard 对我来说不是一个选项。

我知道一种解决方法。有兴趣了解根本原因以及更好的解决方法。

【问题讨论】:

    标签: android proguard apache-httpclient-4.x android-6.0-marshmallow


    【解决方案1】:

    通过使 createClientConnectionManager() 成为从构造函数调用的静态帮助程序并显式传递给超级构造函数来解决此问题:

    public class CustomHttpClient extends DefaultHttpClient {
        public CustomHttpClient() {
            super(crateClientConnectionManager(), null);
        }
    
        private static ClientConnectionManager createClientConnectionManager() {
            // return ThreadSafeClientConnManager
            // using a SchemeRegistry for https port 443
            // with certificate-pinning SSLSocketFactory for https port 443
        }
    

    现在自定义连接管理器用于所有配置。

    【讨论】:

      猜你喜欢
      • 2021-11-29
      • 1970-01-01
      • 2014-04-08
      • 1970-01-01
      • 1970-01-01
      • 2017-11-01
      • 2018-10-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多