当前位置: 代码迷 >> java >> 如何使用Android上外部库使用的Apache http-client 4.5.x.
  详细解决方案

如何使用Android上外部库使用的Apache http-client 4.5.x.

热度:43   发布时间:2023-07-26 14:24:56.0

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

我们可以看到在Android M中,httpclient 。 在Android P中,库并且对于没有清单条目的应用程序不可用。 我还可以看到有一个官方的Apache ,如果你需要一个稍微更现代的库版本,它是4.3.5.1的合适直接替代品。 对于具有现代目标sdk的应用程序,甚至还有 。

我的应用程序的min sdk是17,而目标sdk是28.所以我的第一个问题是,它是否真的可以杀死任何对apache httpclient的Android版本的引用,其中一个min sdk卡在17,如果不是,我怎么能替换4.5.2的那个版本在库内。

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

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

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

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

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

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

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

  相关解决方案