Android 15 平台包含可能影响您的应用的行为变更。当这些应用在 Android 15 上运行时,以下行为变更适用于所有应用,而不管targetSdkVersion
如何。您应该测试您的应用,然后根据需要对其进行修改以适当地支持这些变更(如适用)。
请务必查看仅影响目标 Android 15 的应用的行为变更列表。
核心功能
Android 15 修改或扩展了 Android 系统的各种核心功能。
包已停止状态的更改
包FLAG_STOPPED
状态(用户可以通过长按应用图标并在 AOSP 构建中选择“强制停止”来使用)的意图始终是将应用保持在此状态,直到用户通过直接启动应用或间接与应用交互(通过共享表或 Widget,选择应用作为动态壁纸等)明确地将应用从此状态移除。在 Android 15 中,我们已更新系统的行为以符合此预期行为。应用应仅通过直接或间接的用户操作才能从已停止状态移除。
为了支持预期行为,除了现有的限制之外,系统还会在应用在运行 Android 15 的设备上进入已停止状态时取消所有挂起意图。当用户的操作将应用从已停止状态移除时,ACTION_BOOT_COMPLETED
广播将传递给应用,从而提供重新注册任何挂起意图的机会。
您可以调用新的ApplicationStartInfo.wasForceStopped()
方法来确认应用是否已进入已停止状态。
支持 16 KB 页面大小
从历史上看,Android 只支持 4 KB 内存页面大小,这优化了 Android 设备通常具有的平均总内存量的系统内存性能。从 Android 15 开始,AOSP 支持配置为使用 16 KB 页面大小的设备(16 KB 设备)。如果您的应用直接或间接地通过 SDK 使用任何NDK库,则需要重新构建您的应用才能使其在这些 16 KB 设备上运行。
随着设备制造商继续制造具有更大物理内存 (RAM) 的设备,这些设备中的许多设备将采用 16 KB(最终更大)的页面大小来优化设备的性能。添加对 16 KB 页面大小设备的支持使您的应用能够在这些设备上运行,并帮助您的应用受益于相关的性能改进。如果不重新编译,当这些应用在未来的 Android 版本中投入生产时,它们可能无法在 16 KB 设备上运行。
为了帮助您为您的应用添加支持,我们提供了关于如何检查您的应用是否受影响、如何重建您的应用(如果适用)以及如何使用模拟器(包括 Android 模拟器的 Android 15 系统映像)在16 KB 环境中测试您的应用的指导。
优势和性能提升
配置为 16 KB 页大小的设备平均使用略多内存,但同时也为系统和应用带来了各种性能改进。
- 在系统内存压力下降低应用启动时间:平均降低 3.16%,我们测试的一些应用则有更显著的改进(高达 30%)。
- 降低应用启动时的功耗:平均降低 4.56%。
- 更快的相机启动速度:热启动平均快 4.48%,冷启动平均快 6.60%。
- 改进的系统启动时间:平均提高 8%(大约 950 毫秒)。
这些改进基于我们的初步测试,实际设备上的结果可能会有所不同。在我们继续测试的过程中,我们将提供对应用潜在收益的更多分析。
检查您的应用是否受影响
如果您的应用使用任何原生代码,则您应该使用支持 16 KB 设备的版本重建您的应用。如果您不确定您的应用是否使用原生代码,您可以使用 APK 分析器来识别是否存在任何原生代码,然后检查您找到的任何共享库的 ELF 段的对齐方式。
如果您的应用只使用 Java 编程语言或 Kotlin 编写的代码,包括所有库或 SDK,那么您的应用已经支持 16 KB 设备。尽管如此,我们建议您在 16 KB 环境中测试您的应用,以验证应用行为中是否存在任何意外的回归。
某些应用需要进行更改才能支持私密空间
私密空间是 Android 15 中的一项新功能,允许用户在设备上创建一个单独的空间,以便在额外的身份验证层下将敏感应用与窥探者隔离开来。由于私密空间中的应用可见性受限,某些类型的应用需要采取额外步骤才能查看和与用户私密空间中的应用进行交互。
所有应用
由于私密空间中的应用保存在单独的用户配置文件中,类似于工作配置文件,应用不应假设任何未安装在主配置文件中的应用副本都位于工作配置文件中。如果您的应用具有与工作配置文件应用相关的、做出此假设的逻辑,则需要调整此逻辑。
医疗应用
当用户锁定私密空间时,私密空间中的所有应用都会停止运行,这些应用无法执行前台或后台活动,包括显示通知。此行为可能会严重影响安装在私密空间中的医疗应用的使用和功能。
私密空间设置体验会警告用户,私密空间不适合需要执行关键前台或后台活动的应用,例如显示医疗应用的通知。但是,应用无法确定自己是否正在私密空间中使用,因此它们无法为此情况向用户显示警告。
由于这些原因,如果您开发医疗应用,请查看此功能可能会如何影响您的应用,并采取适当的措施(例如,告知您的用户不要将您的应用安装在私密空间中)以避免中断关键的应用功能。
启动器应用
如果您开发启动器应用,则必须在私密空间中的应用可见之前执行以下操作:
- 您的应用必须被指定为设备的默认启动器应用,即拥有
ROLE_HOME
角色。 - 您的应用必须声明
ACCESS_HIDDEN_PROFILES
普通权限在您的应用清单文件中。
声明ACCESS_HIDDEN_PROFILES
权限的启动器应用必须处理以下私密空间用例:
- 您的应用必须为安装在私密空间中的应用提供单独的启动器容器。使用
getLauncherUserInfo()
方法确定正在处理哪种类型的用户配置文件。 - 用户必须能够隐藏和显示私密空间容器。
- 用户必须能够锁定和解锁私密空间容器。使用
requestQuietModeEnabled()
方法锁定(通过传递true
)或解锁(通过传递false
)私密空间。 锁定期间,私密空间容器中的任何应用都不应通过搜索等机制可见或可发现。您的应用应注册一个接收器用于
ACTION_PROFILE_AVAILABLE
和ACTION_PROFILE_UNAVAILABLE
广播,并在私密空间容器的锁定或解锁状态更改时更新应用中的 UI。这两个广播都包含EXTRA_USER
,您的应用可以使用它来引用私密配置文件用户。您还可以使用
isQuietModeEnabled()
方法检查私密空间配置文件是否已锁定。
应用商店应用
私密空间包含一个“安装应用”按钮,该按钮启动一个隐式意图以将应用安装到用户的私密空间。为了使您的应用能够接收此隐式意图,请在您的应用清单文件中声明一个<intent-filter>
,其中包含<category>
为CATEGORY_APP_MARKET
。
基于 PNG 的表情符号字体已移除
基于 PNG 的旧版表情符号字体文件(NotoColorEmojiLegacy.ttf
)已被移除,只剩下基于矢量的文件。从 Android 13(API 级别 33)开始,系统表情符号渲染器使用的表情符号字体文件已从基于 PNG 的文件更改为基于矢量的文件。出于兼容性原因,系统在 Android 13 和 14 中保留了旧版字体文件,以便具有自己字体渲染器的应用可以继续使用旧版字体文件,直到它们能够升级。
要检查您的应用是否受影响,请搜索您的应用代码中对NotoColorEmojiLegacy.ttf
文件的引用。
您可以选择多种方式来调整您的应用:
- 使用平台 API 进行文本渲染。您可以将文本渲染到一个基于位图的
Canvas
,并使用它来获取原始图像(如有必要)。 - 为您的应用添加 COLRv1 字体支持。2.13.0 版及更高版本的 FreeType 开源库支持 COLRv1。
- 最后,您可以将旧版表情符号字体文件(
NotoColorEmoji.ttf
)捆绑到您的 APK 中,尽管在这种情况下,您的应用将缺少最新的表情符号更新。有关更多信息,请参阅Noto Emoji GitHub 项目页面。
最低目标 SDK 版本从 23 提高到 24
Android 15 基于Android 14 中所做的更改,并进一步扩展了此安全性。在 Android 15 中,targetSdkVersion
低于 24 的应用无法安装。要求应用满足现代 API 级别有助于确保更好的安全性和隐私性。
恶意软件通常会针对较低的 API 级别,以绕过在较高 Android 版本中引入的安全性和隐私保护。例如,某些恶意软件应用使用targetSdkVersion
22 来避免受到 Android 6.0 Marshmallow(API 级别 23)于 2015 年引入的运行时权限模型的约束。此 Android 15 更改使恶意软件更难以避免安全性和隐私改进。尝试安装目标 API 级别较低的应用会导致安装失败,并且 Logcat 中会出现类似以下的消息:
INSTALL_FAILED_DEPRECATED_SDK_VERSION: App package must target at least SDK version 24, but found 7
在升级到 Android 15 的设备上,targetSdkVersion
低于 24 的任何应用都将保持安装状态。
如果您需要测试一个针对较旧 API 级别的应用,请使用以下 ADB 命令:
adb install --bypass-low-target-sdk-block FILENAME.apk
相机和媒体
Android 15 对所有应用的相机和媒体行为进行了以下更改。
达到资源限制时,直接和卸载音频播放会使先前打开的直接或卸载音频轨道失效
在 Android 15 之前,如果一个应用在另一个应用正在播放音频并且达到资源限制时请求直接或卸载音频播放,则该应用将无法打开新的AudioTrack
。
从 Android 15 开始,当应用请求直接或卸载播放并且达到资源限制时,系统会使任何当前打开的AudioTrack
对象失效,从而阻止完成新的轨道请求。
(直接和卸载音频轨道通常用于压缩音频格式的播放。直接音频播放的常见用例包括通过 HDMI 将编码音频流式传输到电视。卸载轨道通常用于在具有硬件 DSP 加速的移动设备上播放压缩音频。)
用户体验和系统 UI
Android 15 包含一些旨在创建更一致、更直观的用户体验的更改。
为选择加入的应用启用预测式返回动画
从 Android 15 开始,预测式返回动画的开发者选项已被移除。对于已选择加入预测式返回手势(全部或在活动级别)的应用,现在将显示系统动画,例如返回主屏幕、跨任务和跨活动动画。如果您的应用受到影响,请采取以下措施:
- 确保您的应用已正确迁移以使用预测式返回手势。
- 确保您的片段转换与预测式返回导航配合使用。
- 迁移离开动画和框架转换,改用动画器和 androidx 转换。
- 迁移离开
FragmentManager
不知道的返回堆栈。改用由FragmentManager
或导航组件管理的返回堆栈。
用户强制停止应用时,小部件会被禁用
如果用户在运行 Android 15 的设备上强制停止应用,系统会暂时禁用该应用的所有小部件。小部件会显示为灰色,用户无法与之交互。这是因为从 Android 15 开始,系统会在应用被强制停止时取消该应用的所有挂起的意图。
系统在下一次用户启动应用时重新启用这些小部件。
有关更多信息,请参阅包停止状态的更改。
媒体投射状态栏芯片提醒用户屏幕共享、投射和录制
屏幕投影漏洞会泄露用户的私密数据,例如财务信息,因为用户没有意识到他们的设备屏幕正在被共享。到目前为止,Android 一直在状态栏显示屏幕投射和屏幕录制图标,但这些图标很小,常常被忽略。此外,停止屏幕共享或录制操作也很麻烦,因为控制按钮位于快速设置中。
Android 15 引入了一种新的状态栏芯片,该芯片较大且醒目,应提醒用户注意任何正在进行的屏幕投影。用户可以点击该芯片来停止屏幕共享、投射或录制。
为了提供直观的用户体验,屏幕投影现在会在设备屏幕锁定后自动停止。
优势和性能提升
新的媒体投影状态栏芯片增强了用户体验,具体如下:
- 提醒用户正在进行屏幕共享、投射或录制。
- 允许用户通过点击芯片来终止屏幕投影。
设备屏幕锁定后自动暂停屏幕投影,确保用户隐私。
检查您的应用是否受影响
默认情况下,您的应用包含新的状态栏芯片,并在锁定屏幕激活时自动暂停屏幕投影。请通过实现onStop()
方法来测试您的应用MediaProjection.Callback
。验证您的应用在用户点击状态栏芯片或锁定屏幕激活导致屏幕投影停止时是否做出适当的响应。
弃用
随着每个版本的发布,某些 Android API 可能会过时,或者需要重构以提供更好的开发者体验或支持新的平台功能。在这些情况下,我们会正式弃用过时的 API,并引导开发者使用替代的 API。
弃用意味着我们已经停止了对这些 API 的官方支持,但它们仍将继续向开发者提供。要了解此 Android 版本中值得注意的弃用内容,请参阅弃用页面。