![](https://developer.android.com/static/images/quality/hero-images/technical_quality_highlighted.svg)

Technical quality includes the stability, performance, and resource utilization
of your app or game. The technical quality of your app or game can affect the
user experience. A high-quality experience not only minimizes technical issues,
but also makes the most of capabilities of the Android OS and device hardware.

To build a high-quality app or game, follow these guidelines.

## Form factors

Your app or game should make the most of premium devices like foldables. Follow
functional and technical guidelines for each form factor you support.

If it makes sense for your app or game to support multiple form factors, ensure
[continuity](https://developer.android.com/develop/ui/compose/layouts/adaptive/foldables/learn-about-foldables#app_continuity)
across form factors for a seamless user experience---for example, by synchronizing
files and settings between devices, or saving their progress.

## Stability

Stability issues cause your app or game to crash or stop responding, which
interrupts user journeys and hurts the user experience. There are different
types of issues, including
[crashes](https://developer.android.com/topic/performance/vitals/crash),
[ANRs](https://developer.android.com/topic/performance/vitals/anr), and
[LMKs](https://developer.android.com/topic/performance/memory-management#low-memory_killer),
but all are equally disruptive to users.

App or game stability can vary by device. Monitor your stability metrics
regularly across all devices and aim to minimize the proportion of your users
and sessions that are affected by stability issues. Ensure your stability
metrics are best in class compared to your peers. Monitor user feedback and
engagement metrics to ensure that stability issues aren't impacting your
users.

Following best practices, such as [opting into
GWP-ASan](https://developer.android.com/ndk/guides/gwp-asan), programming in
null-safe languages such as [Kotlin](https://developer.android.com/kotlin), and using [background work
APIs](https://developer.android.com/guide/background), can reduce stability
issues and also make debugging easier when they do occur.

### Stability and Google Play

If you distribute on Google Play, follow these additional stability guidelines.

**Tools to monitor and improve stability**
Use Android vitals in [Play
Console](https://play.google.com/console/about/vitals/) or the [reporting
API](https://developers.google.com/play/developer/reporting) to monitor the
stability metrics that matter most to users and Google Play. Android vitals
reports user-perceived crash rate and user-perceived ANR rate daily for all apps
and games, and hourly for apps and games if there's sufficient data. Android
vitals also helps you compare your stability metrics to your peers, and alerts
you to per-device issues.

**Discovery and featuring**
The discoverability of your app or game might be limited on devices where your
stability metrics exceed Google Play's bad behavior threshold, and a warning
might be shown on your store listing on those devices.
[Learn more](https://developer.android.com/topic/performance/vitals#core-vitals)

## Performance

Your app's or game's performance is critical to a quality experience.

### Start-up time (apps) and loading time (games)

Users want to be able to interact with your app or game as quickly as possible.
The definition of a good start-up or loading time varies by category, but as a
general principle you should minimize the time between launch and first
interaction. This time can vary by device, and different standards could be
appropriate for different device capabilities.

Ensure your metrics are best in class compared to your peers. Monitor user
feedback and abandonment rates to ensure you're meeting user expectations, and
check that your performance isn't degrading over time.

Leverage Android to optimize
[startup time](https://developer.android.com/topic/performance/vitals/launch-time).
Providing a
[baseline profile](https://developer.android.com/topic/performance/baselineprofiles/overview)
and declaring
[reportFullyDrawn](https://developer.android.com/topic/performance/vitals/launch-time#retrieve-TTFD)
will ensure the most important sections of your code load faster, and adopting
the
[Game State API](https://developer.android.com/reference/android/app/GameManager#setGameState(android.app.GameState))
(games-only) will help the OS adjust during loading. Reducing [the size of your
game or app](https://developer.android.com/quality/technical#app-size) will also improve start-up time for new installations.

### Rendering (apps)

A smooth and responsive session will make your user experience more enjoyable
and keep users engaged for longer. Most apps should run at 60 fps without any
dropped or delayed frames. Poor rendering performance can cause users to
perceive stuttering, also known as *jank*.

Monitor your rendering metrics regularly across all devices and aim to minimize
the proportion of your users and sessions that experience jank. Aim for
best-in-class rendering performance compared to your peers. Monitor user
feedback and engagement to ensure that you're delivering a good experience.

Providing a
[baseline profile](https://developer.android.com/topic/performance/baselineprofiles/overview)
can improve rendering performance and startup time. Consider using the
[JankStats](https://developer.android.com/topic/performance/jankstats) library
to track and analyze performance issues. Review the [best
practices](https://developer.android.com/topic/performance/rendering) for
rendering.

### Rendering (games)

A smooth and responsive session makes your user experience more enjoyable and
helps keep users engaged longer. Most games should run their core game loop at a
minimum of 30 fps to provide a reasonable experience for users. For the most
rewarding user experience, consider a frame rate of 60 fps or more, particularly
for games that require smooth animation or quick reaction time,
and when running on higher-end devices. Keep in mind
that higher frame rates come with tradeoffs in battery life, device temperature,
and graphical fidelity, so increased rates may not be appropriate for all
devices, games, or scenes.

Monitor your rendering metrics regularly across all devices and work to minimize
the proportion of your users and sessions that experience slow rendering. Aim
for best-in-class rendering performance compared to peers. Monitor user feedback
and engagement to ensure that you are delivering a good experience.

Follow best practices, such as using the
[Android Dynamic Performance Framework](https://developer.android.com/games/optimize/adpf),
[Game Mode API](https://developer.android.com/games/gamemode/about-API-and-interventions)
and [frame pacing](https://developer.android.com/games/sdk/frame-pacing), to
optimize visual smoothness and stability. Use
[Android Performance Tuner](https://developer.android.com/games/sdk/performance-tuner)
to tune quality levels appropriately for the devices you support. Make
considered choices about graphics libraries and asset formats. For example,
using [Vulkan](https://developer.android.com/ndk/guides/graphics/getting-started) as a graphics API and
[ASTC for assets](https://developer.android.com/guide/playcore/asset-delivery/texture-compression) can significantly improve
your rendering performance.

### Google Play guidelines

If you distribute on Google Play, follow these additional performance
guidelines.

**Tools to monitor and improve performance**
Use Android vitals in [Play
Console](https://play.google.com/console/about/vitals/) or the [reporting API](https://developers.google.com/play/developer/reporting) to monitor the
performance metrics that matter most to users and Google Play. Android vitals
reports startup time, loading time and rendering metrics daily for all apps and
games. It also helps you compare your metrics to your peers, and alerts you if
you're not meeting
[Play's quality bar](https://developer.android.com/topic/performance/vitals#core-vitals).

[Play as you Download](https://developer.android.com/games/distribute/play-as-you-download)
is a Google Play feature that allows users to get into your game experience
while the game is still downloading, reducing the time from launch to
gameplay.

**Discovery and featuring**
The discoverability of your app or game might be limited on devices where your
performance metrics exceed Google Play's bad behavior threshold, and a warning
might be shown on your store listing on those devices.
[Learn more](https://developer.android.com/topic/performance/vitals#core-vitals)

## Battery and network usage

Thoughtful and appropriate usage of limited or costly resources like battery
life and network bandwidth will make your app accessible to more users, increase
session length, and improve user retention.
Games should reduce frame rates and display refresh rates where appropriate, for
example when rendering menus and loading screens. Using the
[Game Mode API](https://developer.android.com/games/gamemode/about-API-and-interventions)
can help users make tradeoffs between performance and battery life, and can lead
to
[longer playtime](https://developer.android.com/stories/games/gameloft-gamemode).

### Google Play guidelines

If you distribute on Google Play, follow these additional battery and network
usage guidelines.

**Tools to monitor and optimize battery and network usage**
Use Android vitals in Play Console or the reporting API to monitor the battery
and network metrics that matter most to users and Google Play.

## App size

The definition of a good app size varies widely by category, but as a
general principle you should minimize the size of your app. The smaller your
app, the more people who can install it, and the shorter the time between
installation and first use. Users are also less likely to uninstall your app to
free up device storage.

Follow recommended best practices to minimize the size of your
[game](https://developer.android.com/games/optimize/game-size) or
[app](https://developer.android.com/topic/performance/reduce-apk-size).

### Google Play guidelines

If you distribute on Google Play, follow these additional app size guidelines.

**Tools to monitor and optimize app size**
Use Android vitals in [Play
Console](https://play.google.com/console/about/vitals/) to monitor your app
size. Android vitals allows you to compare your app size to your peers, and
helps you understand how many devices in your user base are running low on
storage. Keep in mind that Google Play proactively helps users free up device
storage by suggesting apps to uninstall, and will prioritize app size when
formulating these recommendations.

If you distribute on Google Play, use the [app bundle
format](https://developer.android.com/guide/app-bundle) to ensure that each user
downloads only the code and resources necessary to run your app or game. Larger
apps and games can further benefit from
[Play Feature delivery](https://developer.android.com/guide/playcore/feature-delivery)
and
[Play Asset delivery](https://developer.android.com/guide/playcore/asset-delivery),
where specific parts of your code or assets can be downloaded conditionally or
on demand.

## App freshness

Update your app regularly so that users can benefit from performance
improvements, bug fixes, platform enhancements, new features, and new content.
Not all users have reliable or affordable network access, or available device
storage. To increase the number of active users who can update your app or game,
minimize the size of your updates.

### Google Play guidelines

If you distribute on Google Play, follow these additional app freshness
guidelines.

**Tools to increase app freshness**
Not all users enable background updates. Adopting features like
[in-app updates](https://developer.android.com/guide/playcore/in-app-updates)
can increase the number of active users on the latest version of your app or
game.

## Healthy releases

Changes in your codebase, whether through server-side flags or app updates,
are a common cause of new technical issues. It's much better for users if you
invest time in preventing issues from reaching production, rather than fixing
them after they've been introduced. Users can be quick to leave feedback in the
event of a poor experience, and might not update your app after first install.

To minimize the risk of introducing new issues in a release, take a phased
approach to [testing](https://developer.android.com/training/testing) and
rollout, and monitor your metrics frequently during any changes. You can also
make it easier to mitigate emerging issues by decoupling binary releases from
feature releases with remote configuration SDKs, such as [Firebase Remote
Config](https://firebase.google.com/docs/remote-config).

### Google Play guidelines

If you distribute on Google Play, follow these additional guidelines for
ensuring healthy releases.

**Tools to monitor and improve release quality**
Play Console provides many features to help you
[release with confidence](https://play.google.com/console/about/guides/releasewithconfidence/),
and Android vitals reports hourly metrics for apps and games if there's
sufficient data, both in [Play
Console](https://play.google.com/console/about/vitals/) and the [reporting
API](https://developers.google.com/play/developer/reporting).

**Discovery and featuring**
Google Play evaluates technical quality across all users of your app regardless
of what version they are using. Managing your release quality is therefore not
only better for users, it's also better for your Google Play quality metrics.
[Learn more](https://developer.android.com/topic/performance/vitals#core-vitals)