Android 13 更新内容(开发必读)

功能和 API 概览

Android 13 面向开发者引入了一些出色的新功能和 API。以下几部分内容可帮助您了解适用于您的应用的功能并开始使用相关 API。

有关新增、修改和移除的 API 的详细列表,请参阅 API 差异报告。如需详细了解新的 API,请访问 Android API 参考文档 - 新 API 会突出显示以方便查看。此外,如需了解平台变更可能会在哪些方面影响您的应用,请务必查看会影响以 Android 13 为目标平台的应用和所有应用的 Android 13 行为变更。

开发者工作效率

带主题的应用图标

用户正在选择启用带主题的应用图标
从 Android 13 起,用户可以选择启用带主题的应用图标。借助此功能,用户可以调节受支持的 Android 启动器中应用图标的色调,以继承所选壁纸和其他主题的配色。

如需支持此功能,您的应用必须提供单色应用图标,并通过清单中的 <adaptive-icon> 元素指向该图标。如果用户在其设备上启用了带主题的图标切换开关,系统会使用用户所选壁纸和主题的配色来确定色调颜色,然后该颜色将用于单色应用图标。

如果您的应用未提供单色图标,但用户启用了带主题的图标切换开关,主屏幕上将会显示应用图标的标准版本。

规格

您的单色应用图标应符合以下规范:

它应该是 VectorDrawable。
我们建议该徽标适合 90x90 dp 容器中的 36x36 dp 的区域内。如果需要更大尺寸的徽标,最大可以为 60x60 dp。
我们建议您使用平面徽标;如果您的徽标是三维的,那么您可以使用 Alpha 渐变。
大多数应用都可以重复使用用于通知的矢量可绘制对象。

实现带主题的应用图标
将 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 属性定义的可绘制对象中提供单色图标。

Quick Settings Placement API

通过通知栏中的“快捷设置”,用户可无需离开应用上下文就能方便地更改设置或执行快速操作。对于提供自定义图块的应用,用户可以更轻松地发现图块并将其添加到“快捷设置”。借助新的图块放置 API,您的应用现在可以提示用户直接将自定义图块添加到一组有效的快捷设置图块中。借助新的系统对话框,用户只需一步即可不离开应用就添加图块,而不必转到“快捷设置”来添加图块。

为多语言用户提供更好的支持

Android 13 引入了几项功能来改进多语言用户的应用体验,具体介绍请参阅以下几部分:

按应用设定的语言偏好设置

在许多情况下,多语言用户会将其系统语言设置为某一种语言(例如英语),但又想为特定应用选择其他语言(例如荷兰语、中文或印地语)。为了帮助应用为这些用户提供更好的体验,Android 13 针对支持多种语言的应用引入了以下新功能:

  • 使应用可在运行时设置在界面中使用其他语言的 API

    使用自定义应用内语言选择器的应用应当使用这些新 API,以确保无论用户通过何种方式选择其语言偏好设置,都能获得一致的用户体验。这些新的 API 还有助于减少样板代码的编写。

    为了向后兼容以前的 Android 版本,我们还会从 Appcompat 1.6.0-alpha01 开始在 AndroidX 中提供这些 API。

  • 允许用户为每个应用选择首选语言的系统设置

不支持多种语言的应用不受这些变更的影响。

如需了解详情,请参阅按应用设定的语言偏好设置。

改进了日语文本换行

现在,TextView 可以按 Bunsetsu(最小自然语素单元)或短语而非字符进行文本换行,从而使日语应用的界面更加美观、易读。可以通过将 android:lineBreakWordStyle="phrase" 与 TextView 结合使用来利用此换行方式。

改进了非拉丁字母的行高

Android 13 通过使用适合每种语言的行高,改进了非拉丁文字(例如泰米尔语、缅甸语、泰卢固语和藏语)的显示。新的行高可防止字符被裁剪并改进了字符的放置。您的应用只需要以 Android 13 为目标平台就可以利用这些改进。请确保在采用新的行间距后对应用进行测试,因为这些更改可能会影响非拉丁语的界面。

文本转换 API

使用日语和中文等语言的用户会使用拼音输入法,这通常会导致搜索以及自动填充等功能的执行速度变慢。在 Android 13 中,应用可以调用新的文本转换 API,以便用户更快、更轻松地找到所需内容。例如,以前日语用户在进行搜索时需要执行以下步骤:

  1. 输入平假名作为其搜索字词(例如地点或应用名称)的发音
  2. 使用键盘将平假名字符转换为日语汉字
  3. 使用日语汉字字符重新进行搜索
  4. 最后获得搜索结果
    使用新的文本转换 API 时,日语用户可以输入平假名,然后不经过第 2 步和第 3 步就立即看到实时的日语汉字搜索结果。

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 中引入的法语类似,此类别适用于大数目。

更快断字

断字让分行的文本更易于阅读,并且有助于使界面更具自适应性。在 Android 13 中,我们将断字性能优化了多达 200%,因此您现在可以在 TextView 中启用断字功能,这几乎不影响渲染性能。如需启用更快断字功能,请在 setHyphenationFrequency() 中使用新的 fullFastnormalFast 频率。

彩色矢量字体

COLRv1 矢量表情符号(左侧)和位图表情符号(右侧)
Android 13 可支持呈现 COLR 版本 1 (COLRv1) 字体,并将系统表情符号更新成了 COLRv1 格式。COLRv1 是一种高度紧凑的新字体格式,该字体在任意大小下都可以快速清晰地呈现。

