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

问题描述 投票:5回答:1

我试图了解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的合适直接替代品。对于具有现代目标sdk的应用程序,甚至还有third party port of 4.4.1.1

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

我的具体错误是java.lang.NoSuchFieldError: org.apache.http.conn.ssl.AllowAllHostnameVerifier.INSTANCE,即使我有一个28的目标SDK,Android仍然找到并使用没有AllowAllHostnameVerifier.java字段的传统INSTANCE类:

enter image description here

java android apache-httpclient-4.x
1个回答
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

© www.soinside.com 2019 - 2024. All rights reserved.