关于android:新版本系统适配-Android-12-中的兼容性变更

96次阅读

共计 6267 个字符,预计需要花费 16 分钟才能阅读完成。

随着 Android 12 正式版 的公布,越来越多的用户将降级至最新版本。Android 12 带来大量新 API 和性能更新的同时也带来了平台兼容性的变更,咱们倡议开发者优先对以后利用进行测试,并进行兼容性更新。这样一来,当用户将设施更新至 Android 12 时,可确保其领有良好的体验。

本文将重点介绍 Android 12 中最大的兼容性变更,并分享无关如何让用户顺利过渡到最新版本零碎的一些倡议。此外,咱们还会分享一些来自当先利用的案例和倡议,以帮忙您理解其余开发者如何充分利用 Android 12 的性能,以及如何借鉴到本人的利用中。

如果您更喜爱通过视频理解此内容,请在此处查看:

https://www.bilibili.com/vide…

△ 新版本零碎适配: Android 12 中的兼容性变更

Android 12 中的变更

兼容性变更次要分为两类,一类默认影响所有运行的利用,另一类则只基于利用已申明的指标 SDK 级别对其产生影响。不便起见,本文将在变更题目中加以备注以帮忙您更好地理解对应变更内容对您利用的影响。

Android 12 采纳全新的个性化 Material Design 实现了跨越式的视觉更新。咱们始终致力于简化和欠缺现有体验并帮忙您构建好看、平安和高性能的利用来满足用户需要。为此,咱们专一于用户界面、性能和隐衷三大方面进行优化。本文中将次要介绍 Android 12 在用户界面和性能方面的变更。

用户界面相干的变更

利用开屏页 (影响所有利用)

从 Android 12 开始,零碎会在冷启动和暖启动利用时都应用新的默认开屏页。该开屏页由利用的启动图标和主题的 windowBackground 组成,并在启动时展示顺滑、晦涩的过渡动画。

△ Android 12 中的默认开屏页

这种全新的体验实用于所有运行在 Android 12 上的利用。如果您的利用实现了自定义开屏页,则须要迁徙到新的 SplashScreen API。咱们倡议应用 Jetpack 的 SplashScreen 库来实现向后兼容性,以在所有 Android 版本中提供统一的观感。

因为新开屏页可齐全自定义,因而,即便您现有的开屏页用于路由,咱们也倡议将其齐全移除。这样将防止开屏页反复,而且能缩小加载工夫。

如需理解具体的适配流程,请查阅 Android 开发者网站的 迁徙指南。

自定义告诉 (仅影响 targetSdkVersion 为 31 的利用)

Android 12 更改了齐全自定义告诉的外观和行为,使其在视觉上保持一致且易于浏览,并为用户提供可检测到的、相熟的告诉开展状态。

△ Android 12 的告诉款式

在之前,自定义告诉能应用整个告诉区域,并能提供本人的布局和款式。对于面向 Android 12 的利用,带有自定义内容视图的告诉将不再应用整个告诉区域,零碎改而应用规范模板。

△ Android 12 之前和之后自定义告诉可应用的区域比照

该模板确保自定义告诉在所有状态下的装璜与其余告诉雷同,例如图标、利用名、开展和收起状态标识。该变更会影响应用自定义 Notification.Style 子类或应用 Notification.Builder 办法设置自定义内容视图的利用。如果您的利用正在应用齐全自定义告诉,请务必测试这类告诉是否可能兼容新模板。

△ 受影响的自定义内容视图的 API

沉迷式模式下的手势导航 (影响所有利用)

Android 12 还整合了现有行为,让用户在沉迷模式下更轻松地执行手势导航命令。即便处于沉迷式模式下,零碎手势也会立刻响应。BEHAVIOR_SHOW_BARS_BY_TOUCH 和 BEHAVIOR_SHOW_BARS_BY_SWIPE 这两种行为现已弃用,被新的 BEHAVIOR_DEFAULT 行为所取代。BEHAVIOR_DEFAULT 行为让用户只需滑动一次即可执行手势导航,而在 Android 11 上则须要滑动两次。即便是开发全屏游戏的体验,仍可在沉迷模式下通过应用 BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE 标记来避免用户受到误触手势的影响。

△ Android 12 中沉迷式模式下的手势导航

性能相干的变更

前台服务 (仅影响 targetSdkVersion 为 31 的利用)

前台服务能让 Android 零碎确保资源优先用于实现用户发动的耗时工作,但它常常被滥用。咱们发现简直一半的前台服务是从后盾启动的,这导致了许多问题,包含电量会被迅速耗尽,以及用户会被意外的前台服务告诉困扰等。因而从 Android 12 开始,将禁止从后盾启动前台服务,并对启动前台服务作了限度。以下状况可启动前台服务:

  • 可见的 Activity 或窗口
  • 用户操作,如告诉、小部件等等
  • 特定的播送和回调
  • STICKY 类型的服务可在解体或因为低内存而进行运行的状况下重启

