首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在启用了proguard的版本变体中未调用传统的httpclient createClientConnectionManager()

在启用了proguard的版本变体中未调用传统的httpclient createClientConnectionManager()
EN

Stack Overflow用户
提问于 2015-10-07 21:52:00
回答 1查看 125关注 0票数 0

在遗留代码库上工作仍然坚持使用过时的Apache HttpClient (在“下一版本之后”的路线图中将摆脱它)。在扩展DefaultHttpClient的类中使用通过重写createClientConnectionManager()实现的证书锁定

代码语言:javascript
复制
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,并为传统支持库添加了以下内容:

代码语言:javascript
复制
-dontwarn org.apache.http.**

添加-dontoptimize没有效果。

使用minifyEnabled false禁用proguard会使重写再次被调用。然而,禁用proguard对我来说不是一个选择。

我知道一个解决此问题的方法。有兴趣了解根本原因,也许还有更好的解决办法。

EN

回答 1

Stack Overflow用户

发布于 2015-10-07 21:52:00

通过使createClientConnectionManager()成为从构造函数调用的静态助手,并显式地传递给超级构造函数,解决了这个问题:

代码语言:javascript
复制
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
    }

现在,在所有配置中都使用了自定义连接管理器。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32994068

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档