Android各版本主要特性

1,080 阅读10分钟

参考自:Android 版本适配全套指南 - 掘金

6.0新特性:对应api->23(M)

6.1.运行时权限
对应以android6.0(Api级别23)或更高版本为目标平台的应用,请务必在运行时检查和请求权限.要确认您的应用是否已被授予权限,请调用新增的checkSelfPermission()方法,要请求权限,请调用新增的requestPermission()方法.
6.2.取消支持ApachHttp客户端
android6.0移除了对ApacheHttp客户端的支持,如果您的应用使用该客户端,并以android2.3(api->9)或者更高版本为目标平台,请改用HttpUrlConnection类,此api效率更高,因为它可以通过透明压缩和响应缓存减少网络使用,且可最大限度降低耗电量,要继续使用apacheHttp api,您必须在build.gradle文件中声明一下编译依赖项:

android {
    useLibrary 'org.apache.http.legacy'
}

7.0新特性:对应api->24-25(N)

参考自:Android7.0适配教程,心得 - 简书 (jianshu.com)
7.1.系统权限更改
为提高私有目录安全性,禁用file uri访问私有目录,改用content uri访问.
7.2.APK signature scheme v2
android7.0引入一项新应用签名,方案v2,能够提供更快的应用安装时间和更多针对未授权apk文件更改的保护.默认情况下会使用v2和v1(传统签名方案)来签署应用.
注意:
1.只勾选v1签名就是传统方案签署,但是在7.0上不会使用V2安全的验证方式.
2.只勾选V2签名7.0以下会显示未安装,7.0上则会使用了V2安全的验证方式.
3.同时勾选V1和V2则所有版本都没问题。

8.0新特性:对应api->26-27(O)

参考自:Android 8.0适配指北
8.1.运行时权限
在android8.0之前,如果应用在运行时请求权限并且被授予该权限,系统会错误地将属于同一权限组并且在清单中注册的其它权限也一起授予作用。对于针对8.0的应用,此行为已被纠正,系统只会授予应用明确请求的权限,然而,一旦用户为应用属于某个权限,则所有后续对该权限组中权限的请求都将被自动批准。
8.2.通知适配
android8.0引入了通知渠道,允许用户为要显示的每种通知类型创建用户可自定义的渠道,方便用户对通知接收进行分类控制。
8.3.安装apk
android8.0去除了“允许未知来源选项”,所以如果我们的app有安装app功能(检查更新之类),那么会无法正常安装。
解决方法1:在清单文件中添加

<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES"/>

9.0新特性:对应api->28(P)

参考自:Android 9.0 适配指南
9.1.停止明文支持
在9.0中默认情况下启用网络传输层安全协议(TLS),默认情况下已停止明文支持,也就是不允许使用http请求,要求使用https.
解决方案:添加网络安全配置.
步骤1:在res目录下新建xml文件夹,并添加network_security_config.xml文件

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

步骤2:添加到清单中的application节点中.

<?xml version="1.0" encoding="utf-8"?>
<manifest ... >
    <application android:networkSecurityConfig="@xml/network_security_config">
            ...
    </application>
</manifest>

9.2.Apache Http客户端弃用
在android6.0时,就取消了对Apache Http客户端的支持.从android9.0开始,默认情况下该库已从bootclasspath中移除.但是耐不住有些sdk还在使用,如老版本友盟QQ分享报错问题。所以如想继续使用,须在清单中添加:

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

9.3.前台服务
android 9.0要求启动前台服务需请求FOREGROUND_SERVICE权限,否则系统会引发SecurityException.
解决方法:在清单中添加FOREGROUND_SERVICE权限,如下:

<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />

9.4.启动activity
禁止在非activity环境中启动activity,比如service,application等,否则会报错,这类问题一般会用在点击推送消息跳转页面这类场景。
解决方法:在Intent中添加标志FLAG_NEW_TASK。如下:

Intent intent = new Intent(this, TestActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);

9.5.异形屏适配 异形屏的叫法很多,刘海屏,水滴屏,挖孔屏,美人尖。。。
1.其实你的页面不需全面显示,则不许做额外适配。
2.如果页面全屏显示如启动页,为防止内容被遮挡,大部分场景都是可以使用获取状态栏高度来处理遮挡的适配问题,因为状态栏的高度都是大于等于刘海的高度。
当然,如果想利用刘海区域,android9.0官网提供了DisplayCutout获取刘海位置等信息进行适配。

10.0新特性,对应api->29(Q)

Android 10 适配攻略
Android 10 分区存储完全解析
10.1.分区存储 image.png image.png
10.2.权限变化
android10引入了ACESS_BACKGROUND_LOCATION后台访问位置危险权限.

<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION"/>

image.png 10.3.后台启动activity的限制
简单解释就是应用处于后台时,无法启动activity,比如点开一个应用会进入启动页或者广告页,一般会有几秒延迟在跳转至首页,如果期间退回后台,那么将无法看到跳转过程.而在之前的版本中,会强制弹出页面至前台. 10.4.标识符和数据.
从android10开始,应用必须具有READ_PRIVILEGED_PHONE_STATE特许权限才能正常获取Device Id等设备标识.

11.0新特性,对应api->30(R)

