一桩Android9.0引起的血案

       1. 最近接手一个老项目,首页两个Fragment和两个Activity写的,网络请求是xutils,webview里面的请求还是HttpClient,一来就进行了各种适配和版本兼容,代码惨不忍睹.Android6.0以上系统的相机、定位、打电话等权限都需要动态请求,如果不主动请求适配的话,在7.0或以上版本会直接崩溃。拍照和读写文件时,需适配FileProvider,7.0及以上的手机系统相机Uri路径不一样,直接读写也会报错。在适配这些权限和做版本兼容后,我把开发版本改成28,运行后没有报错,我的手机是8.1.0,也测试了7.0、6.0、5.0的小米、华为、OPPO等各种 手机没有出现问题,但是在小米8和华为Mate10上面安装上去启动就报错了,发现小米8和华为Mate10都是9.0系统的手机,关键是集成bugly也没有上报错误日志,当时也不知道客户咋操作的,问题出在哪里,心里真是一万只cnm路过,这种问题最蛋疼,恨不得立马去买个9.0的手机回来进行联调测试,最后测试小姐姐去找别的项目组同事借了一个华为Mate10过来.感谢测试小姐姐~~我果断安装上App,安装成功后果然一启动就崩溃了,去bugly后台看日志还是没有任何信息,最后多次启动看日志,刚开始以为是8.0的FullScreen的问题,启动页是一个透明背景主题的Activity,后来发现不是这个问题,看下一个日志,找到一条关键信息,错误日志如下:

Rejecting re-init on previously-failed class java.lang.Class<org.apache.http.client.methods.HttpEntityEnclosingRequestBase>: java.lang.NoClassDefFoundError: Failed resolution of: Lorg/apache/http/client/methods/HttpRequestBase;

一桩Android9.0引起的血案

2.查找资料后得知GooglePlay Services方面的一个bug,可以通过以下方式进行修复:截图如下

在AndroidManifest.xml内部<application>标签:加上

<uses-library android:name="org.apache.http.legacy" android:required="false" />

一桩Android9.0引起的血案

 

 3.添加后运行App安装没问题,也可以启动但是加载网络出错了,一直提示网络加载失败,请检查网络,这是由于Android在9.0系统以后,所有应用的请求都必须用Https,这是Android为用户安全着想,出发点还是可以的,AndroidP上的所有应用程序默认都使用https,苦逼了我们开发者要做适配,当然新的东西我们也要不断学习和更新,这是一个开发者必须要完成的工作,没有啥可说的.

4.解决方法如下:

一、APP改用https请求

这种方式需要接口去协调,把请求域名改为https。

二、targetSdkVersion 降到27以下

三、在 res 下新增一个 xml 目录,然后创建一个名为:network_security_config.xml 文件(名字自定) ,内容如下,大概意思就是允许开启http请求。

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <base-config cleartextTrafficPermitted="true">
        <trust-anchors>
            <certificates src="system" />
        </trust-anchors>
    </base-config>
</network-security-config>

5.xml文件截图如下:

一桩Android9.0引起的血案

6.Manifest配置截图如下:

一桩Android9.0引起的血案

7. app的build配置如下:

一桩Android9.0引起的血案

         最后我发现把项目的开发目标版本改成27和28都是可以的,安装完成后正常启动,并且网络加载成功。解决了AndroidP安装启动报错和无法请求接口数据的问题,最后建议后台在下一版改成https,由于最近要上线一版,所以暂时先不改,记录一下,如果有相同问题的小伙伴可以参考下,方便大家开发,如有更好的解决方案可以给我留言,一起学习成长.