The App performance dashboard
How the app starts, how its frames build and raster, which screens are slow or busy, and where people are frustrated.
Who it is for: The engineers tuning how the app feels: startup, frames, slow screens and frustrated taps.
Open it from Dashboards in the Observatory: choose App performance. It is a built-in board, so it is read-only; Save a copy makes one you can change. How every panel reads the range, its colors and its empty states is on Reading a board.
The toolbar: the filters Build, Platform, Service and Screen, each All until you pick a value, and the time range. Each menu lists the values flutter.frame.build carries in the range. Each panel below names the filters that narrow it.
Overview
Cold start (p75)
Cold start time at the 75th percentile. Keep it under 3 s; Google Play flags cold starts of 5 s or more.
- How it is computed: The 75th percentile of
flutter.app.startup.durationfor cold starts (app.start.typecold). One figure for the whole picked range. - Better: Lower is better.
- Colors: The figure turns amber above 3 s and red above 5 s.
- Filters: Build, Platform and Service narrow it; Screen does not.
- Opens: its title opens the Metric screen on
flutter.app.startup.duration.
Frame build (p95)
The UI thread's share of a frame: build, layout and paint recording, at the 95th percentile. The 60 Hz budget is 16.7 ms; a frame past 33 ms takes two.
- How it is computed: The 95th percentile of
flutter.frame.build. One figure for the whole picked range. - Better: Lower is better.
- Colors: The figure turns amber above 16 ms and red above 33 ms.
- Filters: Build, Platform, Service and Screen narrow it.
- Opens: its title opens the Metric screen on
flutter.frame.build.
Janky frames
Dropped frames, of all frames built. Keep it under 5%; at 10% the app feels broken.
- How it is computed:
flutter.frame.droppeddivided by the number offlutter.frame.buildsamples, as a percent. One figure for the whole picked range. - Better: Lower is better.
- Colors: The figure turns amber above 5% and red above 10%.
- Filters: Build, Platform, Service and Screen narrow it.
- Opens: its title opens the Metric screen on
flutter.frame.dropped.
Severe and frozen frames
Frames well past the vsync budget, of all frames built.
- How it is computed:
flutter.frame.droppedwhereflutter.frame.severityis severe or frozen, divided by the number offlutter.frame.buildsamples, as a percent. One figure for the whole picked range. - Better: Lower is better.
- Colors: The figure turns amber above 1% and red above 3%.
- Filters: Build, Platform, Service and Screen narrow it.
- Opens: its title opens the Metric screen on
flutter.frame.dropped.
UI hangs
A UI hang is a UI-thread hang the watchdog reported. Info is noticeable, mild is one the user feels, severe is long enough that the OS may offer to close the app.
- How it is computed:
flutter.anr.events, every severity. One figure for the whole picked range. - Better: Lower is better. Beside the figure, its change from the prior range of the same length: green when it moved the better way, red when it moved the other way.
- Filters: Build, Platform and Service narrow it; Screen does not.
- Opens: its title opens the Metric screen on
flutter.anr.events.
Memory usage
The app process's resident memory, averaged across devices. Healthy under 200 MB; OOM-kill risk grows past 400 MB.
- How it is computed: The average of
process.memory.usagefrom Flutter app processes (those that carryflutter.build.mode); a server process never counts here. One figure for the whole picked range. - Better: Lower is better.
- Colors: The figure turns amber above 200 MB and red above 400 MB.
- Filters: Build, Platform and Service narrow it; Screen does not.
- Opens: its title opens the Metric screen on
process.memory.usage.
Frames
Frame build (p95) over time
Frame build time at the 95th percentile, each step.
- How it is computed: The 95th percentile of
flutter.frame.build. Lines, one point per step across the picked range. - Filters: Build, Platform, Service and Screen narrow it.
- Opens: its title opens the Metric screen on
flutter.frame.build.
Frame raster (p95) over time
The raster thread's share of a frame at the 95th percentile, each step.
- How it is computed: The 95th percentile of
flutter.frame.raster. Lines, one point per step across the picked range. - Filters: Build, Platform, Service and Screen narrow it.
- Opens: its title opens the Metric screen on
flutter.frame.raster.
Dropped frames per minute by screen
The six screens dropping most, each step.
- How it is computed: The per-minute rate of
flutter.frame.dropped, one line per screen (app.screen.name). Lines, one point per step across the picked range. - Filters: Build, Platform, Service and Screen narrow it.
- Opens: its title opens the Metric screen on
flutter.frame.dropped.
Dropped frames by severity
Mild, severe or frozen: by how much the frame missed its budget.
- How it is computed:
flutter.frame.dropped, counted perflutter.frame.severity. A ranked list, each figure for the whole picked range. - Filters: Build, Platform, Service and Screen narrow it.
- Opens: its title opens the Metric screen on
flutter.frame.dropped.
Frames missing their vsync deadline
Frames that missed their vsync deadline: each device's latest count, summed.
- How it is computed:
flutter.vsync.deadline_miss_count, summed across devices. One figure for the whole picked range. - Better: Lower is better.
- Filters: Build, Platform and Service narrow it; Screen does not.
- Opens: its title opens the Metric screen on
flutter.vsync.deadline_miss_count.
Screens
Time on screen by route (p95)
How long a route stayed up, from its push to the pop or replace that ended it. A route never popped (often the first screen) is not in it.
- How it is computed: The 95th percentile of
flutter.navigation.durationper screen (app.screen.name), the top ten. A ranked list, each figure for the whole picked range. - Filters: Build, Platform, Service and Screen narrow it.
- Opens: its title opens the Metric screen on
flutter.navigation.duration.
Most visited screens
Screen views in this range, one each time a screen became current.
- How it is computed: Log records with
event.namedartastic.screen.view, counted per screen (the record'sapp.screen.name), the top ten. A ranked list, each figure for the whole picked range. - Filters: Build, Platform, Service and Screen narrow it.
- Opens: its title opens Logs.
Tap to next screen by screen (p75)
From a tap to the screen it opened becoming current.
- How it is computed: The 75th percentile of
dartastic.screen.interaction_to_next_viewper screen, the top ten. A ranked list, each figure for the whole picked range. - Filters: Build, Platform, Service and Screen narrow it.
- Opens: its title opens the Metric screen on
dartastic.screen.interaction_to_next_view.
Network settled by screen (p75)
From a screen's start to its last request finishing.
- How it is computed: The 75th percentile of
dartastic.screen.network_settledper screen, the top ten. A ranked list, each figure for the whole picked range. - Filters: Build, Platform, Service and Screen narrow it.
- Opens: its title opens the Metric screen on
dartastic.screen.network_settled.
Startup
Starts by type
Cold, warm and hot starts in this range.
- How it is computed: The number of
flutter.app.startup.durationsamples perapp.start.type(cold, warm, hot). A ranked list, each figure for the whole picked range. - Filters: Build, Platform and Service narrow it; Screen does not.
- Opens: its title opens the Metric screen on
flutter.app.startup.duration.
Cold start (p95) over time
Cold start time at the 95th percentile, each step.
- How it is computed: The 95th percentile of
flutter.app.startup.durationfor cold starts. Lines, one point per step across the picked range. - Filters: Build, Platform and Service narrow it; Screen does not.
- Opens: its title opens the Metric screen on
flutter.app.startup.duration.
Warm and hot starts (p95) over time
Warm and hot start time at the 95th percentile, each step.
- How it is computed: The 95th percentile of
flutter.app.startup.durationfor warm and hot starts together. Lines, one point per step across the picked range. - Filters: Build, Platform and Service narrow it; Screen does not.
- Opens: its title opens the Metric screen on
flutter.app.startup.duration.
Interaction
User actions
Taps the app accepted.
- How it is computed:
dartastic.action.count. One figure for the whole picked range. - Better: Higher is better. Beside the figure, its change from the prior range of the same length: green when it moved the better way, red when it moved the other way.
- Filters: Build, Platform, Service and Screen narrow it.
- Opens: its title opens the Metric screen on
dartastic.action.count.
Frustration signals
Rage taps (three or more on one target within a second), dead taps (nothing happened within 3 s) and error taps (an error during the tap or within 100 ms of it).
- How it is computed:
dartastic.frustration.signal.count. One figure for the whole picked range. - Better: Lower is better. Beside the figure, its change from the prior range of the same length: green when it moved the better way, red when it moved the other way.
- Colors: The figure turns amber above 25 and red above 100.
- Filters: Build, Platform, Service and Screen narrow it.
- Opens: its title opens the Metric screen on
dartastic.frustration.signal.count.
Frustration by type
Frustration signals by type.
- How it is computed:
dartastic.frustration.signal.count, counted perdartastic.frustration.signal.type. A ranked list, each figure for the whole picked range. - Filters: Build, Platform, Service and Screen narrow it.
- Opens: its title opens the Metric screen on
dartastic.frustration.signal.count.
Frustration by screen
The screens with the most frustration signals.
- How it is computed:
dartastic.frustration.signal.count, counted per screen (app.screen.name), the top ten. A ranked list, each figure for the whole picked range. - Filters: Build, Platform, Service and Screen narrow it.
- Opens: its title opens the Metric screen on
dartastic.frustration.signal.count.
Actions by screen
The screens where people tap most.
- How it is computed:
dartastic.action.count, counted per screen, the top ten. A ranked list, each figure for the whole picked range. - Filters: Build, Platform, Service and Screen narrow it.
- Opens: its title opens the Metric screen on
dartastic.action.count.