Improve startup latency

Startup latency is an important metric to retain daily active users and ensure a seamless user experience from the first interaction. This is especially true in low-RAM environments where performance tradeoffs might be considered. However, before beginning to improve app startup, it's important to understand the underlying aspects that contribute to startup itself.

Best practices

Ship with a Baseline Profile

Baseline Profiles improve code execution speed by around 30% from the first launch by avoiding interpretation and just-in-time (JIT) compilation steps for included code paths. By shipping a Baseline Profile in an app, Android Runtime (ART) can optimize included code paths through Ahead of Time (AOT) compilation, providing performance enhancements for every new user and on every app update.

Avoid eager initialization

Avoid doing eager work that may not be necessary in your app’s startup sequence. The most likely scenario for your app starting a process is through the launching of the app. However, WorkManager, JobScheduler, BroadcastReceiver, bound services, and the AndroidX startup library can also start app processes in the background. If possible, avoid unnecessarily initializing anything eagerly in your Application class. A lot of libraries offer on-demand initialization, which lets you invoke them only when necessary.

Move tasks from UI thread to background thread

If there are tasks that are taking longer and blocking the main thread, move them to a background thread or use WorkManager to ensure efficiency. Identify operations that occupy large time frames or consume more time than expected. Optimizing these tasks can help drastically improve startup latency.

Analyze and fix severe disk read contention

StrictMode is a developer tool that can help detect the use of accidental disk or network access on the app's main thread, where UI operations are received and animations take place. Once the tool detects a possible area of improvement, you can automatically terminate the app or log the violation for further inspection at a later time.

Avoid synchronous IPCs

Often long pauses in your app's execution are caused by binder calls, the inter-process communication (IPC) mechanism on Android. On recent versions of Android, it's one of the most common reasons for the UI Thread to stop running. Generally, the fix is to avoid calling functions that make binder calls; if it's unavoidable, you should cache the value, or move work to background threads. For more information, see Thread scheduling delays.