Android 9.0/P 版本推荐使用 HttpURLConnection
早在几年前,谷歌就推荐在Android2.3版本以上使用HttpURLConnection,而在即将正式发布的 Android P 版本中,谷歌彻底取消了对Apache HTTPClient的支持,针对此更改,开发者该如何正确适配 Android P ?
一、背景
1.参考谷歌提供的 Android P 版本变更说明文档:
https://developer.android.com/preview/behavior-changes#apache-nonp
https://developer.android.com/preview/behavior-changes#apache-p
2.Android 6.0 版本已移除对 Apache HTTP 客户端的支持
https://developer.android.com/about/versions/marshmallow/android-6.0-changes
Android 6.0 版本移除了对Apache HTTP客户端的支持。如果您的应用使用该客户端,并以 Android 2.3(API 级别为9)或更高版本为目标平台,请改用 HttpURLConnection 类。此API效率更高,能够通过透明压缩和响应缓存减少网络使用,并可最大限度降低耗电量。要继续使用 Apache HTTP API,须先在 build.gradle 文件中声明以下编译时依赖项:
android {
useLibrary 'org.apache.http.legacy'
}
3.P版本修改
Remove org.apache.http.legacy from bootclasspath
从Android P开始,org.apache.http.legacy 库将从 bootclasspath 中删除。
(1). 修改对 TargetSdkVersion<P 的应用的影响
该修改对大多数 TargetSdkVersion<P 的应用都无影响,但是如果应用使用了系统 ClassLoader加载org.apache.http.*中的类时,将在Android P上发生 NoClassDefFoundError 失败,因为系统ClassLoader不再知道这些类。为了防止将来出现类似的问题,应用应该通过应用 ClassLoader 加载类,而不是直接访问系统ClassLoader。
(2). 修改对 TargetSdkVersion>=P 的应用的影响
对所有 TargetSdkVersion>=P 的应用,如果还是按照以前一样通过在 build.gradle 文件中声明以下编译时依赖项:\
android {
useLibrary 'org.apache.http.legacy'
}
想继续使用 Apache-http 接口,都会出现 Apache-http 接口找不到的异常:
二、适配指导
1.继续使用Apache-http
(1). TargetSdkVersion<P 的应用适配指导
方案一:不要使用非标准的 ClassLoader 。
方案二:应用可以自己添加依赖的 apache jar 包到工程 libs 目录规避该兼容性问题。
注意:对于最低 SDK为23或更低的应用程序,android:required=“false”属性是必需的,因为在 API 等级低于24的设备上,org.apache.http.legacy 库不可用。(在这些设备上,Apache HTTP 类在 bootclasspath 上可用。)
(2). TargetSdkVersion>=P 的应用适配指导
对于 TargetSdkVersion>=P的应用如果想继续使用Apache-http客户端,需要在应用的 AndroidManifest.xml 文件中添加:
<uses-libraryandroid:name="org.apache.http.legacy"android:required="false"/>
2.不再使用Apache-http客户端
使用 HttpURLConnection 替代 Apache-http。
Android 9.0/P 版本推荐使用 HttpURLConnection的更多相关文章
- 对Android 8.0以上版本通知点击无效的一次分析
版权声明:本文为xing_star原创文章,转载请注明出处! 本文同步自http://javaexception.com/archives/178 对Android 8.0以上版本通知点击无效的一次分 ...
- 快速解决设置Android 23.0以上版本对SD卡的读写权限无效的问题
快速解决设置Android 23.0以上版本对SD卡的读写权限无效的问题 转 https://www.jb51.net/article/144939.htm 今天小编就为大家分享一篇快速解决设置And ...
- AppCompat v21 — Android 5.0之前版本设备的Material Design实现
博客原文地址:http://android-developers.blogspot.com/2014/10/appcompat-v21-material-design-for-pre.html,要想打 ...
- Android 7.0以上版本 系统解决拍照的问题 exposed beyond app through ClipData.Item.getUri()
解决方案1: android.os.FileUriExposedException: file:///storage/emulated/0/ilive/images/photophoto.jpeg e ...
- Windows下Nexus 5的Android 5.0以上版本官方ROM的刷机教程
博客链接:http://blog.csdn.net/qq1084283172/article/details/52334452 折腾Android逆向的时候,经常需要给Nexus 5刷机.最近给Nex ...
- 解决Android 4.0以上版本中OptionsMenu菜单不显示ICON图标的问题
在Android4.0系统中,创建菜单Menu,通过setIcon方法给菜单添加图标是无效的,图标没有显出来,2.3系统中是可以显示出来的.这个问题的根本原因在于4.0系统中,涉及到菜单的源码类 Me ...
- android 5.0以下版本使用atof报错解决
经过测试,如果手机系统在5.0之下,项目project.properties的target若在5.0以上(android-20), NDK 使用atof就会报错: cannot locate symb ...
- Android 9.0/P 开发问题及解决方案汇总
一.使用 org.apache.http.legacy 库在Android 9.0上运行出现崩溃 日志内容: java.lang.NoClassDefFoundError: Failed resolu ...
- Android 6.0 M userdebug版本执行adb remount失败
[FAQ18076]Android 6.0 M版本默认会打开system verified boot,即在userdebug和user版本会把system映射到dm-0设备,然后再挂载.挂载前会检查s ...
随机推荐
- JavaScript获取扫码枪相关资料
https://blog.csdn.net/jiongxian1/article/details/78906124 https://blog.csdn.net/jifengdalu/article/d ...
- Linux screenshot
一.简介 linux下的三个截图软件
- insmod 签名问题
问题现象: 通过 insmod 加载 XXX.ko 时候提示: hello: module verification failed: signature and/or required key mis ...
- Filezilla server配置FTP服务器中的各种问题与解决方法
转至;https://www.jb51.net/article/122171.htm 安装文件以及补丁下载 公司很多资料需要通过ftp上传,那么就需要配置一个FTP服务器,找了一台Windows服务器 ...
- PLSQL账号密码
Product Code:4t46t6vydkvsxekkvf3fjnpzy5wbuhphqzserial Number:601769 password:xs374ca
- numpy最值
>>> a = np.arange(9).reshape((3,3))>>> aarray([[0, 1, 2], [3, 4, 5], [6, 7, 8]])&g ...
- Numpy与Matplotlib
一.Numpy numpy支持大量的维度数组和矩阵运算,对数组运算提供了大量的数学函数库! numpy比Python列表更具优势,其中一个优势便是速度.在对大型数组执行操作时,numpy的速度比Pyt ...
- crontab计划不执行问题
问题现象:编写了一个自动释放磁盘空间的脚本,并将其加入到crontab中.crontab显示如下:# crontab -l10 5 * * * bash /home/backup/bin/clear. ...
- REdis命令处理流程处理分析
分析版本:REdis-5.0.4. REdis命令处理流程可分解成三个独立的流程(不包括复制和持久化): 1) 接受连接请求流程: 2) 接收请求数据和处理请求流程,在这个过程并不会发送处理结果给Cl ...
- window.open()新开网页被拦截
问题:同一个项目,同一个浏览器,不同模块,相同的代码(同是window.open()),为何一个直接打开,另一个直接被拦截? 原因:查资料发现为浏览器的广告拦截功能导致. 补充: 1.一般情况下,js ...