Android P 适配踩坑记录

使用 org.apache.http.legacy 库在Android 9.0上运行出现崩溃

日志内容

java.lang.NoClassDefFoundError: Failed resolution of: Lorg/apache/http/message/BasicNameValuePair

问题分析

出现此问题主要是apache的http库在Android 9.0删除导致的,不要在Android 9.0中使用HttpClient访问网络,替换成HttpURLConnection或者OKHttp。

解决方案

如果是引用的第三方库使用HttpClient导致无法回避,则

(1)在build.gradle文件中声明编译时依赖

android {
    useLibrary 'org.apache.http.legacy'
}

(2)在AndroidManifest.xml文件的application标签里面添加

<uses-libraryandroid:name="org.apache.http.legacy"android:required="false"/>

参考:https://www.cnblogs.com/renhui/p/9798335.html
参考:https://stackoverflow.com/questions/50446148/how-to-use-apache-http-on-android-p
参考:https://juejin.im/post/5b8959f96fb9a019fe685eb3

OKHttp 请求网络 CLEARTEXT communication to host not permitted by network

问题:由于Android P限制了明文流量的网络请求,非加密的流量请求都会被系统禁止掉。

如果当前应用的请求是http请求,而非https,就会导系统禁止当前应用进行该请求,如果WebView的url使用 http协议,同样会出现加载失败,https不受影响。

为此,OkHttp3做了检查,如果使用了明文流量,默认情况下,在Android P版本OkHttp3就抛出异常: CLEARTEXT communication to " + host + " not permitted by network security policy

if (!Platform.get().isCleartextTrafficPermitted(host)) {
    throw new RouteException(new UnknownServiceException(
        "CLEARTEXT communication to " + host + " not permitted by network security policy"));
}

解决:

(1)在res下新建一个xml目录,然后创建一个名为:network_security_config.xml文件,该文件内容如下:

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <base-config cleartextTrafficPermitted="true" />
</network-security-config>

(2)然后在AndroidManifest.xmlapplication标签内应用上面的xml配置:

<application
    android:name=".AppApplication"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:networkSecurityConfig="@xml/network_security_config"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:theme="@style/AppTheme">
</application>

版权声明:
作者:Joe.Ye
链接:https://www.appblog.cn/index.php/2023/03/18/android-p-adaptation-record/
来源:APP全栈技术分享
文章版权归作者所有,未经允许请勿转载。

THE END
分享
二维码
打赏
海报
Android P 适配踩坑记录
使用 org.apache.http.legacy 库在Android 9.0上运行出现崩溃 日志内容 java.lang.NoClassDefFoundError: Failed resolution of: Lorg/apache/http/message/Ba……
<<上一篇
下一篇>>
文章目录
关闭
目 录