无关前台服务启动限度的残缺豁免列表,请查阅 Android 开发者网站—— 前台服务。

往年早些时候,咱们在 Jetpack 的 WorkManager 库中引入了加急工作。这些低提早工作可从前台或后盾调用并会立刻执行。这些工作可在低电量模式下运行。咱们激励开发者尽可能应用这些工作来代替启动前台服务。

准确闹钟权限 (仅影响 targetSdkVersion 为 31 的利用)

在大多数状况下,利用应应用粗精确度闹钟,其劣势在于省电。在闹钟和计时器等非凡状况下,可应用准确闹钟。Android 12 新增了一项清单权限——SCHEDULE_EXACT_ALARM,用户可查看并管制领有此权限的利用。此外,还新增了一个新的 API —— canScheduleExactAlarms(),您可应用此 API 来查看利用的权限状态。

告诉 trampoline (Notification trampolines,仅影响 targetSdkVersion 为 31 的利用)

一些利用在解决用户点击告诉的行为时,会应用播送接收器或服务等两头组件,这些组件被称为告诉 trampoline,它们经常导致提早和用户流程中断,面向 Android 12 的利用将不能从这些蹦床启动 Activity。这一新限度有助于缩小从告诉启动利用的提早。咱们激励弃用告诉 trampoline 并间接从告诉启动指标 Activity。举个例子,在弃用告诉 trampoline 后,Google 相册利用的启动速度进步了 34%。如果您的利用应用了告诉 trampoline,请应用以下 adb 命令查看用户与告诉交互时所启动的组件:

$ adb shell dumpsys activity service \ 
com.android.systemui/.dump.SystemUIAuxiliaryDumpService

△ 应用该命令查看用户与告诉交互时所启动的组件

利用链接 (仅影响 targetSdkVersion 为 31 的利用)

Android 反对利用链接的概念,它能够让 HTTP 网址间接链接到已装置的利用。这样便可齐全绕过消歧对话框,通过打消用户应用过程中的一致来改善用户体验。利用链接与深层链接的区别在于利用链接只能解决 HTTP 模式,而深层链接能够解决任何模式。

不同于以前的版本,Android 12 将始终为未验证的链接关上默认浏览器。这可能是利用链接在行为方面最重要的变更。Android 12 还引入了逐条链接验证,因而,如果存在任何服务器端集成或配置谬误,将仅限于未通过验证的链接,您能够应用新 DomainVerificationManager API 查看域名验证状态,并在须要时将用户带到「设置」以便批准利用应用的域名。如需理解详情,请参阅 Android 开发者网站—— 验证 Android 利用链接。

△ 应用利用链接绕过消歧对话框中转已装置利用

兼容性框架工具

当初咱们已理解 Android 12 中的新性能和变更,上面咱们来看看让利用兼容的测试和工具。在 Android 11 中咱们引入了兼容性框架工具以便针对变更更轻松地测试和调试利用。有了这些工具您能够独自关上和敞开某个重大变更并评估其对利用的影响。通过这种形式,您能够一次只针对一项行为变更进行隔离和测试,或轻松启用 targetSDK 对应的变更。

△ 开发者选项 > 利用兼容性变更

您能够应用开发者选项、logcat 或 adb 命令来查看以后启用的行为变更。对于每项行为变更,当利用首次调用受影响的 API 时,零碎会输入一条相似这样的 logcat 音讯:

D CompatibilityChangeReporter: Compat change id reported: 170668199 ;
UID 10265; state: ENABLED

△ Logcat 为某项变更的输入示例

您能够应用以下 adb 命令列出零碎已知的所有兼容性变更 (包含已启用和禁用的变更) 及其以后的启用状况。列表中的每项变更都有名称、供援用的变更 ID 和启用 / 禁用状态。

$ adb shell dumpsys platform-compat

△ 应用 adb 命令列出零碎已知的所有兼容性变更

还能够应用以下 adb 命令关上或敞开某个软件包的变更:

$ adb shell am compat enable|disable|reset <CHANGE_ID | CHANGE_NAME> <PACKAGE_NAME>

△ 应用 adb 命令设置单个利用的变更

在根本测试中无需更改 targetSdkVersion 或从新编译利用,Android 平台会主动调整其外部逻辑。因为可独自关上或敞开变更,因而可逐个进行隔离测试、调试行为变更,或禁用导致问题的单项变更。

请留神,因为只能关上或敞开可调试利用的变更。因而,如果在兼容性框架中未看到您的利用请确保在清单中将利用设置为可调试:

<application
    android:debuggable="true">

△ 在清单文件中将利用设置为可调试

请记住在已签名的 Android 公布版本上,无奈批改影响所有利用的变更的启用状态。Android 12 增加了新的 adb 命令来测试和验证利用的利用链接。您可应用这些命令在设施上手动验证链接,或将其增加到继续集成工具链中。

// 革除利用任何曾经验证的状态:$ adb shell pm set-app-links --package PACKAGE_NAME 0 all
 
// 开始验证测试:$ adb shell pm verify-app-links --re-verify PACKAGE_NAME
 