参考自:Android 11 变更及适配攻略
11.1.存储机制更新
*具体适配方法和Android10无太大区别,需要注意的应用>=30,强制执行分区存储机制。之前在清单中添加android:requestLegacyExternalStorage="true"的适配方式已不起作用。
*android11允许使用除MediaStore API之外的API通过文件路径直接访问共享存储空间中的媒体文件。其中包括File API和原生库,如ofpen().
11.2.权限变化
*单次权限授权:从Android11开始,每当应用请求与位置信息,麦克风或摄像头相关的权限时,面向用户的权限对话框包含仅限这一次选项,系统会向应用授予临时的单次授权。
*请求位置权限:在Android11中,请求弹窗中取消了“始终允许”这一选项。也就是说默认不会授予你后台访问设备位置信息的权限。如果尝试请求ACCESS_BACKGROUND_LOCATION权限的同时请求任何其它权限,系统会抛出异常,不会向应用授予其中的任一权限。
官方建议:应用对位置权限执行递增请求,先请求前台位置信息访问权限,在请求后台位置信息访问权限,执行递增请求可以为用户提供更大的控制权和透明度,因为他们可以更好的了解应用中的哪些功能需要后台位置信息访问权限。
11.3.软件包可见性
软件包可见性是Android11提升系统隐私安全性的一个新特性,它的作用是限制app随意获取其它app信息和安装状态,避免病毒软件,间谍软件利用,引发网络钓鱼,用户安装信息泄漏等安全事件。此项变更影响比较多的是分享支付一类需要与其它应用交互的功能。
解决方法:在清单中添加queries元素,里面添加需要可见的应用包名。如下:

<manifest package="com.example.app">
    <queries>
        <package android:name="com.tencent.mm" /> <- 指定微信包名
    </queries>
    ...
</manifest>

11.4.前台服务类型 Android10中,在前台服务访问位置信息,需要在对应的service中添加location服务类型,同样,android11中在前台服务访问摄像头,麦克风,需要在对应的service中添加camera或microphone服务类型。如下:

<manifest>
    ...
   <service 
       android:name="MyService"
       android:foregroundServiceType="microphone|camera" />
</manifest>

这一限制的变更,使得程序无法在后台启动服务访问摄像头和麦克风。
11.5.权限自动重置
如果软件以Android11或更高版本为平台并且数月未使用,系统会自动重置用户已授权的运行时敏感权限来保护用户数据。

12.0新特性,对应api->31(S)

参考自:Android 12 快速适配要点
12.1.android:exported
*它主要设置activity是否可有其它应用的组件启动,"true"可以,"false"不可以,若为false,则activity只能由同一应用或同一用户id的不同应用启动,当然不止activity,service和Receiver也有exported的场景.
*一般情况下如果使用了intent-filter,则不能设置为false,不然在activity被调用时系统会抛出activityNotFoundException异常,相反如果没有intent-filter则不用设置exported=true,否则可能在安全扫描时被定义为安全漏洞.
*在android12上需要注意:如果activity,service或Receiver使用intent-filter,并且未声明android:exported的值,则应用无法安装.
12.2.SplashScreen
android12新增加了SplashScreen的api,它包括启动时进入应用的动作,显示的图标,以及展示应用本身的过度效果.
12.3.应用休眠
Android12在Android11中引入的自动重置权限行为的基础上进行了扩展,即api为31上,如果多月不用,则系统自动重置权限行为,并将该app置于休眠状态.

13.0新特性,对应api->33(T)

Android 13 新特性、适配指南
Android 13官方介绍

13.1.影响应用的行为变更-所有应用

注:以下变更即无论采用哪种目标平台,这些行为变更都会在Android13上的机器上生效,需要测试应用是否兼容.
1.前台服务(FGS)任务管理器
无论采用哪种目标平台的应用,在android13上,可通过下拉通知抽屉查看正在使用中的应用,每个应用都有一个停止按钮,允许用户停止应用的前台服务.
2.通知的运行时权限
对于安装的应用,app的目标平台不同表现为:
*以安装13为目标平台:app需要在清单中申明android:permission.POST_NOTIFICATIONS权限,然后向用户请求授予通知权限.
*以android12或以下的目标平台:当app创建第一个通知渠道时,系统会显示权限对话框.
对于已安装的应用:app的目标平台不同表现为: *以android13为目标平台:系统临时授予应用发送通知的权限,知道应用中的activity首次启动.应用程序必须有一个先用的通知渠道,且其通知不能被用户明确禁止.
*以android12或以下目标平台:系统临时授予应用发送通知的权限,知道用户在权限对话框中明确选择一个选项.

13.2.影像应用的变更-以android13为目标平台的应用

1.通知权限会影响前台服务的显示.
如果用户拒绝通知权限,他们扔会在前台服务(FGS)任务管理器中看到与这些前台服务相关的通知,但不会在抽屉通知栏中看到这些通知.
2.针对附近wifi设备的新运行时权限.
在以前的android版本中,需要向用户申请ACCESS_FIND_LOCATION权限,app才能完成附近wifi搜索,连接等功能.但是用户很难将位置信息与wifi功能关联,因此在权限组nearby_devices中引入了新的运行时权限nearby_wifi_devices.
3.细化媒体权限
如果你的应用以android13为目标平台,必须请求一个或多个新权限,而不是read_external_storage和write_external_storage权限.
1665019288508(1).jpg
4.intent过滤器会屏蔽不匹配的intent
当您的应用向以Android13或更高版本为目标平台的其它应用的导出组件发送intent时,仅当该intent与接收应用的intent-filter匹配时,系统才会传送该intent,不匹配的intent会被屏蔽.