对于大多数应用,系统会处理所有工作,COLRv1 可以正常使用。不过,如果您的应用使用系统字体来实现自己的文本呈现,建议您对表情符号呈现进行测试。

蓝牙 LE 音频

低功耗 (LE) 音频是新一代无线音频,旨在取代传统蓝牙并支持新的使用情形和连接拓扑。通过该技术,用户能够与朋友和家人分享音频内容以及播放音频给他们听,也可以订阅信息、娱乐或无障碍用途的公共广播内容。这项新技术可以确保用户接收到高保真度的音频,而不必牺牲电池续航时间,并且还可以在不同使用情形之间无缝切换,这是传统蓝牙技术无法实现的。Android 13 内置对 LE 音频的支持,因此,开发者应该能够在兼容设备上免费获取相关的新功能。

MIDI 2.0

Android 13 可支持新的 MIDI 2.0 标准,包括能够通过 USB 连接 MIDI 2.0 硬件。此新版标准有诸多优点,如提升控制器精度、改善对非西方地区语调的支持,以及提高使用单一音符控制器时的表现力。

隐私权和安全

照片选择器

Android 13 提供了全新的照片选择器体验。应用启动照片选择器时,用户可选择与应用分享特定图片和视频(如个人资料照片),而不是授予应用查看整个媒体库的权限。

照片选择器可为用户提供更好的隐私保护,因为您的应用无需声明任何运行时权限。此外,照片选择器还为应用提供内置标准化界面,从而打造更一致的用户体验。

注意:现在,我们推荐使用照片选择器来访问用户的照片和视频。

针对附近 Wi-Fi 设备的新运行时权限

Android 13 在 NEARBY_DEVICES 权限组中引入了一项新的运行时权限,它适用于会管理设备与附近 Wi-Fi 接入点连接情况的应用。这些应用在调用多个不同的 Wi-Fi API 时必须声明新的权限 NEARBY_WIFI_DEVICES。此外,只要应用不会通过 Wi-Fi API 推导物理位置,那么在以 Android 13 或更高版本为目标平台时,就无需声明 ACCESS_FINE_LOCATION 权限。

详细了解附近的 Wi-Fi 设备权限。

可由开发者降级的权限

从 Android 13 开始,应用可以撤消先前由系统或用户授予的运行时权限。此 API 可以帮助应用保护用户的隐私。

如需撤消特定运行时权限,请将该权限的名称传入 revokeOwnPermissionOnKill()。如需同时撤消一组运行时权限,请将这组权限的名称传入 revokeOwnPermissionsOnKill()。撤消是异步发生的,会终止与应用的 UID 相关联的所有进程。

系统只有在安全的情况下才会触发撤消操作。具体而言,当有应用组件仍在前台运行,或者有另一个应用正在访问您应用的组件(如 content provider)时,不会发生撤消。如果您想立即撤消权限,可以调用 exit()。但是,对 exit() 进行此类调用可能会导致当前正在访问您应用的其他应用出现未定义的行为或崩溃。

注意:为了让系统设置表明您的应用不会访问特定权限组中的数据,您必须撤消该权限组中的所有权限。在这种情况下,调用 revokeOwnPermissionsOnKill() 会很有帮助。

APK 签名方案 v3.1

Android 13 可支持 APK 签名方案 v3.1,此方案在现有的 APK 签名方案 v3 的基础上进行了改进,解决了 APK 签名方案 v3 的一些已知问题。具体而言,v3.1 签名方案允许应用在单个 APK 中同时支持原始签名者和轮替签名者。此外,该方案还支持 SDK 版本定位功能,这会允许轮替定位到更高版本的平台。

v3.1 签名方案使用在 12L 或更低版本中无法识别的新分块 ID。因此,平台会应用以下签名者行为:

  • 搭载 Android 13 的设备会使用 v3.1 分块中的轮替签名者。
  • 搭载旧版 Android 的设备会忽略轮替签名者,而使用 v3.0 分块中的原始签名者。
    尚未轮替其签名密钥的应用无需执行任何其他操作。每当这些应用选择轮替时,系统都会默认应用新的 v3.1 签名方案。

已经轮替并希望继续使用 v3.0 签名分块中的轮替签名密钥的应用需要更新其 apksigner 调用:

apksigner sign --ks keystore.jks |
  --key key.pk8 --cert cert.x509.pem
  --rotation-min-sdk-version API_LEVEL
  [signer_options] app-name.apk

…其中 API_LEVEL 为 32 或更低的值。

图形

可编程的着色器

改写自此 GLSL 着色器的 AGSL 动画着色器。
Android 13 添加了对可编程 RuntimeShader 对象的支持,其行为是使用 Android 图形着色语言 (AGSL) 定义的。AGSL 与 GLSL 共用大部分语法,但可用于 Android 渲染引擎中以自定义 Android 画布中的绘制行为以及过滤 View 内容。Android 在内部使用这些着色器来实现涟漪效果、模糊以及拉伸滚动,并且 Android 13 让您能为应用制作类似的高级效果。

核心功能

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 及/或其关联公司的商标或注册商标。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,185评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,445评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,684评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,564评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,681评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,874评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,025评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,761评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,217评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,545评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,694评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,351评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,988评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,778评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,007评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,427评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,580评论 2 349

推荐阅读更多精彩内容