节约电量和电池

在 Wear OS 上,节能尤其重要。Wear OS 设计原则重点关注设备功耗,因为手表是一种小巧的设备,旨在用于短暂的交互。

与较大的移动设备相比,Wear OS 设备的电池更小,因此任何电池消耗都会更加明显。此外,与移动设备相比,用户需要花费更多精力为 Wear OS 设备充电。用户可以在一天中的不同时间间隔为移动设备充电,而他们需要将 Wear OS 设备从身体上取下才能进行充电。

要提高您的应用的能效,请遵循以下设计最佳实践

  • 您的应用设计应充分利用 Wear OS 的外形尺寸。它不应该直接复制您的移动应用。
  • 使用您现有的移动应用来帮助处理某些用例。例如,手表的互联网和同步功能很昂贵;考虑一下移动设备是否可以完成繁重的工作,而 Wear OS 设备接收数据更改。
  • 为较短的交互设计您的用例。
  • 考虑您使用哪些 Wear OS 事件,以及这些事件发生的频率。
  • 尽可能将应用的工作延迟到 手表正在充电时。这尤其适用于数据密集型任务,例如同步数据和组织数据库。

    如果设备正在充电并已连接到 Wi-Fi,请安排作业来预取用户可能希望在您的应用中看到的数据、图像和更新。

本指南将帮助您了解系统何时以及如何运行您的应用程序,以及如何限制应用程序的运行时间和电池消耗。要了解特定操作是如何实现的——例如加载应用程序或滚动列表——请访问与性能相关的指南,例如Wear OS 上的 Compose 性能指南

监控电池使用情况

要分析运行您的应用程序的 Wear OS 设备的电池统计信息,请在开发机器的终端窗口中输入以下命令

adb shell dumpsys batterystats

GitHub 上的一个库提供了一个电池统计信息解析器,这可能有助于与该命令一起运行。

影响电池寿命的事件

在考虑您的应用程序之前,值得更一般地考虑在 Wear OS 设备上消耗电量的事件。

下表显示了 Wear OS 应用程序中几个常见事件对电池寿命的相对影响。实际的电量消耗因设备而异。

事件 对电池寿命的影响 如何缓解
访问网络,包括 LTE 和 Wi-Fi 非常高 将非必要的网络访问延迟到设备充电时进行。
打开屏幕并启动交互模式 不要鼓励用户比必要的时间更长时间地保持屏幕开启。提供使用始终开启模式(也称为环境模式)的体验。
访问 GPS 传感器 如果可能,请等到用户请求访问 GPS。
保持 CPU 使用率高 使用 Jetpack Compose 消费流.
访问心率传感器 中等 在从传感器 API 接收回调时使用处理器的唤醒时间,例如在使用Wear OS 上的健康服务 时。
通过蓝牙访问另一个设备 中等 保持会话时间短。
保持唤醒锁 中等 减少手动创建唤醒锁,并使用 WorkManager

最大限度地减少屏幕开启时间

在您的 Wear OS 应用程序中,遵循以下屏幕使用原则

  • 屏幕开启锁:尽可能避免。要进行测试,请在系统设置中关闭始终开启显示,并观察屏幕是否在超时时间内关闭。
  • 动画:最大限度地减少复杂的动画,而是专注于简短的过渡,以获得更专业的视觉效果。特别是,避免长时间运行的动画和循环。如果需要循环,请在循环之间添加一个暂停,该暂停至少与动画本身一样长。
  • 环境模式下的唤醒时间:根据需要支持始终开启模式,例如适合健身用例。如果您的应用程序需要始终开启模式,请检查您的应用程序在设备处于环境模式 时是否执行以下操作

    • 减少设备屏幕亮度。
    • 不显示动画。
    • 不更新屏幕内容,除非在 onAmbientUpdate() 回调期间。

最大限度地减少 CPU 使用率

在您的 Wear OS 应用程序中,遵循以下 CPU 使用原则

  • 保持使用时间短。
  • 将任何相关操作批处理,以最大限度地延长应用程序进程处于空闲状态的时间。

最大限度地减少唤醒锁

在大多数情况下,请避免任何阻止应用程序休眠的操作,例如唤醒锁。例如,在健康和健身应用程序中,长时间运行的锻炼不需要唤醒锁。在从传感器 API 接收回调时使用处理器的唤醒时间,例如在使用Wear OS 上的健康服务 时。

在某些情况下,获取唤醒锁是可以的,例如当您的应用程序执行以下操作之一时

  • 在后台播放媒体。
  • 使用WorkManagerJobScheduler。(在后台运行作业时,系统会代表您保持唤醒锁。)

电池历史记录器 使您能够看到单个长时间唤醒锁事件,以及所保持的唤醒锁总数和持续时间的摘要。检查应用程序保持的唤醒锁的数量和持续时间,并将此信息与应用程序的交互式使用模式进行比较

  • 检查是否有意外的唤醒锁。
  • 如果持续时间超过预期,请考虑工作是否因某些依赖关系而被阻止,例如网络的可用性。

检查应用程序如何变得不活动

