AndroidManifest标签说明

application标签

Posted by JovenHe on April 11, 2019

在项目开发中可能并没有什么问题,但真正运行到用户手机上却出现很多奇奇怪怪的问题,本文就是讲解遇到的一些因为AndroidManifest中的配置引发的问题

明文通信

把项目发给客户后发现项目运行在个别手机上接口返回数据报错,一开始我以为是网络问题,但多次尝试后发现所有接口都报错,拿来同事的手机debug一下。

报错信息

CLEARTEXT communication to xx.xx.xx.xx not permitted by network security policy

因为网络安全政策不允许明文通信到这个服务器。

看到这个报错信息,我就知道是新系统的特性问题,因为拿到同事的手机的时候看了一下系统版本是Android 9.0,而且日常浏览微信公众号时看到过新系统有个什么安全特性,有个印象,直接查找Android 9网络安全,就找到原因和解决方案了,是因为Android Pie上的所有应用程序默认都使用HTTPS,我们在项目上使用的是HTTP,所以就报错了。

方案1

在build.gradle中把targetSdkVersion 降级回到 27或以下

意在App没有兼容到系统P这一高版本

方案2

在 res 下的xml 目录中创建一个名为network_security_config.xml 文件 ,写入内容

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

然后在清单文件AndroidManifest中application 标签内加入

android:networkSecurityConfig=”@xml/network_security_config”

意在告诉系统,允许明文通信

方案3

和服务器通信都改为HTTPS。

总结

三种方案都能解决问题,最好的方案是方案3,从根本上解决问题,但在实施上不一定能得到支持,其余两种方案都能解决问题,但不确定系统会不会提示用户应用不安全、应用未兼容本系统等问题。

就像当年Android6推出运行时权限一样,不少开发者都觉得麻烦,直接把targetSdkVersion设置为22来逃避这一问题,但这就是趋势,是未来,未来一定是越来越注重信息安全的。

备份

看到微信公众号上推送了一篇文章。不关 Android 云备份,坑了开发和测试!

简单说就是app登录了A账号,卸载完,再次安装后,登录了B账号,后来发现账号又变成了A,因为是系统开启了云备份,在某个时间备份了app内的SharedPreferences账号信息,重装后,恢复了云端信息。

问题原因

因为国内Android厂商纷杂,碎片化严重的原因,某些厂商会在自己的 ROM 中实现备份功能,有的没有,而且备份还是不定时的,这就引发了备份的数据不可控的问题。

同时在建项目的时候,清单文件AndroidManifest中application 标签内 allowBackup默认是true的,不注意的话根本不会想到有这个坑。

安全风险

备份本身是一个好功能,但是不可控的话,上线App还是关闭备份功能吧。

同时,在手机未Root的情况下,通过adb命令可以得到指定app的备份数据,通过几个命令就可以逆向得到数据,这本身是很危险的。如果某些app不注重安全,把某些数据存在SharedPreferences中,很容易就能拿到数据。

解决方法

在清单文件AndroidManifest中application 标签内改为

android:allowBackup="false"

运行如果报错的话,再加入一句

tools:replace="android:allowBackup"

总结

当然问题的产生还是由于没有总结日常开发中需要了解的Android新版本新特性,所以还是要多关注Android的一些新动态的,尤其是和开发相关的。