【问题标题】:How to use Apache http-client 4.5.x used by external library on Android如何在 Android 上使用外部库使用的 Apache http-client 4.5.x
【发布时间】:2019-02-12 14:28:57
【问题描述】:

我正在尝试了解 Android 当前与 Apache http-client 的关系。我需要使用依赖于org.apache.httpcomponents:httpclient:4.5.2 的标准Java 库,这在Android 上似乎是不可能的。

我们可以在 Android M 中看到,support was removed 用于 httpclient。在 Android P 中,库 was removed from the boot class path 对没有清单条目的应用程序不可用。我还可以看到有一个官方的 Apache Android port of httpclient 如果您需要一个稍微更现代的库版本,它是 4.3.5.1 的合适直接替代品。甚至还有一个 third party port of 4.4.1.1 用于具有现代目标 sdk 的应用程序。

我的应用程序的最小 sdk 是 17,目标 sdk 是 28。所以我的第一个问题是,实际上是否有可能在最小 sdk 停留在 17 的情况下终止对 Android 版本 apache httpclient 的任何引用,如果不是如何我可以用库中的 4.5.2 替换那个版本吗?

我的具体错误是 java.lang.NoSuchFieldError: org.apache.http.conn.ssl.AllowAllHostnameVerifier.INSTANCE,即使我的目标 SDK 为 28,Android 仍在查找和使用没有 INSTANCE 字段的旧版 AllowAllHostnameVerifier.java 类:

【问题讨论】:

  • 谢谢@mridul,但旧的http客户端与我需要的相反:)
  • @DanielWilson 你是否尝试在清单应用程序标签中使用它:
  • 谢谢,但是从这个和之前的评论来看,我可能不太清楚,旧版本的 apache http 客户端不好,它不包含这个新的一些变量和调用我的应用需要使用的库。
  • jst把Apache http-client 4.5.x的源码放到你的项目中怎么样。同名的本地资源优先级更高。丑陋,不推荐,可能很危险,但应该可以。

标签: java android apache-httpclient-4.x


【解决方案1】:

您不能直接替换 Android 框架中包含的类。唯一的解决方案是使用不同的命名空间。这就是为什么Spongy Castle 使用org.spongycastle.* 而不是org.bouncycastle.*,而您链接的项目使用cz.msebera.android.httpclient.* 而不是org.apache.http.*

不幸的是,这意味着您必须更改库中对 http-client 的每个引用。

自 Android Jetpack 发布以来,SDK 包含 Jetifier,一个翻译工具 构建时库字节码中的引用。有一个standalone version,可以使用自定义映射配置。

在你的情况下,这意味着:

  • 创建自定义配置,将org.apache.http 转换为cz.msebera.android.httpclient
  • 转换您的标准 Java 库
  • 使用转换后的库和http-client的第三方端口

转换库的另一种可能的解决方案是使用Jar Jar

【讨论】:

  • 谢谢@bwt 是的,我在 Google 搜索时偶然发现了 SpongyCastle。所有这些听起来都高于我的工资等级,但我很高兴我没有错过一些明显的东西。我认为在 Android 应用程序中使用依赖于 apache-http 客户端的库比它的价值要麻烦得多,因此应尽可能避免。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-20
  • 2014-05-21
  • 2015-11-13
  • 1970-01-01
相关资源
最近更新 更多