今天(20190704),绝大部分安卓应用市场建议或者要求TargetSDK等级为28或者警告未来某个时间TargetSDK等级必须达到28。
对于某些较早时间开发的APP就有了调整TargetSDK的必要。下面是关于我接触到的几个有关升级的问题:
一.http请求
去年某月的某一天听闻部门要求全部在开发的Android项目TargetSDK要全部提升到28。于是把当时手上的一个项目的SDK版本号随手改了。然后编译安装一切看起来都很美好。然后打开APP,全部的网络请求都没有正常响应……
原因:
从Android 6.0开始引入了对Https的推荐支持,与以往不同,Android P的系统上面默认所有Http的请求都被阻止了。
然而那个项目的所有请求都是Http的。
解决方案:
1.最简单也最符合系统要求的方式是让后台把全部请求改成Https的。
2.或者在Manifest文件的application标签下中增加
<application android:networkSecurityConfig="@xml/network_security_config">
在res下新建xml文件夹。在xml文件夹新建network_security_config.xml。该xml的内容如下:
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<base-config cleartextTrafficPermitted="true" />
</network-security-config>
3.最小的改动是在Manifest文件的application标签下中增加显式设置:
<application android:cleartextTrafficPermitted="true">
可以参考:https://www.jianshu.com/p/6ce99e03080f
二.Apache HTTP 客户端的支持
昨天,在修改一个新接手项目的时候,改完TargetSDK,我又顺手把支持它的v7包改成28.0.0版的了。于是在刷新谷歌地图(也不知道具体集成的是哪个版本的)的时候出现的了新的情况:
ClassNotFoundException:Didn't find class "org.apache.http.ProtocolVersion" on path:…
原因:
在 Android 6.0 中,我们取消了对 Apache HTTP 客户端的支持。 从 Android 9 开始,默认情况下该内容库已从 bootclasspath 中移除且不可用于应用。
解决方案:
要继续使用 Apache HTTP 客户端,以 Android 9 及更高版本为目标的应用可以向其 AndroidManifest.xml的application节点下 添加以下内容:
<uses-library
android:name="org.apache.http.legacy"
android:required="false" />
参考:https://blog.csdn.net/qq_33721320/article/details/86620524
附.网络环境的影响
这个就比较神奇了。
是同事遇到的一个情况。同事想把开发环境升级一下,于是把他用的AndroidStudio2换成了3,同时把使用的gradle也升级一下。于是这下热闹了。正在开发的一个项目一编译就报错,各种找不到。
后来,同事竟然用上了新建项目然后逐个粘贴文件的方法排障。然后发现似乎是ButterKnife罢工了,于是又换了n个版本的ButterKnife。各种版本的三方库要么不能通过编译,要么通过了编译不能正常工作……
第二天,同时告诉我应该是网络环境因素导致的。大概是网络不好导致某些要下载的文件始终不能成功,然而同时在家里的网络环境编译一次就过了。