Android15 Beta更新速览
前台服务变更
前台服务使应用保持活动状态,以便它们可以执行关键且对用户可见的操作,通常以牺牲电池寿命为代价。在 Android 15 Beta 2 中,dataSync 和 mediaProcessing
前台服务类型现在具有约 6 小时的超时时间,之后系统将调用 Android 15 的新 Service.onTimeout(int, int)
方法。在此时,该服务将不再被视为前台服务。如果服务没有在超时后调用 Service.stopSelf()
来响应,它将会因失败而停止。
Beta 2 还为在应用在后台运行时启动前台服务添加了新的要求。- 如果你的前台服务依赖于 SYSTEM_ALERT_WINDOW
权限豁免以进行后台启动,那么现在在针对 Android 15 进行目标设置时,你需要有一个可见的悬浮窗口。
即将要求支持的16 KB页面大小
Android 15新增了对使用更大页面大小的设备的支持,除了标准的4 KB页面外,还支持16 KB页面。如果您的应用程序使用任何NDK库,无论是直接还是间接通过SDK,那么您可能需要简单地重新构建您的应用程序,以便在这些16 KB页面大小的设备上运行。
具有更大页面大小的设备在内存密集型工作负载方面可能具有更好的性能。虽然我们的测试可能不代表生态系统中的所有设备,但在我们对配置为16 KB页面大小的设备的初始测试中,我们发现了一些性能收益:
在系统承受内存压力时,应用程序启动时间较短:平均降低了3.16%,对于我们测试的一些应用程序,改善更显著(最高可达30%)
应用程序启动时功耗降低:平均减少了4.56%
相机启动更快:热启动平均快了4.48%,冷启动平均快了6.60%
系统启动时间改善:平均改善了1.5%(约0.8秒)
随着设备制造商继续构建具有更大物理内存(RAM)的设备,其中许多设备将采用16 KB(以及更大)的页面大小来优化设备的性能。添加对16 KB页面大小设备的支持使您的应用程序能够在这些设备上运行,并使您的应用程序受益于相关性能改进。我们计划将16 KB页面的兼容性要求纳入明年上传到Play Store的应用程序。
现代Android GPU架构
- Android硬件的发展:从单个CPU核心到现代GPU硬件,通过Vulkan图形API自Android 7.0开始。
- Vulkan的好处:较低级别的抽象、更好的CPU核心支持、减少的驱动程序开销,导致应用程序和游戏性能的提升。
- Vulkan作为Android首选的GPU接口。
- Android 15中包含的ANGLE:作为在Vulkan上运行OpenGL ES的可选层,标准化OpenGL实现,可能提高性能。
- 使用ANGLE测试OpenGL ES应用:在"开发者选项 → 实验性:启用ANGLE"设置中可用。
- Android ANGLE on Vulkan路线图:ANGLE将成为新设备上的标准GL系统驱动程序,未来预期OpenGL/ES将仅通过ANGLE可用。
- 对所有设备的OpenGL ES支持将继续。
- 建议:使用开发者选项测试ANGLE驱动程序,鼓励新的C/C++项目使用Vulkan。
- Android 15中的现代图形改进:引入Matrix44进行3D画布操作,clipShader和clipOutShader用于高效绘制复杂形状。
效率更高的AV1软解码
- dav1d是VideoLAN开发的AV1软件解码器,现已适用于不支持AV1硬件解码的Android设备。
- dav1d比传统的AV1软件解码器性能高出多达3倍,可在更多低端和中端设备上实现高清AV1播放。
- 应用程序需要通过名称"c2.android.av1-dav1d.decoder"来选择使用dav1d,将在后续更新中成为默认的AV1软件解码器。
- 此支持已标准化,并已回溯到接收了Google Play系统更新的Android 11设备。
- 开发者可以在 "构建现代Android媒体和相机体验" I/O讲座中了解有关Android媒体和相机的最新功能和解决方案。
更安全的隐私空间
- 隐私空间: 用户可以在设备上创建一个独立的空间,将敏感的应用程序放置其中,以避免被他人窥视。隐私空间使用单独的用户配置文件,当用户锁定隐私空间时,配置文件将被暂停,即应用程序将不再处于活动状态。用户可以选择使用设备锁定或单独的锁定因素来保护隐私空间。
- 应用程序处理: 在隐私空间中的应用程序将显示在启动器的单独容器中,并在隐私空间被锁定时隐藏在最近视图、通知、设置和其他应用程序中。用户生成和下载的内容(媒体、文件)以及账户在隐私空间和主空间之间是分开的。
- 系统功能: 当隐私空间解锁时,系统共享表和照片选择器可用于向应用程序提供跨空间的内容访问。 Android 15 beta 2.1 部分修复了在 beta 2 中已知的隐私空间问题,该问题影响了主屏幕应用程序。
选定照片访问改进
现在,当应用程序获得对媒体权限的部分访问权限时,可以仅突出显示最近选择的照片和视频。这可以改善经常请求访问照片和视频的应用程序的用户体验。通过在查询 MediaStore 时通过 ContentResolver 启用 QUERY_ARG_LATEST_SELECTION_ONLY 参数来实现此目的。
kotlin
val externalContentUri = MediaStore.Files.getContentUri("external")
val mediaColumns = arrayOf(
FileColumns._ID,
FileColumns.DISPLAY_NAME,
FileColumns.MIME_TYPE,
)
val queryArgs = bundleOf(
// 仅返回最后一次选择的项目(选择的照片访问)
QUERY_ARG_LATEST_SELECTION_ONLY to true,
// 基于添加到设备存储的时间对返回的项目进行按时间顺序排序
QUERY_ARG_SQL_SORT_ORDER to "${FileColumns.DATE_ADDED} DESC",
QUERY_ARG_SQL_SELECTION to "${FileColumns.MEDIA_TYPE} = ? OR ${FileColumns.MEDIA_TYPE} = ?",
QUERY_ARG_SQL_SELECTION_ARGS to arrayOf(
FileColumns.MEDIA_TYPE_IMAGE.toString(),
FileColumns.MEDIA_TYPE_VIDEO.toString()
)
)
val cursor = contentResolver.query(externalContentUri, mediaColumns, queryArgs, null)
内容 URI 的权限检查
Android 15 引入了一组新的 API,用于对内容 URI 进行权限检查。它们包括:
Context.checkContentUriPermissionFull
:对内容 URI 执行完整的权限检查。- Activity 清单属性
requireContentUriPermissionFromCaller
:在活动启动时强制执行指定的权限。 - 用于 Activity 调用者的
ComponentCaller
类:表示启动活动的应用程序。
安全的后台活动启动
Android 15 通过添加更改来保护用户免受恶意应用的侵害,并使他们对其设备拥有更多控制权,防止恶意后台应用程序将其他应用程序置于前台、提升其特权并滥用用户交互。自 Android 10 以来,已经限制了后台活动启动。
在同一任务中的恶意应用程序可以启动另一个应用程序的活动,然后将自身覆盖在其上,从而制造出作为该应用程序的假象。这种"任务劫持"攻击绕过了当前的后台启动限制,因为它全部发生在同一个可见任务中。为了减轻这种风险,我们添加了一个标志,阻止与堆栈顶部 UID 不匹配的应用程序启动活动。为了为您的应用程序的所有活动选择加入此保护,请更新应用程序的 AndroidManifest.xml 文件中的 allowCrossUidActivitySwitchFromBelow
属性:
xml
<application android:allowCrossUidActivitySwitchFromBelow="false" >
一旦您的应用程序选择加入新的保护措施,可以在 Activity 内部使用此 API 来选择退出特定的共享活动:
java
public void onCreate(Bundle bundle) {
super.onCreate(bundle);
setAllowCrossUidActivitySwitchFromBelow(true);
...
}
了解更多关于从后台启动活动的限制。
https://developer.android.cn/guide/components/activities/background-starts
更安全的Intent
Android 15 引入了新的安全措施,使 Intent 更加安全和稳健。这些改进旨在防止潜在的漏洞和 Intent 的误用,这些漏洞和误用可能被恶意应用程序利用。Android 15 中对 Intent 安全性的改进主要有两点:
匹配目标 Intent 过滤器 :针对特定组件的 Intent 必须准确匹配目标的 Intent 过滤器规范。如果您发送一个用于启动另一个应用程序活动的 Intent,则目标 Intent 组件需要与接收活动声明的 Intent 过滤器相匹配。
Intent 必须具有动作:不带动作的 Intent 将不再匹配任何 Intent 过滤器。这意味着用于启动活动或服务的 Intent 必须具有明确定义的动作。
重要提示:这些改进将成为严格模式的一部分。如果您想尝试它们,请添加以下方法:
java
public void onCreate() {
StrictMode.setVmPolicy(VmPolicy.Builder()
.detectUnsafeIntentLaunch()
.build());
...
将最低目标 SDK 版本从 23 增加到 24
Android 15 将安装应用程序所需的最低目标 SDK 版本从 23 增加到 24,这在 Android 14 中的最低目标 SDK 变更基础上构建。过时的应用程序通常缺乏最新的安全保护措施,使设备和数据容易受到攻击。要求应用程序符合现代 API 级别有助于确保更好的安全性和隐私。
如果您尝试安装一个目标 API 级别低于 24 的应用程序,您将在 Logcat 中看到一个错误:INSTALL_FAILED_DEPRECATED_SDK_VERSION:App package must target at least SDK version 24, but found 7.
优质的设备体验
Android 15 包括一些功能,帮助您的应用程序改善使用 Android 设备的体验,包括更流畅的过渡效果、更有帮助的用户界面、针对大屏幕设备的更新以及设计师更多美观的选择。
改进的大屏幕多任务处理
Android 15 beta 2 为大屏幕设备的多任务处理提供了更好的方式。例如,用户可以将任务栏固定在屏幕上,以便快速在应用程序之间切换,或者保存他们喜欢的分屏应用程序组合以便快速访问。这意味着确保您的应用程序具有适应性比以往任何时候都更重要。Google I/O 有关于构建适应性 Android 应用程序和使用 Material 3 适应性库构建 UI 的会议,可以提供帮助,我们的文档中还有更多帮助您为大屏幕设计的内容。
窗口插图
除了边到边的强制执行外,在 Android 15 中,当目标 SDK 版本为 35+ 时,Configuration.screenWidthDp
和 screenHeightDp
现在包括系统栏的深度。虽然这些值仍然可以用于资源选择(例如 res/layout-h500dp
),但不建议将它们用于布局计算。
画中画
Android 15 在画中画(PiP)方面引入了新的变化,确保进入画中画模式时过渡更加平稳。这将有利于具有 UI 元素叠加在其主 UI 上的应用程序进入画中画模式。当前,onPictureInPictureModeChanged
用于定义切换叠加 UI 元素的可见性的逻辑。此回调在 PiP 进入或退出动画完成时触发。从 Android 15 开始,我们在 PictureInPictureUiState
类中引入了一个新的状态。当 PiP 进入动画开始时,将调用 onPictureInPictureUiStateChanged
回调,并且应用程序可以隐藏叠加的 UI 元素。
kotlin
override fun onPictureInPictureUiStateChanged(pipState: PictureInPictureUiState) {
if (pipState.isTransitioningToPip()) {
// 隐藏 UI 元素
}
}
override fun onPictureInPictureModeChanged(isInPictureInPictureMode: Boolean) {
if (isInPictureInPictureMode) {
// 取消隐藏 UI 元素
}
}
对于 PiP 窗口,这种快速切换不相关 UI 元素的可见性,将确保进入 PiP 的动画更加平滑,没有闪烁。
使用生成的预览丰富的小部件预览
通过显示个性化预览使您的小部件脱颖而出。针对 Android 15 的应用程序可以向小部件选择器提供 Remote Views,以便它们可以更新选择器中的内容,使其更能代表用户将看到的内容。应用程序可以使用 AppWidgetManager 的 setWidgetPreview、getWidgetPreview 和 removeWidgetPreview 方法,使用最新的个性化信息更新其小部件的外观。
预测式返回
预测式返回在使用手势导航时提供了更加流畅、直观的导航体验,利用内置动画告知用户其操作将带他们去哪里,以减少意外结果。在 Android 15 中,预测式返回将不再位于开发者选项之后,因此对于已正确迁移的应用程序,系统动画,例如返回主页、跨任务和跨活动,将出现。
为通知渠道设置振动效果
Android 15 beta 2 现在支持通过 NotificationChannel.setVibrationEffect 为通知渠道设置丰富的振动效果,因此您的用户可以在不查看设备的情况下区分不同类型的通知。
Health Connect 的新数据类型
Health Connect 是用户控制和管理其健身数据访问的集中方式,正在添加对更多健康和健身用例的支持。此版本有 2 种新的数据类型:皮肤温度和训练计划。
皮肤温度跟踪允许用户从可穿戴设备或其他跟踪设备中存储和共享更准确的温度数据。
训练计划是帮助用户实现其健身目标的结构化锻炼计划。训练计划支持包括:
围绕燃烧的卡路里、距离、持续时间、重复次数和步数的完成目标
围绕尽可能多的重复次数(AMRAP)、节奏、心率、功率、感知努力率和速度的性能目标
"选择您的称谓" 系统偏好设置
最初仅适用于法语,但很快将扩展到其他性别语言,用户可以使用语法性别首选项自定义 Android 系统如何称呼他们。新设置可以在系统语言设置中找到:设置 → 系统 → 语言和输入 → 系统语言 → 选择您的称谓。
ICU语言和字体
- Android 15 Beta 2 包含了 ICU 74 的 API 相关更新。
- ICU 74 包含了来自 Unicode 15.1 的更新,包括新字符、表情符号、安全机制以及相应的 API 和实现,以及 CLDR 44 区域设置数据的更新,其中包括新的区域设置和各种添加和更正。
- 从 Android 15 开始,中文、日文和韩文语言的字体文件 NotoSansCJK 现在是一个可变字体。可变字体为中日韩语言的创意排版开辟了新的可能性。设计师可以探索更广泛的风格,并创建以前难以或不可能实现的视觉效果。
- Android 15 中默认捆绑了一个用于旧日语平假名(称为 Hentaigana)的新字体文件。Hentaigana 字符的独特形状可以为艺术作品或设计增添独特的风采,同时有助于保持古代日本文件的准确传输和理解。
避免文字被裁剪
一些草书字体或具有复杂形状的语言字符可能会将字母绘制在前一个或后一个字符的区域内。这样的字母可能会在起始位置或结束位置被裁剪。从 Android 15 开始,TextView 为这样的字母分配额外的宽度,并在左侧添加额外的填充。
由于这会改变 TextView 决定宽度的方式,如果应用程序的目标为 Android 15 或更高版本,则 TextView 默认情况下会分配更多的宽度。您可以通过调用 TextView 上的 setUseBoundsForWidth API 来启用或禁用它。由于添加左填充可能会导致现有布局的错位,因此即使目标是 Android 15 或更高版本,填充也不会默认添加。
为了添加额外的填充以防止裁剪,调用 setShiftDrawingOffsetForStartOverhang
。
xml
<TextView
android:fontFamily="cursive"
android:text="java" />
xml
<TextView
android:fontFamily="cursive"
android:text="java"
android:useBoundsForWidth="true"
android:shiftDrawingOffsetForStartOverhang="true" />
xml
<TextView
android:text="คอมพิวเตอร์" />
xml
<TextView
android:text="คอมพิวเตอร์"
android:useBoundsForWidth="true"
android:shiftDrawingOffsetForStartOverhang="true" />
App兼容
- 着重测试应用在 Android 15 上的兼容性,因为更多设备正在进入该计划。
- 未来几周内,预计会有更多用户在 Android 15 上尝试你的应用,并提出问题。
- 为了测试兼容性,安装已发布的应用程序在运行 Android 15 beta 的设备或模拟器上,并测试所有应用程序的流程。
- 需要审查行为变化以便集中测试。
- 解决任何问题后,尽快发布更新。
- 平台稳定性里程碑预计将于 2024 年 6 月达到,届时将提供最终的 SDK/NDK API、最终的内部 API 和面向应用的系统行为。
- 在正式发布之前,你将有几个月的时间进行最终测试。