一、应用行为变更
1.1、进程只能杀死自己的后台进程
说明:从Android 14开始,当应用调用 killBackgroundProcesses() 时,该API只能杀死应用自己的后台进程。如果传入其他应用的包名,该方法对其他应用的后台进程没有影响。
应用不应使用 killBackgroundProcesses() 或以其他方式尝试影响其他应用的进程生命周期。如果应用不必要地杀死其他应用,会降低系统性能并增加电池消耗,因为稍后需要完全重启这些应用,这比恢复现有的缓存应用占用的资源要多得多。
1.2、默认情况下拒绝使用精准闹钟
说明:Android 12中引入的精准闹钟权限SCHEDULE_EXACT_ALARM,不再预先授予大多数针对Android 13及更高版本的新安装应用,将默认设置为拒绝。如果用户通过备份还原操作将应用数据传输到Android14的设备上,权限仍然会被拒绝。如果现有的应用已经拥有此权限,它将在设备升级到Android 14 时预先授予。
始终允许以下类型的应用程序调用setExact()或setExactAndAllowWhileIdle()方法:
- 使用平台证书签名的应用程序;
- 特权应用程序;
- 电源许可名单上的应用程序(如果应用符合要求,可以使用intent操作请求ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS)
影响范围:
- targetSdkVersion为33或更高版本的应用;
- 在 manifest中声明SCHEDULE_EXACT_ALARM权限;
- 不属于豁免或者授权前拥有权限;
- 不是日历或者闹钟应用。
1.3、前台服务类型是必填项
说明:Android 14 为目标平台,则必须指定适当的前台服务类型。与以前的 Android 版本一样,可组合使用多个类型。
下面列出了可供选择的前台服务类型:
- camera
- connectedDevice
- dataSync
- health
- location
- mediaPlayback
- mediaProjection
- microphone
- phoneCall
- remoteMessaging
- shortService
- specialUse
- systemExempted
// 示例 <manifest ...> <uses-permission android:name="android.permission.FOREGROUND_SERVICE" /> <uses-permission android:name="android.permission.FOREGROUND_SERVICE_MEDIA_PLAYBACK" /> <application ...> <service android:name=".MyMediaPlaybackService" android:foregroundServiceType="mediaPlayback" android:exported="false"> </service> </application> </manifest>
如果应用中的用例与这些类型均不相关,强烈建议您迁移逻辑以使用 WorkManager 或用户发起的数据传输作业。
1.4、将前台服务迁移到用户启动的数据传输作业类型中
说明:由于Android 14对应用使用前台服务应用了严格的规则,所以在Android 14中,我们引入了一种新的API,用于指定作业是由用户启动的数据传输作业。该API 有助于需要持续时间更长、用户启动的数据传输的用例,例如从远程服务器下载文件。
用户启动的数据传输作业由用户启动。这些作业需要通知,立即启动,并且可能会在系统条件允许的情况下运行更长的时间。
用户启动的数据传输作业需要新的运行权限: RUN_USER_INITIATED_JOBS。系统将会自动授予此权限。如果未在应用manifest中声明权限,系统将抛出SecurityException。
影响范围:targetSdkVersion为34的应用。
1.5、语法性别
Android 14 推出了针对语法性别的 API:GrammaticalInflectionManager,其提供了针对单个 App 获取、设置性别偏好的入口。
getApplicationGrammaticalGender():获取语法性别偏好,返回的是 Configuration 类中的 int 常量,有这么几种类型:
- GRAMMATICAL_GENDER_NOT_SPECIFIED, 0:尚未指定性别偏好,将用默认的资源文本
- GRAMMATICAL_GENDER_NEUTRAL, 1:指定中性、客观的资源文本
- GRAMMATICAL_GENDER_FEMININE, 2:指定针对女性的资源文本
- GRAMMATICAL_GENDER_MASCULINE, 3:指定针对男性的资源文本
setRequestedApplicationGrammaticalGender():相对应的将上述常量类型动态设置到性别偏好。
这样可以针对不同的性别,加载不同的资源目录:
- 女性 —— res/values-fr-feminine
- 男性 —— res/values-fr-masculine
- 中性 —— res/values-fr
二、用户体验
2.1、授予对照片和视频的部分访问权限
新增权限:READ_MEDIA_VISUAL_USER_SELECTED
说明: 在Android14上与应用交互的用户现在可以授予对其媒体库的部分访问权限(READ_MEDIA_IMAGES和READ_MEDIA_VIDEO)。
新对话框包含以下选项:
- 选择照片和视频: Android14中的新功能。用户选择想要提供给应用的特定照片和视频;
- 全部允许:用户授予对设备上所有照片和视频的完整库访问权限;
- 不允许:用户拒绝所有访问。
如果用户选择了“选择照片和视频”并且应用稍后再次请求READ_MEDIA_IMAGES 或者 READ_MEDIA_VIDEO权限,系统会显示不同的对话框,让用户有机会授予完全访问的权限,维持现状,或者授予对其他照片和视频的访问权限。为了帮助应用支持新的变化,系统引入了一个新的权限READ_MEDIA_VISUAL_USER_SELECTED。
如果应用不声明READ_MEDIA_VISUAL_USER_SELECTED权限,则会发生以下行为:
- 在用户与应用会话期间,将会授予对用户选择的照片和视频的READ_MEDIA_IMAGES 和 READ_MEDIA_VIDEO 临时访问权限。当应用移到后台或者当用户主动杀死应用时,系统最终会拒绝这些权限。此行为就像其他一次性权限一样;
如果应用稍后需要访问其他照片和视频,必须手动请求权限重新获得权限。
2.2、改变不可关闭通知的方式
说明:对于应用向用户显示不可关闭的前台通知,从Android14开始允许用户关闭此类通知。
这项变更适用于通过 Notification.Builder#setOngoing(true)
或 NotificationCompat.Builder#setOngoing(true)
设置 Notification.FLAG_ONGOING_EVENT
来阻止用户关闭前台通知的应用。FLAG_ONGOING_EVENT
的行为已发生变化,使用户实际上能够关闭此类通知。
在以下情况下,此类通知仍不可关闭:
- 当手机处于锁定状态时
- 如果用户选择全部清除通知操作(有助于防止意外关闭)
此外,这一新行为不适用于以下用例中的不可关闭通知:
- 使用
MediaStyle
创建的通知- 安全和隐私用例的政策限制使用
- 企业设备政策控制器 (DPC) 和支持软件包
2.3、非线性字体放大至 200%
说明:从Android14开始,系统支持高达200%的字体缩放,为弱视用户提供了符合网络内容无障碍指南 (WCAG) 的其他无障碍功能选项。
2.4、区域偏好
说明:区域偏好使用户能够自定义温度单位、一周的第一天、数字系统。新 Android设置菜单为用户提供了一个集中位置来更改应用程序区域偏好,应用可通过API例如getTemperatureUnit和getFirstDayOfWeek获取用户设置,以便调整应用内显示信息的方式。
2.5、数据安全信息更显眼
说明:为了加强用户隐私保护,Android 14 增加了系统显示您在 Play 管理中心表单中声明的信息的位置数量。目前,用户可以在 Google Play 中的应用详情的数据安全部分查看此信息。
2.6、安全的全屏 intent 通知
说明: 在 Android 11(API 级别 30)中,任何应用都可以在手机处于锁定状态时使用 Notification.Builder.setFullScreenIntent
) 发送全屏 intent。您可以通过在 AndroidManifest 中声明 USE_FULL_SCREEN_INTENT
权限,在应用安装时自动授予此权限。
全屏 intent 通知适用于需要用户立即注意的极高优先级通知,例如用户来电或用户配置的闹钟设置。从 Android 14 开始,获准使用此权限的应用仅限于提供通话和闹钟的应用。对于不适合此情况的任何应用,Google Play 商店会撤消其默认的 USE_FULL_SCREEN_INTENT
权限。
在用户更新到 Android 14 之前,在手机上安装的应用仍拥有此权限。用户可以开启和关闭此权限。
您可以使用新 API NotificationManager.canUseFullScreenIntent
) 检查应用是否具有该权限;如果没有,应用可以使用新 intent ACTION_MANAGE_APP_USE_FULL_SCREEN_INTENT
启动设置页面,在该页面中,用户可以授予权限。
三、图形
3.1、Path可查询和可插值
说明:Android的Path API是一种用于创建和渲染矢量图形的强大而灵活的机制,具有描边或填充路径、从线段或二次或三次曲线构建路径、执行布尔运算以获得更复杂的形状。但是对象的内部在创建后对调用者是不透明的。
可以调用moveTo()、lineTo()和cubicTo() 添加路径段等方法创建Path,但是没有办法询问该路径的段是什么,因此必须在创建时保留该信息。从 Android 14 开始,可以查询路径里面有些什么,同时支持路径内部插值返回新路径。
四、安全
4.1、限制隐式intent
说明: Android 通过以下方式限制应用向内部应用组件发送隐式intent:
- 隐式intent仅传递给exported的组件。应用程序必须使用明确的intent传递给unexported的组件,或者将组件标记为exported。
- 如果应用创建一个pending intent,但intent未指定组件或包,系统现在会抛出异常。
这些更改可防止恶意应用拦截用在供应用内部组件使用的隐式intent。
4.2 更安全的动态代码加载
说明: 如果应用使用动态代码加载 (DCL),则所有动态加载的文件都必须标记为只读,否则系统会抛出异常。建议应用尽可能避免动态加载代码,因为这样做会大大增加应用程序因代码注入或代码篡改而受到危害的风险。
为防止现有动态加载文件抛出异常,建议尝试在应用中再次动态加载文件之前删除并重新创建这些文件。重新创建文件时,请按照前面的指导在写入时将文件标记为只读。或者将现有文件重新标记为只读,但在这种情况下,强烈建议首先验证文件的完整性(例如,通过根据可信值检查文件的签名),来保护你的app避免被恶意篡改。
4.3 Zip路径遍历
说明:对于以 Android 14 为目标平台的应用,Android 会通过以下方式防止 Zip 路径遍历漏洞:如果 Zip 文件条目名称包含“..”或以“/”开头,ZipFile(String)
和 ZipInputStream.getNextEntry()
) 会抛出 ZipException
。
应用可以通过调用 dalvik.system.ZipPathValidator.clearCallback()
) 选择停用此验证。
4.4 额外的后台启动activity限制
说明:系统进一步限制了应用在后台启动 Activity 的时机:
- 当应用发送PendingIntent使用PendingIntent.send()或类似方法时,如果应用想要授予自己的后台activity启动权限以启动intent,则该应用现在必须调用setPendingIntentBackgroundActivityStartMode(MODE_BACKGROUND_ACTIVITY_START_ALLOWED)来明确的表达意图。
- 当一个可见应用使用bindService()方法绑定另一个在后台运行的应用的服务时 ,如果该可见应用想要将其自己的后台活动启动权限授予绑定服务,则它现在必须添加BIND_ALLOW_ACTIVITY_STARTS标志。
通过这样的限制可以防止恶意应用程序滥用API从后台启动破坏性activity以便保护用户。
4.5、广播接收器必须指定导出行为
说明: 以 Android 14 为目标平台并使用 上下文注册
的接收器的应用和服务指定以下标志,以指定接收器是否应导出到设备上的所有其他应用:RECEIVER_EXPORTED
或RECEIVER_NOT_EXPORTED
。此要求有助于使用Android 13 中引入的这些接收器的功能,来保护应用主板安全漏洞的影响。
五、可升级Android 14的机子
以下只列出部份品牌:
- 小米13Pro、小米13、小米12T
- vivo X90 Pro、iQOO 11
- Pixel 4a (5G)、Pixel 5、Pixel 5a、Pixel 6、Pixel 6 Pro......