// 查看测试后果:$ adb shell pm get-app-links PACKAGE_NAME

△ 在 Android 12 中应用这些 adb 命令测试利用链接

请务必尝试应用 Android Studio Arctic Fox 进行开发和测试。咱们已增加 lint 查看来帮忙您发现代码可能受 Android 12 变更影响的中央。例如自定义开屏页、针对准确地位应用的粗略地位权限、媒体格式等。当然,首先要做的就是设置 Android 12 SDK。

开发者案例

当初咱们将展现一些开发者曾经适配 Android 12 的胜利案例。因为适配了 Android 12,他们的用户便能够充分利用这种新体验。

左近设施权限 (仅影响 targetSdkVersion 为 31 的利用)

Withings 的 HealthMate 利用让用户能通过蓝牙连贯和同步 Withings 的设施。Android 12 引入了一项新权限将蓝牙扫描与地位权限拆散。

△ HealthMate 利用申请左近设施权限

对咱们而言,左近设施权限是 Android 12 中最重要的变更之一。

Withings HealthMate

在隐衷层面上,很难向终端用户解释地位权限与蓝牙的关系。有好几年,Withings 的团队不得不在客户服务主题和教程方面投入老本,以便用户理解利用须要地位权限能力扫描蓝牙的起因。即便做了充沛的解释,该团队也因申请地位权限而收到了负面反馈。

相比之下,左近设施权限更无效。因为它只在扫描和连贯时要求权限。Withings 的工程师提出了一些倡议:

  • 将检查和申请新权限的逻辑进行形象。这有助于管制入口点并尽可能减少测试工作;
  • 在所有受反对的 Android 版本上对所有权限查看进行单元测试;
  • 应用 Android 真机并测试不同的降级场景以确保利用失常运行;
  • 如果利用在之前的 Android 版本上取得了地位权限,当用户降级到 Android 12 时,该利用将主动被授予左近设施权限。

要应用新的左近设施权限,必须在清单文件中申明 BLUETOOTH_SCAN 权限:

<uses-permission
    android:name="android.permission.BLUETOOTH_SCAN"
    android:usesPermissionFlags="neverForLocation" />

△ 扫描左近设施时应在清单文件中申明权限

这是一项运行时权限,除了在清单中申明外,利用还必须在开始扫描设施之前,在运行时查看并申请此权限。您能够通过将 usesPermissionFlags 属性申明为 neverForLocation,来表明不打算应用扫描后果获取用户地位。

如果只须要连贯到设施,则能够申明 BLUETOOTH_CONNECT 权限:

<uses-permission
    android:name="android.permission.BLUETOOTH_CONNECT" />

△ 连贯设施时应在清单文件中申明权限

适度滚动成果 (Overscroll Effect,影响所有利用)

在 Android 12 上大多数利用都会有一种新的适度滚动拉伸成果。一些应用 Android 12 的 Beta 用户在 Signal 利用中滚动浏览音讯时,留神到了一种奇怪的成果:

△ Signal 利用中的奇怪成果

在 Signal 的案例中,利用反对自定义背景。该利用应用了一种可穿透界面层级的掩蔽算法,每当布局或滚动内容时,Signal 利用都会在屏幕上建设一个音讯气泡投影列表,而后利用将应用这些投影创立一个蒙版,并将其利用于给定的渐变色或纯色。

工程团队很快想出了一个利用 RecyclerView.ItemDecoration 的解决方案。尽早修复适度滚动问题可让 Signal 利用在新版设施上提供用户冀望的体验而不影响性能。

△ Signal 修复适度滚动问题后的成果

咱们为 Android 12 正式版及时修复了适度滚动的问题并为用户提供了对立的体验。

Signal Private Messenger

Signal 团队提出了一些倡议:

  • 留神混合模式及其作为附加层的工作原理。Android 12 适度滚动应用附加层来渲染拉伸成果,这可通过不同混合算法生成不同的后果;
  • 确保背景由 RecyclerView 渲染;
  • 在公布之前,执行一次全面质量检查,并解决用户对 Android 12 兼容性的反馈。

Signal 利用是提供愉悦用户体验的一个范例。侥幸的是,Android 版 Signal Private Messenger 为开源软件,您可在 GitHub 上查看其修复代码。

总结

在本文中,咱们介绍了 Android 12 给开发者及用户带来的最重要的几项变更,并提出局部倡议:

  • Android 12 带来了显著的视觉更新
  • 应用已提供的工具和倡议来测试您的利用
  • 从其余开发者处取得启发

更多变更相干内容,请参阅 Android 开发者网站——Android 12。

最重要的一点,记得测试您的利用并确认其与 Android 12 的兼容性。许多开发者已实现此工作,当初是时候为这些变更做好筹备并提供杰出的用户体验。咱们期待在 Android 12 上看到您的利用。

欢迎您 点击这里 向咱们提交反馈,或分享您喜爱的内容、发现的问题。您的反馈对咱们十分重要,感谢您的反对!

正文完
 0