AppVitals Android Metrics Reference
What Is This Document?
This document is a field-level reference for all performance attributes collected by AppVitals on Android devices. It covers every metric field, its data type, unit of measurement, and a description of what it measures.
What Are Performance Attributes?
Performance attributes are measurable, time-series data points that describe how an app behaves on a real device at runtime. They are captured continuously (typically every 1–5 seconds) while the app is running, and aggregated to produce a health picture of the application.
They span multiple dimensions:
| Dimension | What It Covers |
|---|---|
| CPU | How much processor time the app and system consume |
| Memory | RAM usage broken down by heap, native, graphics, etc. |
| FPS & Rendering | Smoothness of the UI, frame drops, jank |
| GPU | Graphics processor utilisation |
| Network | Data sent/received, packet counts, link quality |
| Battery | Charge level, temperature, power draw |
| Disk | Storage space and I/O read/write throughput |
| Thermal | Device heat and throttling state |
| Process | Thread count, file descriptors, PIDs |
| Crash & Stability | Crashes, ANRs, exceptions |
| Wake Locks | Screen-on time, background wake activity |
| SQLite | Query performance and database sizes |
| Launch Timing | Cold, warm, and hot start durations |
| Page Transitions | Time to display each screen |
| Jank | Skipped frames and stutter events |
| Per-Screen (Activity) | Per-screen aggregated health score |
Data Collection
AppVitals collects Android metrics via ADB shell commands — no SDK is required inside the app. Data sources include:
dumpsys meminfo— memory breakdowndumpsys gfxinfo— frame timing and jankcat /proc/statand/proc/<pid>/stat— CPU jiffiesdumpsys batterystats— battery and wake lock datadumpsys cpuinfo— per-process CPU usageadb shell dumpsys activity— activity/screen infoadb shell netstat/ traffic stats — network countersdf -h//proc/diskstats— disk usage and I/Ologcat— crash, ANR, exception capturedumpsys SurfaceFlinger— GPU and frame infoam start -W— launch timinglsof— file descriptor counts
Data Types Used
| Type | Description |
|---|---|
float64 |
64-bit floating-point number (e.g., 45.3%) |
int |
32-bit signed integer (e.g., thread count) |
int64 |
64-bit signed integer for large accumulators (byte counts, jiffies, nanoseconds, durations) |
string |
Text value |
time.Time |
Timestamp |
[]float64 |
Array of float64 values (e.g., per-core CPU %) |
[]ExceptionInfo |
Array of crash/exception detail objects |
[]WakeLockInfo |
Array of wake lock detail objects |
[]SQLiteQueryInfo |
Array of slow query detail objects |
[]PageTransition |
Array of screen transition detail objects |
[]JankEvent |
Array of jank event detail objects |
Why int64? Fields that accumulate over time (byte counts, CPU jiffies, nanosecond timestamps, durations) can grow beyond the ~2.1 billion limit of a 32-bit int.
int64supports values up to ~9.2 quintillion, making it safe for long-running sessions.
CPU Metrics
| Field | Type | Unit | Description |
|---|---|---|---|
| AppPercent | float64 | % | App's CPU usage as a percentage of total CPU. Indicates how hard the processor is working for this app — high values mean the app is computationally intensive. |
| SystemPercent | float64 | % | Total system CPU usage percentage. Shows how busy the entire device CPU is, not just the app. |
| UserPercent | float64 | % | User-mode CPU time percentage. Represents CPU time spent running app-level code rather than OS-level tasks. |
| IOWaitPercent | float64 | % | I/O wait time as a percentage of CPU. High values mean the CPU is sitting idle waiting for storage reads/writes to complete. |
| Cores | int | count | Number of CPU cores available on the device. More cores generally allow better multitasking. |
| PerCore | []float64 | % | Per-core CPU usage percentages. Shows whether load is spread evenly or concentrated on specific cores. |
| FrequencyMHz | int | MHz | Current CPU clock frequency. Higher frequency means faster processing but also more battery consumption. |
| User | int64 | jiffies | Cumulative CPU time spent in user mode since boot (from /proc/stat). A raw system counter used to calculate CPU usage trends over time. |
| Nice | int64 | jiffies | Cumulative CPU time for low-priority background processes. High values indicate significant background activity running at reduced priority. |
| System | int64 | jiffies | Cumulative CPU time spent in kernel/system mode. Reflects how much time the OS itself spends on behalf of all processes. |
| Idle | int64 | jiffies | Cumulative CPU idle time. A high idle value means the device CPU has spare capacity. |
| IOWait | int64 | jiffies | Cumulative time the CPU spent waiting for I/O operations. High values point to storage bottlenecks slowing the device down. |
| IRQ | int64 | jiffies | Cumulative time servicing hardware interrupts. Reflects how often hardware events (like touch, network) are demanding CPU attention. |
| SoftIRQ | int64 | jiffies | Cumulative time servicing software interrupts. Used internally to track kernel-level deferred work. |
| UTime | int64 | jiffies | User-mode CPU time consumed by the app process specifically. Directly tracks how much CPU the app itself has used. |
| STime | int64 | jiffies | Kernel-mode CPU time consumed by the app process. Shows how often the app triggered OS-level operations like file access or network calls. |
| CUTime | int64 | jiffies | User-mode CPU time for child processes spawned by the app. Relevant if the app launches sub-processes. |
| CSTime | int64 | jiffies | Kernel-mode CPU time for child processes spawned by the app. Tracks OS-level work done by sub-processes of the app. |
Memory Metrics
| Field | Type | Unit | Description |
|---|---|---|---|
| TotalPSS | int64 | KB | Proportional Set Size — the total memory attributed to the app, including its share of shared libraries. This is the primary memory metric to report for Android apps. |
| JavaHeap | int64 | KB | Java/Dalvik heap memory currently in use. Represents objects allocated by the app's Java/Kotlin code. |
| NativeHeap | int64 | KB | Native (C/C++) heap memory in use. Memory allocated by native libraries or the Android media framework. |
| Code | int64 | KB | Memory used by the app's code — APK, compiled DEX, and OAT files. |
| Stack | int64 | KB | Stack memory for all active threads in the app. Each thread has its own stack for local variables and function calls. |
| Graphics | int64 | KB | GPU/graphics memory used — textures, surfaces, and render buffers. High values are expected for media-heavy apps. |
| PrivateOther | int64 | KB | Private memory not covered by the above categories. Catches miscellaneous allocations not attributed elsewhere. |
| System | int64 | KB | Shared system memory attributed proportionally to the app. Memory shared with other processes (e.g., system fonts, shared libraries). |
| SwapPSS | int64 | KB | PSS held in swap space. Indicates memory the OS has moved out of RAM to free up space for other processes. |
| DeviceTotal | int64 | KB | Total RAM available on the device. A fixed device characteristic. |
| DeviceFree | int64 | KB | RAM currently free on the device. Low values indicate the device is under memory pressure and may start killing background processes. |
FPS Metrics
| Field | Type | Unit | Description |
|---|---|---|---|
| FPS | float64 | fps | Frames rendered per second. The target is 60 fps for smooth UI — values below 30 fps are noticeable to users as stuttering. |
| FrameTimeMs | float64 | ms | Average time to render one frame. Should be under 16.67ms for 60 fps; higher values result in dropped frames. |
| JankCount | int | count | Number of frames that caused a perceptible jank (exceeded 16.67ms). Each jank event is a visible stutter the user may notice. |
| SlowFrames | int | count | Frames that missed the vsync deadline (>17ms). Indicates how frequently the app failed to keep up with the display refresh rate. |
| FrozenFrames | int | count | Frames taking longer than 700ms — the UI appeared completely frozen to the user during these frames. |
| TotalFrames | int | count | Total frames rendered during the sample period. Used as the denominator when calculating jank percentage. |
| IntendedVsync | int64 | ns | The intended vsync timestamp from Android's Choreographer. Marks when a frame was supposed to start rendering. |
| Vsync | int64 | ns | The actual vsync timestamp when the frame started rendering. Comparing with IntendedVsync reveals scheduling delays. |
| FrameCompleted | int64 | ns | Timestamp when the frame finished rendering and was presented. Used to calculate actual frame duration. |
GPU Metrics
| Field | Type | Unit | Description |
|---|---|---|---|
| UsagePercent | float64 | % | GPU utilisation as a percentage. High values indicate the app is GPU-bound — common in video playback, games, and complex animations. |
Network Metrics
| Field | Type | Unit | Description |
|---|---|---|---|
| RxBytes | int64 | bytes | Total bytes received since session start. Reflects overall data downloaded by the app during the session. |
| TxBytes | int64 | bytes | Total bytes transmitted since session start. Reflects overall data uploaded by the app during the session. |
| RxPackets | int64 | count | Total network packets received. High packet counts with low byte counts can indicate chatty, inefficient network communication. |
| TxPackets | int64 | count | Total network packets transmitted. Used alongside RxPackets to assess network efficiency. |
| WifiRxBytes | int64 | bytes | Bytes received specifically over Wi-Fi. Useful for separating Wi-Fi and mobile data consumption. |
| WifiTxBytes | int64 | bytes | Bytes transmitted specifically over Wi-Fi. |
| MobileRxBytes | int64 | bytes | Bytes received over mobile data. Relevant for understanding data plan consumption. |
| MobileTxBytes | int64 | bytes | Bytes transmitted over mobile data. |
| RxBytesPerSec | float64 | bytes/s | Download throughput calculated from the delta between RxBytes samples. Indicates the effective download speed during the session. |
| TxBytesPerSec | float64 | bytes/s | Upload throughput calculated from the delta between TxBytes samples. Indicates the effective upload speed during the session. |
Battery Metrics
| Field | Type | Unit | Description |
|---|---|---|---|
| Level | int | % | Battery charge level (0–100). Tracks how much battery the device had at the time of the session. |
| Temperature | float64 | °C | Battery temperature. Elevated temperatures can indicate the device is under heavy load or charging while in use. |
| Voltage | float64 | mV | Battery voltage. Drops as the battery drains; unusually low voltage can indicate a degraded battery. |
| Current | float64 | mA | Battery current draw (negative = discharging, positive = charging). High negative values mean the app is consuming significant power. |
| Power | float64 | mW | Power consumption calculated as Voltage × Current. The most direct indicator of how much energy the app is using. |
Disk Metrics
| Field | Type | Unit | Description |
|---|---|---|---|
| TotalBytes | int64 | bytes | Total internal storage capacity of the device. A fixed device characteristic. |
| UsedBytes | int64 | bytes | Storage currently used on the device. High values with low FreeBytes may cause app instability. |
| FreeBytes | int64 | bytes | Storage currently free. Very low free space can cause crashes, failed downloads, and database errors. |
| ReadBytes | int64 | bytes | Total bytes read from disk since boot. High values relative to session length can indicate excessive file I/O. |
| WrittenBytes | int64 | bytes | Total bytes written to disk since boot. Persistent high write activity can cause thermal issues and storage wear. |
Thermal Metrics
| Field | Type | Unit | Description |
|---|---|---|---|
| CPUTemp | float64 | °C | CPU temperature. Values above ~85°C typically trigger throttling that reduces app performance. |
| GPUTemp | float64 | °C | GPU temperature. High GPU temperatures during video playback or rendering indicate thermal stress. |
| BatteryTemp | float64 | °C | Battery temperature. High values (above 45°C) indicate risk to battery health and may be reported by the user as the device feeling hot. |
| SkinTemp | float64 | °C | Device surface/skin temperature — what the user physically feels when holding the device. |
| ThrottleState | int | level | Thermal throttle level (0 = normal, higher = more throttled). When throttled, the OS reduces CPU/GPU speed to cool down, causing visible slowdowns. |
| ThermalStatus | string | — | Human-readable thermal state label (e.g., "normal", "light", "moderate", "severe"). Directly communicates how hot the device was during the session. |
Process Metrics
| Field | Type | Unit | Description |
|---|---|---|---|
| PID | int | — | Process ID of the app. Used internally to identify the app process when pulling metrics. |
| ThreadCount | int | count | Number of active threads in the app process. Unusually high thread counts can indicate thread leaks or excessive concurrency. |
Crash & Stability Metrics
| Field | Type | Unit | Description |
|---|---|---|---|
| CrashCount | int | count | Number of crashes detected during the session. Each crash represents the app forcibly closing — the most direct signal of an unstable session. |
| ANRCount | int | count | Number of Application Not Responding events. An ANR means the app's UI thread was blocked for more than 5 seconds — the user sees a "App not responding" dialog. |
| ExceptionCount | int | count | Number of caught or uncaught exceptions during the session. High exception counts indicate error-prone code paths even when the app didn't fully crash. |
| Timestamp | time.Time | — | When the crash or exception occurred. Helps correlate the event with a specific point in the user's session. |
| Type | string | — | Exception or crash type (e.g., NullPointerException, OutOfMemoryError). Identifies the category of failure. |
| Message | string | — | The exception message text. Provides context about what specifically went wrong. |
| Location | string | — | The class and line number where the exception occurred. Pinpoints the exact code location for engineering investigation. |
File Descriptor Metrics
| Field | Type | Unit | Description |
|---|---|---|---|
| OpenFDs | int | count | Number of file descriptors currently open by the app. Tracks open files, sockets, and pipes. |
| MaxFDs | int | count | The system limit for open file descriptors (ulimit). If OpenFDs approaches this, the app will start failing to open new files or connections. |
| SocketFDs | int | count | Number of open socket file descriptors. High values may indicate lingering network connections not being closed. |
| PipeFDs | int | count | Number of open pipe file descriptors. Used for inter-process communication. |
| FileFDs | int | count | Number of regular file descriptors open. High values can indicate the app is reading/writing many files simultaneously. |
| OtherFDs | int | count | File descriptors of types not covered by the above categories. |
| FDGrowthRate | float64 | fds/s | Rate at which file descriptors are being opened. A steadily increasing rate indicates a file descriptor leak that will eventually crash the app. |
GfxInfo Detailed Metrics
| Field | Type | Unit | Description |
|---|---|---|---|
| Frames0to16ms | int | count | Frames rendered in 0–16ms — these are good, on-time frames the user experiences as smooth. |
| Frames16to32ms | int | count | Frames that took 16–32ms — slightly slow, causing minor stutter that attentive users may notice. |
| Frames32to50ms | int | count | Frames that took 32–50ms — noticeably slow, resulting in visible stuttering during scrolling or animation. |
| Frames50plus | int | count | Frames taking 50ms or more — these appear frozen or completely stuck to the user. |
| TotalFramesGfx | int | count | Total frames counted in the gfxinfo sample window. Used as the baseline for calculating jank percentages. |
| FrameTimeP50Ms | float64 | ms | The 50th percentile (median) frame render time — what a typical frame takes. |
| FrameTimeP90Ms | float64 | ms | The 90th percentile frame time — 90% of frames render within this duration. |
| FrameTimeP95Ms | float64 | ms | The 95th percentile frame time — only 5% of frames are slower than this. |
| FrameTimeP99Ms | float64 | ms | The 99th percentile frame time — the slowest 1% of frames. Represents the worst-case rendering experience. |
| DrawTimeMs | float64 | ms | Time spent issuing draw commands to the GPU. |
| SyncTimeMs | float64 | ms | Time spent waiting for the sync barrier before the frame can proceed. |
| ProcessTimeMs | float64 | ms | Time taken to process and compose the frame after drawing. |
| CommandIssueMs | float64 | ms | Time taken to issue GPU commands for rendering. |
| SwapBuffersMs | float64 | ms | Time to swap the front and back rendering buffers to display the frame. |
| JankyFrames | int | count | Total count of janky frames (>16.67ms) in the sample. Directly measures rendering quality from the user's perspective. |
| JankyFramePercent | float64 | % | Percentage of all frames that were janky. A value above 10% is generally noticeable as an unsmooth experience. |
Wake Lock Metrics
| Field | Type | Unit | Description |
|---|---|---|---|
| ActiveWakeLocks | int | count | Number of wake locks currently held by the app. Wake locks prevent the device from sleeping — excess wake locks drain battery in the background. |
| PartialWakeLockMs | int64 | ms | Total duration a partial wake lock was held — keeps the CPU running even when the screen is off. Prolonged values explain background battery drain. |
| FullWakeLockMs | int64 | ms | Total duration a full wake lock was held — keeps the screen on. High values mean the app kept the screen on for extended periods. |
| ScreenOnTimeMs | int64 | ms | Total time the screen was on during the session. Directly correlated with battery consumption. |
| DozeTimeMs | int64 | ms | Total time the device spent in Android Doze mode. Doze conserves battery by restricting background activity. |
| Tag | string | — | The wake lock tag/name assigned by the app. Identifies which component in the app acquired the lock. |
| Type | string | — | Wake lock type: partial, full, screen_dim, etc. Describes what the wake lock is preventing the device from doing. |
| DurationMs | int64 | ms | Duration a specific wake lock instance was held. Helps identify which specific lock is causing battery issues. |
| Package | string | — | The package name of the app holding the wake lock. Confirms which app is responsible. |
SQLite Metrics
| Field | Type | Unit | Description |
|---|---|---|---|
| QueryCount | int | count | Total SQL queries executed during the sample period. High counts indicate a database-heavy feature is being exercised. |
| SlowQueryCount | int | count | Number of queries that took longer than 16ms. Slow queries block the thread they run on and can cause UI jank if on the main thread. |
| AvgQueryTimeMs | float64 | ms | Average query execution time across all queries. Baseline indicator of database performance. |
| MaxQueryTimeMs | float64 | ms | The slowest single query observed. A very high max points to a specific problematic query. |
| TotalQueryTimeMs | float64 | ms | Total time spent in database queries during the session. Reflects cumulative database load. |
| DatabaseSizeKB | int64 | KB | The size of the SQLite database file on disk. Unexpectedly large databases can slow queries and consume significant storage. |
| WALSizeKB | int64 | KB | Size of the Write-Ahead Log file. A large WAL indicates many uncommitted transactions and can degrade database performance. |
| Timestamp | time.Time | — | When the slow query was captured. Used to correlate with user actions in the session. |
| Query | string | — | The SQL query text (truncated if long). Identifies the specific operation that was slow. |
| DurationMs | float64 | ms | Execution time for this specific query instance. |
| Table | string | — | The database table name if parseable from the query. Helps identify which data store is the bottleneck. |
Network Detail Metrics
| Field | Type | Unit | Description |
|---|---|---|---|
| NetworkType | string | — | The active network connection type: "wifi", "mobile", or "none". Establishes the baseline for evaluating network performance. |
| WifiRSSI | int | dBm | Wi-Fi signal strength in dBm — more negative means weaker signal (e.g., -50 is strong, -85 is weak). |
| WifiLinkSpeed | int | Mbps | Wi-Fi link speed negotiated between the device and the access point. Low link speeds limit download/upload throughput regardless of the internet connection speed. |
| WifiFrequency | int | MHz | The Wi-Fi band in use — 2400 MHz (2.4 GHz, longer range, lower speed) or 5000 MHz (5 GHz, shorter range, higher speed). |
| MobileSignal | int | dBm | Mobile cellular signal strength. Weak signal causes slower speeds and higher latency. |
| DNSLookupMs | float64 | ms | Time to resolve a hostname to an IP address. High values indicate DNS server issues that delay every network request. |
| TCPConnectMs | float64 | ms | Time to establish a TCP connection to a server. Reflects network latency between the device and the server. |
| TLSHandshakeMs | float64 | ms | Time to complete the TLS/SSL security handshake. Adds to the total connection setup time before any data is transferred. |
| PacketLossPercent | float64 | % | Estimated percentage of packets lost in transit. Any packet loss causes retransmissions and visible slowdowns in streaming or downloads. |
| Jitter | float64 | ms | Variation in packet arrival times. High jitter degrades real-time streaming quality even when average speed is acceptable. |
Launch Timing Metrics
| Field | Type | Unit | Description |
|---|---|---|---|
| ColdStartMs | int64 | ms | Time for the app to launch from a completely closed state (no cached process). This is the slowest launch type and represents the worst-case startup the user experiences. |
| WarmStartMs | int64 | ms | Time to launch when the app process exists in memory but the Activity was destroyed. Faster than cold start as the app process doesn't need to be created from scratch. |
| HotStartMs | int64 | ms | Time to bring the app back to the foreground from a backgrounded state. The fastest launch type — the Activity already exists in memory. |
| DisplayedMs | int64 | ms | Time from launch until the first frame is displayed to the user (Time to Initial Display). This is what the user perceives as the app's load time. |
Page Transition Metrics
| Field | Type | Unit | Description |
|---|---|---|---|
| Timestamp | time.Time | — | When the screen transition occurred during the session. |
| FromActivity | string | — | The Activity/screen the user was navigating away from. |
| ToActivity | string | — | The Activity/screen the user was navigating to. |
| Package | string | — | The app package name involved in the transition. |
| DurationMs | int64 | ms | Time for the transition to complete — from the user's tap to the new screen being displayed (TTID). |
| FullyDrawnMs | int64 | ms | Time until the screen is fully populated with content (TTFD). A screen may display its skeleton/shell quickly but take longer to load actual data. |
| AvgTransitionMs | float64 | ms | Average transition time across all screen changes in the session. Indicates overall navigation responsiveness. |
| MaxTransitionMs | int64 | ms | The slowest single screen transition observed. Pinpoints the worst navigation experience in the session. |
| SlowTransitions | int | count | Number of transitions that exceeded 500ms. Each slow transition is a moment the user waited visibly for a screen to appear. |
Jank Metrics
| Field | Type | Unit | Description |
|---|---|---|---|
| TotalSkippedFrames | int64 | count | Cumulative frames skipped throughout the entire session. Each skipped frame is a moment of stuttering the user experienced. |
| SlowFrameCount | int | count | Count of individual slow frame events. Tracks how many times the app failed to render a frame on time. |
| SlowDispatchCount | int | count | Count of slow input dispatch events — times when the system was slow to route user input to the app. |
| SlowDeliveryCount | int | count | Count of slow delivery events — times when delivering input to the app took longer than expected. |
| Timestamp | time.Time | — | When the jank event occurred during the session. |
| Type | string | — | Jank event type: slow_frame, skipped_frames, or slow_dispatch. |
| FramesOrMs | int64 | count/ms | For skipped_frames events: the number of frames skipped. For slow_frame events: the duration in ms the frame took. |
| Activity | string | — | The active Activity/screen when the jank was recorded. Helps identify which screen is causing rendering issues. |
Device Info
| Field | Type | Unit | Description |
|---|---|---|---|
| ID | string | — | ADB device serial number — the unique identifier for this physical device. |
| Name | string | — | Human-readable device name as set by the user or manufacturer. |
| Platform | string | — | Always "android" for Android devices. |
| Brand | string | — | Device brand (e.g., Samsung, Google, OnePlus). |
| Model | string | — | Device model name (e.g., Galaxy S23, Pixel 7). |
| Manufacturer | string | — | Device manufacturer name. |
| OSVersion | string | — | Android OS version string (e.g., "14"). Helps correlate issues with specific Android versions. |
| SDKVersion | int | — | Android SDK API level (e.g., 34 for Android 14). Used to identify OS-specific behaviour. |
| ScreenWidth | int | px | Screen width in pixels. Affects layout rendering and resolution-dependent performance. |
| ScreenHeight | int | px | Screen height in pixels. |
App Info
| Field | Type | Unit | Description |
|---|---|---|---|
| PackageName | string | — | The app's package name (e.g., com.example.app). Uniquely identifies the app on the device. |
| AppName | string | — | The app's display name as shown to the user. |
| Version | string | — | The version name string (e.g., "5.2.1") — the human-readable version shown in app stores. |
| VersionCode | int | — | The integer build version code. Used internally to distinguish builds when the version name is the same. |
| UID | int | — | Linux user ID assigned to the app by the OS. Used for system-level permission and resource attribution. |
Per-Screen (Activity) Metrics
| Field | Type | Unit | Description |
|---|---|---|---|
| Name | string | — | The Activity class name identifying this screen. |
| VisitCount | int | count | Number of times this screen was visited during the session. High counts indicate frequently used screens worth optimising. |
| AvgLoadTimeMs | float64 | ms | Average time-to-interactive for this screen across all visits. Reflects typical user wait time when navigating to this screen. |
| MaxLoadTimeMs | int64 | ms | The slowest observed load time for this screen. Captures worst-case user experience on this screen. |
| JankEventCount | int | count | Number of jank events that occurred while the user was on this screen. |
| CrashCount | int | count | Number of crashes that occurred on this screen. Identifies which screens are crash-prone. |
| ANRCount | int | count | Number of ANR events on this screen. Indicates where the app became unresponsive to user input. |
| AvgFPS | float64 | fps | Average frames per second while this screen was active. Below 30 fps is noticeably unsmooth. |
| AvgCPU | float64 | % | Average CPU usage while this screen was active. High values explain battery drain or thermal issues on specific screens. |
| AvgMemoryMB | float64 | MB | Average memory usage while this screen was active. Helps identify memory-heavy screens. |
| TotalTimeMs | int64 | ms | Total time the user spent on this screen across the session. |
| SkippedFrames | int64 | count | Total frames skipped while the user was on this screen. Direct measure of rendering quality per screen. |
| SlowFrameCount | int | count | Count of slow frame events specific to this screen. |
| IssueCount | int | count | Total issue count combining jank, crash, and ANR events for this screen. A single aggregate quality signal per screen. |
| Score | int | 0–100 | Overall health score for this screen — 80–100 is good, 50–79 is moderate, below 50 indicates significant issues. |
| Level | string | — | Score tier: "good", "moderate", or "poor". The quickest signal of whether this screen is performing acceptably. |
