Modern Android home screens and third-party launchers allow users to execute rapid contextual tasks—such as composing a new message, opening an incognito browser tab, or navigating directly to a favourite contact—by long-pressing application icons. In the Android Open Source Project (AOSP) framework, these interactive quick actions are governed by the ShortcutService. The service handles manifest declarations, manages dynamic shortcut publishing, enforces system rate-limiting quotas, and coordinates with default launchers. When troubleshooting missing app shortcuts, launcher freezing, or shortcut quota exhaustion during development, Android Debug Bridge (ADB) provides complete visibility through dumpsys shortcut.
Android Shortcut Architecture: Static, Dynamic, and Pinned
The Android shortcut subsystem divides application shortcuts into three distinct operational categories:
- Static Shortcuts: Defined declaratively within the application’s APK inside an XML resource file (
res/xml/shortcuts.xml) referenced by the manifest. These shortcuts publish automatically upon app installation and cannot be modified at runtime without updating the APK. - Dynamic Shortcuts: Published, updated, and removed programmatically at runtime using the
ShortcutManagerorShortcutManagerCompatAPIs. These reflect contextual in-app actions, such as recent chat conversations or search history. - Pinned Shortcuts: Custom shortcuts explicitly dragged or pinned by the user directly onto the launcher’s home screen workspace. Pinned shortcuts remain visible on the home screen even if the publishing app unpublishes the corresponding dynamic shortcut.
Dumping the Shortcut Manager State via ADB
To inspect all registered shortcuts, rate-limiting counters, and launcher bindings on an Android device, run the diagnostic dump via ADB:
# Dump the complete ShortcutService diagnostic state
adb shell dumpsys shortcut
Because the output lists all installed packages across all user profiles, filter the output for a specific application package:
# Inspect shortcut registrations for a specific application (e.g. Google Chrome)
adb shell dumpsys shortcut | grep -A 40 "Package: com.android.chrome"
Understanding Shortcut Diagnostic Properties
Reviewing the dumped properties reveals how the operating system tracks individual shortcut entries:
ShortcutInfo {
id=new-incognito-tab
flags=0x21 [Manifest|Immutable]
activity=ComponentInfo{com.android.chrome/com.google.android.apps.chrome.Main}
shortLabel=New Incognito tab
longLabel=Open a new Incognito tab
intent=Intent { act=android.intent.action.VIEW dat=chrome://incognito }
rank=1
timestamp=1704067200000
}
Key indicators include:
- id: The unique string identifier assigned by the developer to identify the shortcut within the package namespace.
- flags: Bitmask flags indicating shortcut type and state:
Manifest (0x20):Static shortcut declared in the APK XML.Dynamic (0x01):Runtime dynamic shortcut published via API.Pinned (0x02):Pinned to the home screen.Disabled (0x04):Explicitly disabled by the app (includesdisabledReason).
- rank: The display order relative to adjacent shortcuts when the long-press popup opens.
- intent: The explicit Intent action, URI data, component class, and bundle extras dispatched when the user taps the shortcut.
Inspecting and Resetting Shortcut Rate Limiting (Throttling)
To prevent background applications from saturating system memory and depleting battery through continuous shortcut updates, Android enforces strict API rate-limiting on foreground and background calls. In dumpsys shortcut:
# Check remaining API call quotas in the dump header
adb shell dumpsys shortcut | grep -i "remaining calls"
If an application exhausts its daily quota during automated testing or debugging, the ShortcutManager rejects subsequent calls. Reset the throttling counter immediately using the command runner:
# Reset shortcut API call rate-limiting counters for all apps
adb shell cmd shortcut reset-throttling
# Reset throttling for a specific Android user profile (e.g. User 0)
adb shell cmd shortcut reset-throttling --user 0
Managing and Clearing Shortcuts via ADB Command Runner
Developers can clear corrupted shortcut caches or reset launcher mappings directly from the terminal without reinstalling the application:
# Clear all dynamic and manifest shortcuts published by an application
adb shell cmd shortcut clear-shortcuts com.example.myapp
# Verify available commands supported by the shortcut command runner
adb shell cmd shortcut help
Auditing Shortcut Icon Memory and Bitmap Limits
Shortcut icons are stored in system memory to ensure instant popup rendering. Android enforces maximum icon dimension and memory limits:
# Check maximum allowed icon dimensions and memory limits in the dump
adb shell dumpsys shortcut | grep -i "max icon"
If an application submits dynamic shortcuts with excessively large custom bitmaps (such as uncompressed avatar images), the ShortcutService will downscale the image or drop the icon to protect system heap memory.
Troubleshooting Common Shortcut Failures
When shortcuts fail to render on the home screen or trigger application crashes:
- Target Activity Not Exported: Check the
intentblock in the dump. If the target activity specifies an explicit component that is not exported (android:exported="false") without identical UID sharing, the launcher will crash with aSecurityExceptionupon invocation. - Missing XML Resource Linking: If static shortcuts do not appear, verify in the dump whether the manifest metadata
android.app.shortcutssuccessfully registered under the main launcher activity. - Disabled by Application Update: If a pinned shortcut becomes greyed out, check
disabledReason. If an app update removes a static shortcut ID from the APK, Android marks surviving pinned home screen shortcuts as disabled to prevent broken Intent routing.