1.行为变更
1.1隐私权
1.1.1针对附近 Wi-Fi 设备的新运行时权限
Android 13 引入了NEARBY_WIFI_DEVICES运行时权限,该权限属于NEARBY_DEVICES
权限组,适用于会管理设备与附近 Wi-Fi 接入点连接情况的应用。借助此权限,您可以更轻松地说明应用为何访问附近的 Wi-Fi 设备;在以前的 Android 版本中,这类应用则需要声明ACCESS_FINE_LOCATION权限。
如果您的应用以 Android 13 为目标平台并调用多个不同的 Wi-Fi API,则必须从用户处获得这项新权
注意:如果您的应用尝试在未获得适当权限的情况下调用 Wi-Fi API,则会发生SecurityException。
1.1.2受影响的用例
这项新权限会影响几个不同的 Wi-Fi 用例,包括以下用例:
查找或连接到附近的设备,如打印机或媒体投射设备。通过该工作流,您的应用可以完成以下类型的任务: 通过带外方式(例如通过 BLE)接收 AP 信息。使用仅限本地使用的热点,通过 Wi-Fi 感知和连接功能发现并连接到设备。通过 Wi-Fi 直连发现和连接到设备。发起与已知 SSID(例如汽车或智能家居设备)的连接。开启仅限本地使用的热点。连接到附近的 Wi-Fi 感知设备。
1.1.3该权限属于“附近的设备”权限组
NEARBY_WIFI_DEVICES
权限是附近的设备权限组的一部分。此权限组在 Android 12(API 级别 31)中添加,还包含与蓝牙和超宽带相关的权限。如果您的应用请求此权限组中的多项权限,用户会看到一个运行时对话框,其中会请求用户批准您的应用访问附近的设备。在系统设置中,用户必须以组的形式启用和停用附近的设备权限;例如,针对给定应用,用户无法既停用其 Wi-Fi 访问权限,但又保持启用其蓝牙使用权限。
1.1.4坚定地声明您的应用不会推导物理位置
在以 Android 13 为目标平台时,请考虑您的应用是否会通过 Wi-Fi API 推导物理位置;如果不会,则应坚定声明此情况。如需做出此声明,请在应用的清单文件中将usesPermissionFlags
属性设为neverForLocation
,如以下代码段所示。此过程类似于您声明绝不会将蓝牙设备信息用于获取位置信息时的过程:
<manifest ...><uses-permission android:name="android.permission.NEARBY_WIFI_DEVICES"android:usesPermissionFlags="neverForLocation" /><application ...>...</application></manifest>
1.1.5保持后向兼容性
由于NEARBY_WIFI_DEVICES
权限仅适用于 Android 13 或更高版本,因此您应保留对ACCESS_FINE_LOCATION的所有声明,以便在您的应用中提供向后兼容性。不过,只要您坚定声明应用不会使用 Wi-Fi API 推导物理位置信息,就可以将此权限的最高 SDK 版本设为32
,如下以下代码段所示:
<manifest ...><uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"android:maxSdkVersion="32" /><application ...>...</application></manifest>
1.1.6请注意,某些 API 仍需要位置信息权限
有几个 Wi-Fi API 仍然需要ACCESS_FINE_LOCATION
权限才能获取位置信息,就像它们在 12L 及更低版本上的一样。示例包括WifiManager
类中的以下方法:
getScanResults()startScan()
1.1.7检查需要新权限的 API
如果您的应用以 Android 13 或更高版本为目标平台,您必须声明NEARBY_WIFI_DEVICES
权限才能调用以下任何 Wi-Fi API:
WifiManager
startLocalOnlyHotspot()WifiAwareManager
attach()WifiAwareSession
publish()subscribe()WifiP2pManager
addLocalService()connect()createGroup()discoverPeers()discoverServices()requestDeviceInfo()requestGroupInfo()requestPeers()WifiRttManager
startRanging()
1.1.8Wi-Fi 访问工作流
图 1 显示了搭载 12L 或更低版本的设备上的 Wi-Fi 访问工作流。请注意对ACCESS_FINE_LOCATION
权限的依赖。
图 1.用于确定以 12L 或更低版本为目标平台的应用是否可以获取 Wi-Fi 信息的流程图。
图 2 显示了搭载 Android 13 或更高版本的设备上的 Wi-Fi 访问工作流(对于以 Android 13 或更高版本为目标平台的应用)。请注意,只要您声明应用不会根据 Wi-Fi 设备信息推导物理位置信息,就不再需要声明ACCESS_FINE_LOCATION
权限:
图 2.用于确定以 Android 13 或更高版本为目标平台的应用是否可以获取 Wi-Fi 信息的流程图。
1.2安全
1.2.1intent 过滤器会屏蔽不匹配的 intent
在现有实现中,“intent 过滤器”一词不合常理,因为它不会过滤传递给某个组件的 intent;而是仅在隐式 intent 的 intent 解析期间相关。当应用在其清单中注册某个导出的组件并添加<intent-filter>
时,该组件可以由任何 intent 启动,即使那些 intent 与 intent 过滤器不匹配也可以。
启动组件时,如果不检查 intent,在某些情况下,这让外部应用能够触发本应属于应用内部的功能。
在此变更之前,可通过两种方法将 intent 传递给存在 intent 与所声明<intent-filter>
元素不匹配情况的组件(例如<activity>
):
显式 intent:已设置组件名称的 intent;只要发送者有相应权限,这种 intent 始终会传递给相应组件。
intent 选择器:当将匹配的 intent 设置为主 intent 的选择器时,系统将始终传递主 intent。
对于以 Android 13 或更高版本(即 intent 接收端)为目标平台的应用,当且仅当导出的组件与其声明的<intent-filter>
元素相匹配时,系统才会将来自外部应用的所有 intent 传递给该组件。
不匹配的 intent 会被屏蔽。未强制执行 intent 匹配的例外情况包括:
传送到未声明任何 intent 过滤器的组件中的 intent来自同一应用内、来自系统和来自根的 intent
2.功能和 API 概览
Android 13 面向开发者引入了一些出色的新功能和 API。以下几部分内容可帮助您了解适用于您的应用的功能并开始使用相关 API。
有关新增、修改和移除的 API 的详细列表,请参阅API 差异报告。如需详细了解新的 API,请访问Android API 参考文档- 新 API 会突出显示以方便查看。此外,如需了解平台变更可能会在哪些方面影响您的应用,请务必查看会影响以 Android 13 为目标平台的应用和所有应用的 Android 13 行为变更。
2.1用户体验
2.1.1带主题的应用图标
图 1:在 Android 13 中选择启用带主题的应用图标
从 Android 13 起,用户可以选择启用带主题的应用图标。借助此功能,用户可以调节受支持的 Android 启动器中应用图标的色调,以继承所选壁纸和其他主题的配色。
如需支持此功能,您的应用必须提供单色应用图标,并通过清单中的<adaptive-icon>
元素指向该图标。如果用户在其设备上启用了带主题的图标切换开关,系统会使用用户所选壁纸和主题的配色来确定色调颜色,然后该颜色将用于单色应用图标。
规范
您的单色应用图标应符合以下规范:
它应该是VectorDrawable。我们建议该徽标适合 90x90 dp 容器中的 36x36 dp 的区域内。如果需要更大尺寸的徽标,最大可以为 60x60 dp。我们建议您使用平面徽标;如果您的徽标是三维的,那么您可以使用 Alpha 渐变。
大多数应用都可以重复使用用于通知的矢量可绘制对象。
以下示例展示了 Google 应用的单色应用图标,其中虚线表示徽标和容器区域之间的边界。此处显示的边界仅用于图示说明,其大小不可调整。
图 2:带主题的应用图标的测量值
1容器区域 (90x90 dp)。
2徽标区域(建议尺寸为 36x36 dp,最大尺寸为 60x60 dp)。
实现带主题的应用图标
将monochrome android:drawable
属性添加到<adaptive-icon>
元素中。例如,在res/mipmap-anydpi-v26/ic_launcher.xml
中:
<adaptive-icon ><background android:drawable="..." /><foreground android:drawable="..." /><monochrome android:drawable="@drawable/myicon" /></adaptive-icon>
在您的清单文件中,使用android:icon
定义图标:
<application…android:icon="@mipmap/ic_launcher"…></application>
注意:如果清单中同时包含android:roundIcon
和android:icon
,您必须移除对android:roundIcon
的引用,或者在由android:roundIcon
属性定义的可绘制对象中提供单色图标。
2.1.2Quick Settings Placement API
通过通知栏中的“快捷设置”,用户可无需离开应用上下文就能方便地更改设置或执行快速操作。对于提供自定义图块的应用,用户可以更轻松地发现图块并将其添加到“快捷设置”。借助新的图块放置 API,您的应用现在可以提示用户直接将自定义图块添加到一组有效的快捷设置图块中。借助新的系统对话框,用户只需一步即可不离开应用就添加图块,而不必转到“快捷设置”来添加图块。
2.1.3为多语言用户提供更好的支持
Android 13 引入了几项功能来改进多语言用户的应用体验,具体介绍请参阅以下几部分:
按应用设定的语言偏好设置
在许多情况下,多语言用户会将其系统语言设置为某一种语言(例如英语),但又想为特定应用选择其他语言(例如荷兰语、中文或印地语)。为了帮助应用为这些用户提供更好的体验,Android 13 引入了一些API,它们使应用可在运行时设置在界面中显示不同语言。
使用自定义应用内语言选择器的应用可以使用这些新 API 来减少显示应用内语言选择器所需的样板代码量。为了支持旧版 Android 平台,我们将在即将发布的 Jetpack 库版本中添加类似的 API。
不支持多种语言的应用不受这些变更的影响。
如需了解详情,请参阅按应用设定的语言偏好设置页面。
Unicode 库更新
Android 13 添加了一些最新改进、修复和变更,均包含在Unicode ICU 70、Unicode CLDR 40和Unicode 14.0中。
以下是两项显著变更:
英语(加拿大)en‑CA
和英语(菲律宾)en‑PH
在无可用的翻译资源时均使用英语(美国)en
翻译资源,而非英语(英国)en‑GB
翻译资源。针对西班牙语es
、意大利语it
、葡萄牙语pt
和葡萄牙语(葡萄牙)pt‑PT
引入了many
复数类别。与CLDR v38中引入的法语类似,此类别适用于大数目。
2.1.4更快断字
断字让分行的文本更易于阅读,并且有助于使界面更具自适应性。在 Android 13 中,我们将断字性能优化了多达 200%,因此您现在可以在TextView
中启用断字功能,这几乎不影响渲染性能。如需启用更快断字功能,请在setHyphenationFrequency()中使用新的fullFast或normalFast频率。
2.2图形
2.2.可编程的着色器
改写自此GLSL 着色器的 AGSL 动画着色器。
Android 13 添加了对可编程RuntimeShader对象的支持,其行为是使用 Android 图形着色语言 (AGSL) 定义的。AGSL 与 GLSL 共用大部分语法,但可用于 Android 渲染引擎中以自定义 Android 画布中的绘制行为以及过滤 View 内容。Android 在内部使用这些着色器来实现涟漪效果、模糊以及拉伸滚动,并且 Android 13 让您能为应用制作类似的高级效果。
2.3核心功能
OpenJDK 11 更新
Android 13 开始刷新 Android 的核心库,以与 OpenJDK 11 LTS 版本保持一致,并增添了适合应用和平台开发者的库更新和 Java 11 语言支持。Android 13 中引入的核心库变更还可以通过 Google Play 系统更新到 ART Mainline 模块,供 Android 12 设备使用。
Android 13 包含对核心库的以下更改:
支持将var
关键字用于局部变量,以及用作参数 lambda。
String 类中的新方法:
isBlank()
lines()
repeat()
strip()
stripLeading()
stripTrailing()
支持Collection.toArray(IntFunction)
,以便更轻松地使集合适应数组。
支持java.util
类Optional
、OptionalDouble
、OptionalInt
和OptionalLong
中的ifPresentOrElse()
、isEmpty()
、orElseThrow()
和stream()
。
扩展了对SocketOptions
的支持,包括重复使用套接字。
NullReader
、NullWriter
、InputStream
、OutputStream
和transferTo()
Reader
功能,用于将读取的字符传输给Writer
。
添加了使用Charsets
进行网址编码和解码的功能。
适用于FileReader
、FileWriter
、PrintStream
和PrintWriter
的Charset
功能。
为ByteArrayInput
或OutputStream
以及Input
或OutputStream
新增了transferTo()
、readNBytes()
、readAllBytes()
和writeBytes()
函数。
对java.lang.invoke.VarHandle
的运行时和编译器支持。
在内部使用VarHandle
将java.util.concurrent
更新到 OpenJDK 11 API。
Java 和 OpenJDK 是 Oracle 及/或其关联公司的商标或注册商标。
如果觉得《Android 13 开发者预览版》对你有帮助,请点赞、收藏,并留下你的观点哦!