节约电量和电池

关键词:wearos、电量、电池、性能

在 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。(在后台运行作业时,系统会代表你保持唤醒锁。)

Battery Historian 允许你查看长时间唤醒锁的单个事件,以及正在保持的唤醒锁的总数和持续时间的摘要。检查你的应用保持的唤醒锁的数量和持续时间,并将此信息与应用的交互式使用模式进行比较

  • 检查意外的唤醒锁。
  • 如果持续时间长于预期,请考虑工作是否被某些依赖项阻塞,例如网络的可用性。

检查你的应用如何变为非活动状态

考虑关键设备事件(例如以下事件)发生时活动应用正在执行的操作

  • 屏幕关闭且设备进入环境模式。
  • 应用已滑动关闭

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

电源分析器

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

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

Perfetto

Perfetto 允许你记录跟踪,然后检查你的应用以查看屏幕关闭、设备进入环境模式或用户关闭应用活动时是否有任何线程正在执行任何工作。

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

分析应用的计划作业

使用WorkManager 的计划作业允许你在应用中执行后台工作。尽管某些后台工作必须是周期性的,但不要过于频繁地运行作业或长时间运行作业,因为这会耗尽设备的电池电量。

使用Battery Historian 检查计划作业的执行情况,包括整体情况(系统统计信息 > JobScheduler 统计信息)和按应用情况(应用统计信息 > 计划作业)。检查总数和总持续时间

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

此外,检查 Battery Historian 图表,查看每个JobScheduler条目。当将指针悬停在特定条目上时,Battery Historian 会显示正在执行作业的所有者。请考虑以下几点

  • 对于你的应用,执行持续时间应该是有意义的。
  • 考虑作业是在你的应用运行时发生,还是作业代表周期性后台工作。

传感器

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,请使用Battery Historian验证其在环境模式下的正确行为。请检查您的应用是否不会频繁唤醒(每隔一两分钟以上),以接收ExerciseUpdate数据。
  • 对于全天候的一般健康监测,请使用PassiveMonitoringClient,如关于如何在后台监测健康和健身数据的指南中所述。

磁贴和复杂功能

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

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