今天集成sdk,里面的网络通信报错
Exception:java.lang.IncompatibleClassChangeError: Class 'org.apache.http.conn.ssl.SSLSocketFactory' does not implement interface
'org.apache.http.conn.scheme.SchemeSocketFactory' in call to
'java.net.Socket org.apache.http.conn.scheme.SchemeSocketFactory.createSocket
(org.apache.http.params.HttpParams)' (declaration of 'org.apache.http.impl.conn.DefaultClientConnectionOperator'
appears in /data/app/com.xxx.k-08Q3kCfJ6ZkZBXkFyOF4og==/base.apk!classes3.dex)
一番查找后发现:
Apache HTTP 客户端弃用影响采用非标准 ClassLoader 的应用
其实,自 Android 6 发布,就移除了对 Apache HTTP 客户端的支持,而推荐改用 HttpURLConnection 类,因为它可以通过透明压缩和响应缓存减少网络使用,并可最大限度降低耗电量, 从此我们变习惯这样使用 Apache HTTP API,即在 build.geadle 添加:
android {
useLibrary 'org.apache.http.legacy'
}
androd P 开始,默认情况下该内容库已从 bootclasspath 中移除且不可用于应用。
这句话怎么理解,也就是说默认 Apache HTTP API 不可用,即使在build.geadle申明了该库。
这种说法分两种情况: 运行在 android P 设备上的应用:
Target 28 ,默认会报 NoClassDefFoundError,因为此库被禁止使用,要继续使用 Apache HTTP 客户端,以 Android 9 及更高版本为目标的应用可以向其 AndroidManifest.xml 添加以下内容:
<uses-library
android:name="org.apache.http.legacy"
android:required="false"/>
Target < 28 可以和 android 6.0 一致。