# Android 9 有关网络请求的行为变更

Android 9（API 级别 28）向 Android 系统引入了多项变更。 当应用在 Android 9 平台上运行时，以下行为变更将影响所有应用，无论这些应用以哪个 API 级别为目标。 所有开发者都应查看这些变更，并修改其应用以正确支持这些变更（如果适用）。

<!--more-->



官网查看：<a href="https://developer.android.google.cn/about/versions/pie/android-9.0-changes-all#crypto-changes" target="_blank" rel="noopener noreferrer">行为变更，所有应用</a>

#### 一.Android  P Http 网络请求问题

<div>
  为保证用户数据和设备的安全，Google针对下一代 Android 系统(Android P) 的应用程序，将要求默认使用加密连接，这意味着 Android P 将禁止 App 使用所有未加密的连接，因此运行 Android P 系统的安卓设备无论是接收或者发送流量，未来都不能明码传输，需要使用下一代(Transport Layer Security)传输层安全协议，而 Android Nougat 和 Oreo 则不受影响。在Android P系统的设备上，如果应用使用非加密的明文流量的http网络请求，则会导致该应用无法进行网络请求，https则不会受影响，同样地，如果应用嵌套了webview，webview也只能使用https请求。
</div>

<div>
  因此在Android P 使用HttpUrlConnection进行http请求会出现类似以下报错信息：
</div>

<div>
</div>

<pre>Cleartext HTTP traffic to xxx（服务器ip地址） not permitted</pre>
##### 解决方案：

1.APP改用https请求（需要后端支持）

2.targetSdkVersion 降到27以下（抛弃Android P 以上设备，正常人不会这么操作）

3.在AndroidManifest.xml文件下的application标签增加以下属性：

<pre>android:usesCleartextTraffic="true"</pre>
这条属性将允许设备使用http请求，但属于治标不治本的方法，后端应尽快支持https。

#### 二.Apache HTTP 客户端弃用 {#apache-nonp}

早在 Android 6.0 中，谷歌[取消了对 Apache HTTP 客户端的支持][1]。从Android P开始，org.apache.http.legacy 库将从 bootclasspath 中删除。

该修改对大多数 TargetSdkVersion<P 的应用都无影响，

对所有 TargetSdkVersion>=P 的应用，如果还是按照以前一样通过在 build.gradle 文件中声明编译依赖项以继续使用 Apache-http 接口时，都会出现 Apache-http 接口找不到的异常。

**解决方案：**

很简单，不使用非标准的 ClassLoader 。但是由于某些第三方SDK（例如qq登陆）<span style="display: inline !important; float: none; background-color: #ffffff; color: #333333; cursor: text; font-family: 'Noto Serif',serif; font-size: 17px; font-style: normal; font-variant: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-decoration: none; text-indent: 0px; text-transform: none; -webkit-text-stroke-width: 0px; white-space: normal; word-spacing: 0px;">使用Apache-http客户端，必须添加依赖。</span>

<img class="alignnone size-full wp-image-284" src="http://120.78.201.42/wp-content/uploads/2018/11/批注-2018-11-11-201212.jpg" alt="" width="864" height="458" />在应用的 AndroidManifest.xml 文件中添加：

<pre class="pure-highlightjs"><code class="java">&lt;uses-library android:name="org.apache.http.legacy" android:required="false"/&gt;</code></pre>
&nbsp;

[1]: https://developer.android.google.cn/about/versions/marshmallow/android-6.0-changes#behavior-apache-http-client
