问题描述
我试图了解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
领域:
1楼
您无法直接替换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的第三方端口
转换库的另一种可能的解决方案是使用 。