我试图了解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
类:
您无法直接替换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
转换库的另一种可能的解决方案是使用Jar Jar。