考虑当关键设备事件发生时,活动应用程序正在做什么,例如以下情况

  • 屏幕关闭,设备进入环境模式。
  • 应用程序被滑动关闭

要分析应用程序活动,请使用以下部分中所示的工具。

能量分析器

能量分析器 可通过在 Android Studio 菜单中选择查看 > 工具窗口 > 分析器来访问

  1. 检查系统跟踪,看看屏幕关闭和设备进入环境模式时的状态。
  2. 查找任何继续运行的工作,以及设备的 CPU 使用率。

Perfetto

Perfetto 使您能够记录跟踪,然后检查应用程序,查看是否存在任何线程在屏幕关闭、设备进入环境模式或用户关闭应用程序活动时执行任何工作。

定义自定义事件 来标记应用程序的重要事件,包括特定于域的事件。对于媒体应用程序,这将包括诸如获取播放列表、下载特定媒体项目、开始播放和停止播放等任务。通过定义这些事件,您可以在 Perfetto 中看到它们,并将它们的时间与应用程序的 CPU 和功耗进行比较。

分析应用程序的计划作业

使用WorkManager 的计划作业使您能够在应用程序中执行后台工作。尽管某些后台工作必须是定期进行的,但不要过于频繁或长时间运行作业,因为这会导致设备的电池电量消耗过快。

使用电池历史记录器 检查计划作业的执行情况,包括总体情况(系统统计信息 > Jobscheduler 统计信息)和按应用程序(应用程序统计信息 > 计划作业)。检查总数和总持续时间

  • 如果作业运行过于频繁,请考虑降低频率。
  • 检查总执行时间是否符合预期,并且没有显著增加。

此外,检查电池历史记录器图表,查看每个JobScheduler 条目。当您将指针悬停在特定条目上时,电池历史记录器将显示正在执行作业的所有者。请考虑以下几点

  • 对于您的应用程序,执行的持续时间应该是有意义的。
  • 考虑这些作业是否在您的应用程序运行时发生,或者它们是否代表定期进行的后台工作。

传感器

Wear OS 设备拥有许多不同的传感器,例如 GPS。在大多数情况下,请使用Wear OS 上的健康服务,而不是直接与 SensorManager 进行交互。在许多情况下,健康服务会智能地将数据批处理以提高电池性能。

要分析应用程序中的传感器使用情况,请在开发机器的终端窗口中运行以下命令

adb shell dumpsys sensorservice

该命令的结果将显示以下内容

  • 当前和以前的传感器注册。
  • 传感器配置,包括设置的批处理。
  • 最近采样的数据。

测试从传感器注销

要检查您的应用程序是否按预期停止获取传感器数据,请测试以下场景

  1. 滑动关闭您的应用程序。
  2. 用手掌轻拍屏幕。这将关闭屏幕或将屏幕置于环境模式。

使用上一节中的 ADB 命令检查传感器是否正确显示为已注销。

数据层

在使用数据层 API 时,每次传输都会消耗一些电量。特别是,如果您使用此 API 发送数据,您的应用程序必须唤醒以接收数据。出于这些原因,请谨慎使用此 API。

使用数据层 API 的一些其他最佳实践包括以下内容

  • 等待应用程序处于活动状态,然后再使用WearableListenerService 设置侦听器。
  • 传输状态更改,而不是配置快速更新。这些状态更改使 Wear OS 设备能够执行本地数据计算,例如当锻炼会话开始时。

    仅传输更新 UI 的状态更改。例如,如果您的活动屏幕只显示“跑步公里数”到小数点后一位,则不要在用户向前移动一米时每次都向 Wear OS 发送状态更改。

要分析应用程序中的数据层 API 使用情况,请在开发机器的终端窗口中运行以下命令

adb shell dumpsys activity service WearableService

该命令的结果将包括以下内容

  • RpcService:使您能够查看使用MessageClient 调用了多少次以及哪些路径。
  • DataService:使您能够查看使用DataClient 设置了多少次数据项。

健康和健身应用程序

如果您维护健康和健身应用程序,请使用健康服务 优化应用程序对传感器的使用。

  • 对于 ExerciseClient,请使用电池历史记录器 验证环境模式下的正确行为。检查应用程序是否不会比每分钟或两分钟更频繁地唤醒以接收 ExerciseUpdate 数据。
  • 对于全天候的通用健康监控,请使用 PassiveMonitoringClient,如关于如何在后台监控健康和健身数据 的指南中所述。

磁贴和复杂功能

如果您的应用程序支持磁贴复杂功能,请遵循以下最佳实践

  • 禁用自动刷新,或将刷新率提高到 2 小时或更长时间。
  • 使用Firebase 云消息传递 (FCM)适当安排的作业 发送数据更新。注意避免快速更新速率,这会导致系统以比用户或平台访问执行该工作所需的数据更快的速率安排重复工作。
  • 当用户不与磁贴或复杂功能交互时,不要为它们安排工作。
  • 使用离线优先方法
  • 在主应用程序、磁贴和复杂功能之间共享一个数据库。这也有助于数据在 UI 表面上保持一致。