Android P HTTP请求限制问题

背景

targetSdkVersion设置为28,运行在Andnroid 9.0设备上,原本http请求失败,如bugly上报失败;
或者抛出以下错误:

1
java.net.UnknownServiceException: CLEARTEXT communication ** not permitted by network security policy

原因

默认情况下启用网络传输层安全协议 (TLS)
如果您的应用以 Android 9 或更高版本为目标平台,则默认情况下 isCleartextTrafficPermitted() 函数返回 false。 如果您的应用需要为特定域名启用明文,您必须在应用的网络安全性配置中针对这些域名将 cleartextTrafficPermitted 显式设置为 true。

详情请移步了解https://developer.android.google.cn/about/versions/pie/android-9.0-changes-28#framework-security-changes

总之一句话,以前你要“裸奔”,我管不着,现在必须穿上“衣服”了,否则不让出街;
如果确实要继续“裸奔”,请书面申请。

解决办法

  1. 将所有http请求改为https请求;
  2. targetSdkVersion改为27或以下;
  3. 继续使用http非加密明文请求,方法如下

配置网络安全策略

  • 在res的xml目录下,新建一个xml文件(名称自定义,如:network-security-config.xml),内容如下:

    1
    2
    3
    4
    <?xml version="1.0" encoding="utf-8"?>
    <network-security-config>
    <base-config cleartextTrafficPermitted="true" />
    </network-security-config>
  • 在manifest的Application标签中设置安全策略配置

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <application
    ...
    android:networkSecurityConfig="@xml/network_security_config"
    android:supportsRtl="true">

    <!-- 兼容Android 9.0 -->
    <!--<uses-library-->
    <!--android:name="org.apache.http.legacy"-->
    <!--android:required="true" />-->
    </application>

添加legacy库依赖

  • build.gradle添加

    1
    useLibrary 'org.apache.http.legacy'
  • manifest中添加

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <application
    ...
    android:networkSecurityConfig="@xml/network_security_config"
    android:supportsRtl="true">

    ...

    <!-- 兼容Android 9.0 -->
    <uses-library
    android:name="org.apache.http.legacy"
    android:required="true" />
    </application>

以上,问题可解;

总结

https是大势所趋,早晚得支持,长痛不如短痛。勇敢上吧!

参考

  1. https://blog.csdn.net/mysimplelove/article/details/84063571
  2. https://developer.android.google.cn/training/articles/security-config
  3. https://developer.android.google.cn/training/articles/security-ssl
  4. https://blog.csdn.net/baidu_26829785/article/details/82660740
.gt-container a{border-bottom: none;}