Android5.0(ART虚拟机)
不需要适配
Android6.0(动态权限)
1.动态权限适配:
对于危险权限,需要在使用之前,弹窗获取权限,(xxpermisiton,rxpermission等)
权限适配三连问
Q: 是否 Android 6.0 所有权限都需要动态申请?
A: 不是。只有属于危险权限的才需要申请。
Q: 危险权限有哪些?
A: 见下面“危险权限分组说明”
Q: 危险权限是否需要一个一个申请?
A: 在 Android 6.0 ~ Android 8.0,不需要。如果应用在运行时请求权限并且被授予该权限,系统会错误地将属于同一权限组并且在清单中注册的其他权限也一起授予应用,即对于同一组内的权限,只要有一个被同意,其他的都会被同意。在 Android 8.0 之后,此行为已被纠正。系统只会授予应用明确请求的权限。然而一旦用户为应用授予某个权限,则所有后续对该权限组中权限的请求都将被自动批准,但是若没有请求相应的权限而进行操作的话就会出现应用 crash 的情况。
Android7.0(应用间共享文件 签名v2)
1.使用FileProvider共享文件
2.增加v2签名,
在7.0以上有V2签名就使用V2进行校验,没有V2就是用V1校验
在7.0以下只验证V1
建议同时勾选V1 V2
Android8.0(通知栏 权限 静态广播 应用安装)
1.8.0之后通知权限默认关闭,需要主动开启
2.动态权限的优化
例子:比如你申请了读sd卡权限,在8.0以前,你还可以写sd卡。
但是在8.0之后,你必须重新申请写sd卡。否则会异常。虽然再申请的时候,不会弹出框,但是必须要这么操作
总结:用什么权限就去申请什么权限,否则会fc。如果你只申请了权限组中的某些权限,却用了同组的其他权限,那么你就需要去适配一下了
3.无法在Mainifest中注册广播,必须手动注册
4.应用内升级,针对 8.0 的应用需要在 AndroidManifest.xml 中声明 REQUEST_INSTALL_PACKAGES 权限,否则将无法进行应用内升级。
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
Android9.0(刘海屏 HTTPS 静态广播 前台服务 非SDK访问限制)
1.刘海屏
-
其实如果你的页面不需要全屏显示,那么不需要额外的适配工作。
-
如果页面是全屏显示(比如启动页)。为了防止你的内容被遮挡,大部分场景下都是可以使用获取状态栏高度来处理遮挡的适配问题。因为状态栏的高度都是大于等于刘海的高度。
-
当然,如果你想利用起来刘海区域,就需要获取刘海位置等信息进行适配。在Android 9.0中官方提供了
DisplayCutout
类,可以确定刘海区域的位置,国内的部分厂商在8.0就有了自己的适配方案。
2.https 在9.0中默认情况下启用网络传输层安全协议 (TLS),默认情况下已停用明文支持。也就是不允许使用http请求,要求使用https。
解决方法是需要我们添加网络安全配置。首先在 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
添加:
<manifest ... >
<application android:networkSecurityConfig="@xml/network_security_config">
...
</application>
</manifest>
3.静态广播
9.0隐式广播倍全面禁止,必须手动中注册
4.前台服务
在安卓9.0版本之后,必须要授予FOREGROUND_SERVICE权限,才能够使用前台服务,否则会抛出异常。对此,我们只需要在AndroidManifest添加对应的权限即可,这个权限是普通权限,不需要动态申请。
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
5.非 SDK 接口访问限制
主要影响反射相关,对灰产影响较大
解决方案
一种绕过Android P对非SDK接口限制的简单方法 | Weishu's Notes
https://github.com/tiann/FreeReflection
implementation 'com.github.tiann:FreeReflection:3.1.0'
Add one line to your Application.attachBaseContext
:
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
Reflection.unseal(base);
}
6.Build.SERIAL被弃用。使用友盟udid或者自己组合唯一ID