Optimize watch faces

A Wear OS watch face runs continuously, so it must use power efficiently.

Optimize the performance of the watch face as much as possible. Services must not perform unnecessary computations. Watch faces with animations must run smoothly while accommodating notifications and system indicators.

Basic optimization

This section contains best practices for improving efficiency.

Color and brightness of a watch face

Dark colors conserve the battery of a watch. The following are recommendations for setting the watch face background, to optimize the watch face's battery use:

  • Color. Whenever possible, use a black background.
  • Brightness. When a watch face's requirements prevent the use of a black background, you should strive to keep the brightness of the background color at or below 25 percent on an HSV (Hue, Saturation, Value) or HSB scale. For example, if you use the Color class to set the background color, and define the color with the HSV scale, you would use 25 or less for the Value setting (that is, for the brightness setting).

Use dynamic capabilities to interact with the phone

When a watch face requires an operation to run on the phone, execute the code only when the watch face is active. The recommended method for letting the app on the phone learn that the corresponding watch face is active is to use the CapabilityClient API.

Monitor power consumption

The Wear OS companion app enables developers and users to see how much battery is consumed by different processes on the wearable device (under Settings > Watch battery).

Register encryption-aware watch faces

Android 7.0 and higher include support for file-based encryption and allows encryption-aware applications to run before the user has provided the decryption passcode at bootup. This can reduce the duration of transitioning from boot animation to the watch face by up to 30 seconds.

To enable faster bootup, add android:directBootAware="true" to the watch face manifest.

Note: Use this feature with watch faces that don't use credential encrypted storage.

Best practices for animations

The best practices in this section help to reduce the power consumption of animations.

Reduce the frame rate of animations

Animations are often computationally expensive and consume a significant amount of power. Most animations look fluid at 30 frames per second, so you should avoid running your animations at a higher frame rate. Instead you can use dynamic frame rates. For more information see the Example Canvas Watch Face.

Let the CPU sleep between animations

Animations and small changes to the contents of the watch face wake up the CPU. Your watch face should let the CPU sleep in between animations. For example, you can use short bursts of animation every second in interactive mode and then let the CPU sleep until the next second. Letting the CPU sleep often, even briefly, can significantly reduce power consumption.

To maximize battery life, use animations sparingly. Even a blinking colon wakes up the CPU with every blink and hurts battery life.

Reduce the size of your bitmap assets

Many watch faces consist of a background image and other graphic assets that are transformed and overlapped on top of the background image, such as clock hands and other elements of the design that move over time. The larger these graphic assets are, the more computationally expensive it is to transform them. Typically these graphic elements are rotated (and sometimes scaled) inside the Render.CanvasRenderer.render() method every time the system redraws the watch face, as described in Draw watch faces.

Figure 1. Crop clock hands to remove extra pixels.

To improve the performance of your watch face:

  • Don't use graphic elements that are larger than you need.
  • Remove extra transparent pixels around the edges.

Reduce the size of the example clock hand on the left side of Figure 1 by 97%.

Reducing the size of your bitmap assets as described in this section not only improves the performance of your animations, but it also saves power.

Combine bitmap assets

If you have bitmaps that are often drawn together, consider combining them into the same graphic asset. You can often combine the background image in interactive mode with the tick marks to avoid drawing two full-screen bitmaps every time the system redraws the watch face.

Disable anti-aliasing when drawing scaled bitmaps

When you draw a scaled bitmap on the Canvas object using the Canvas.drawBitmap() method, you can provide a Paint instance to configure several options. To improve performance, disable anti-aliasing using the setAntiAlias() method, since this option doesn't have any effect on bitmaps.

Figure 2. Example of bitmap filtering disabled (left) and enabled (right).

Use bitmap filtering

For bitmap assets that you draw on top of other elements, enable bitmap filtering on the same Paint instance using the setFilterBitmap() method. Figure 2 shows a magnified view of a clock hand with and without bitmap filtering.

Note: In low-bit ambient mode, the system does not reliably render the colors in the image for bitmap filtering to process successfully. When ambient mode is active, disable bitmap filtering.

Move expensive operations outside the drawing method

The system calls the Render.CanvasRenderer.render() method every time it redraws your watch face, so you should only include operations that are strictly required to update the watch face inside this method to improve performance.

When possible, avoid performing these operations inside the Render.CanvasRenderer.render() method:

  • Loading images and other resources.
  • Resizing images.
  • Allocating objects.
  • Performing computations whose result does not change between frames.

To analyze the performance of your watch face, use the CPU Profiler. In particular, ensure that the execution time for your Render.CanvasRenderer.render() implementation is short and consistent across invocations. For more information, see Record and inspect method traces.

The Watch face sample demonstrates the best practices for configuring a watch face.