美文网首页
Android P开发兼容

Android P开发兼容

作者: 俗人浮生 | 来源:发表于2019-04-17 21:33 被阅读0次

今天有空对公司的APP进行版本的升级,从原来的Android8.1(API27)升级到Android9.0(API28),当然,这里说的升级指的是targetSdkVersion,相关版本的知识可参考:Android版本相关基础

说到升级targetSdkVersion,其实不就改个数字嘛,简单得很!
但事实上呢?呵呵哒!比如本次升级完后,搞个Android9.0模拟器测试一下,结果APP进都进不去,直接崩了,吓死宝宝了!事实再次证明,targetSdkVersion不是随随便便就可以盲目升级的,测试才是关键啊!
我们来看看本次报的错误:

Caused by: java.lang.ClassNotFoundException: Didn't find class "org.apache.http.ProtocolVersion" on path: DexPathList[[zip file "/data/app/xxx.xxx.xxxx-pWm45wEKMBZM7Am3PpMvdg==/base.apk"],

从该错误我们知道,跟Apache HTTP有关的,我们都知道:在Android6.0 中,谷歌已经取消了对Apache HTTP的支持。更有甚者,从 Android 9.0 开始,默认情况下该内容库已从 bootclasspath 中移除且不可用于应用。
这就是本次报错的原因了!接下来我们看看如何解决:

 <application
        android:name=".base.MyApplication"
        android:allowBackup="true"
        android:icon="@mipmap/xxx"
        android:label="@string/app_name"
        android:largeHeap="true"
        android:supportsRtl="true"
        android:theme="@style/MyBaseAppTheme">

        <!--兼容Android9.0-->
        <uses-library
            android:name="org.apache.http.legacy"
            android:required="false" />
 </application>

如上所示,解决办法很简单,直接在AndroidManifest.xml中的application节点下添加uses-library
需要注意一点,如果你的minSdkVersion小于24,必须添加 android:required="false" 属性,因为在API小于24设备上Apache HTTP 类在 bootclasspath 中提供,org.apache.http.legacy 库不可用。
这样就完美地兼容了多个版本了!

好啦,APP终于可以正常运行了,然而新的问题又出现了,发现原来APP部分接口无法连接访问,这就非常尴尬了!
仔细分析比较后发现,区别在于http和https请求,现在的情况是https请求可以正常进行,http请求无法连接访问。

原来是谷歌为了用户数据和设备的安全起见,在Android9.0开始将禁止 App 使用所有未加密的连接,也就是说http请求无法连接访问。

既然知道了问题所在,那么解决方案有3种:
1)你去跟后台的同学说,把公司所有的接口都改成https吧,但很显然有时不太现实,你懂的~
2)把targetSdkVersion降回27吧,这不就尴尬了吗?敢情我这一篇白写了?不可能的事!
3)真正的解决方案来了:
首先在res文件夹新增一个xml文件,里面新增一个名为:network_security_config.xml 文件(名字可自定)

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

然后在AndroidManifest.xml中的application节点中进行相应的设置:

 <application
         ...
        android:networkSecurityConfig="@xml/network_security_config"
         ...>
        ...
 </application>

好啦,经过这样修改和测试,目前在Android P设备上暂无发现其它问题了!
最后,再次强调,升级targetSdkVersion后,必须进行全面有效的测试,测试非常重要!!!

相关文章

网友评论

      本文标题:Android P开发兼容

      本文链接:https://www.haomeiwen.com/subject/bjfgwqtx.html