Modern Android home screens, system launchers, and global device search surfaces (such as the Google Pixel Launcher’s unified search bar, Samsung One UI Finder, or third-party launchers) offer real-time search across local applications, device settings, web suggestions, in-app shortcuts, and personal contacts. Rather than having every search surface directly query separate system services, Android 11 and later utilise the Search UI Framework, managed system-wide by the SearchUiManagerService.
The Search UI subsystem manages active search sessions, synchronises user query contexts with registered system search providers, tracks search result impressions, and coordinates target predictions. For Android system developers, ROM engineers, and security analysts, the Android Debug Bridge (ADB) command dumpsys search_ui provides direct diagnostic insight into active search sessions, provider package bindings, predictive search tokens, and user session lifecycles. This guide explains how the Search UI architecture operates and details how to extract, filter, and analyse search session data using ADB.
Understanding Android SearchUiManagerService Architecture
The Search UI framework provides an abstraction layer between client applications (the “consumer” surface, typically the default system launcher or system search interface) and prediction/search backends (the “search provider”). The architecture relies on three primary components:
- SearchUiManagerService: A system service running inside the
system_serverprocess that brokers communication between search clients and registered provider implementations. It enforces Android multi-user isolation and validates package permissions. - SearchSessionId: A unique cryptographic or sequential token generated whenever a user opens a search surface or begins typing a query. All query updates, result clicks, impression logs, and dismissal actions correlate back to this session identifier.
- SearchContext: Metadata describing where search is being executed (e.g.
surface=launcher,display_id=0,result_types=apps|shortcuts|settings) and maximum result quotas. - SearchTarget: Individual structured items returned by the search provider, including application packages, deep links, sliced remote views, and action intents.
When a user taps the home screen search widget, the launcher binds to the search_ui service, instantiating a session. Diagnostics collected via ADB allow developers to verify whether their application’s published shortcuts or deep-search intents are properly surfaced and indexed by the system launcher.
Verifying ADB Connectivity and Search Service Availability
Connect your Android test device or emulator via USB or wireless ADB. Ensure USB Debugging is authorised in Developer Options, then verify device detection:
adb devices -l
Next, confirm that the search_ui service is registered and responding within the Android system server:
adb shell service list | grep -i search_ui
The output should return the registered Binder service:
142 search_ui: [android.app.search.ISearchUiManager]
If the service is absent, your Android build or OEM skin may not implement the standard Android Open Source Project (AOSP) Search UI framework, relying instead on proprietary standalone search engines.
Dumping Global Search UI Service State
To inspect the entire diagnostic state of the Search UI subsystem across all user profiles, execute the basic dumpsys command:
adb shell dumpsys search_ui
The output provides an overview of registered providers, active sessions, and multi-user configurations:
SEARCH UI MANAGER SERVICE (dumpsys search_ui)
========================================================
User 0:
Default service name: com.google.android.as/com.google.android.apps.miphone.aiai.search.service.SearchUiService
Is temporary service: false
Service bound: true
Bound component: ComponentInfo{com.google.android.as/com.google.android.apps.miphone.aiai.search.service.SearchUiService}
Active sessions count: 1
Session: SearchSessionId{id=c7a810f4-52d1-419b-a01b-5e6f30d074e2}
Client package: com.google.android.apps.nexuslauncher
Client UID: 10182
Surface: 1 (LAUNCHER_SEARCH)
Result types: 31 (APPS | SHORTCUTS | SETTINGS | PEOPLE | WEB)
Created at: 2026-11-08 02:05:14
Last interaction: 2026-11-08 02:18:22
Registered callbacks: 1
This dump identifies several critical runtime details:
- Bound Component: Shows the active on-device intelligence package handling search parsing (in the example above, Android System Intelligence / Private Compute Core under
com.google.android.as). - Client Package: Identifies which application initiated the search session (e.g.
com.google.android.apps.nexuslauncher). - Result Types: A bitmask indicating what categories of content the consumer requested from the provider.
Inspecting Active Search Sessions and Client Bindings
When debugging why search suggestions fail to appear or update sluggishly, examine the active session parameters and callback registrations.
Filtering Active Sessions for the Primary User
On devices with multiple profiles (e.g. Work Profile / Managed Profile), filter dumpsys to inspect only user 0 (personal) or user 10 (work):
# Extract active session details for primary user (User 0)
adb shell dumpsys search_ui --user 0
To isolate session IDs and associated client packages in automated test scripts, pipe the output through grep:
adb shell dumpsys search_ui | grep -E "(Session:|Client package:|Surface:)"
Simulating Search Interactions to Observe State Transitions
To observe how dumpsys search_ui updates during user activity:
- Unlock the Android device and tap the home screen search bar.
- Type a test query (e.g. “Camera”).
- Immediately capture the dumpsys state via ADB:
adb shell dumpsys search_ui > search_ui_active.txt
Inspect search_ui_active.txt to verify whether the session logged the query string, updated target scores, or received candidate result bundles from the intelligence provider.
Tracing Search Target Delivery and Impression Logs
The Search UI framework does not merely pass search results to the launcher; it also tracks user engagement (impressions, clicks, and dismissals) so ranking algorithms can prioritise frequently launched targets.
Search target diagnostic dumps capture events formatted under SearchTargetEvent:
adb shell dumpsys search_ui | grep -A 10 "SearchTargetEvent"
Output illustrates how interactions are logged:
Last Target Events:
[2026-11-08 02:18:25] EventType: 1 (TARGET_CLICK)
Target ID: app:com.google.android.GoogleCamera/.CameraActivity
Session ID: c7a810f4-52d1-419b-a01b-5e6f30d074e2
Action: launch
[2026-11-08 02:18:22] EventType: 4 (IMPRESSION)
Target ID: shortcut:com.android.chrome/incognito
Session ID: c7a810f4-52d1-419b-a01b-5e6f30d074e2
By reviewing these timestamps and event types, developers can confirm whether system telemetry correctly registers target selections or if event dispatching is dropped due to lifecycle race conditions.
Temporarily Overriding the Search UI Provider for Testing
Android allows developers to override the default system search provider with a custom debug provider service using cmd search_ui. This allows validating custom search algorithms without building a custom operating system image.
Setting a Temporary Search UI Service
To redirect search queries to a custom test package implementing SearchUiService, set a temporary service override:
# Syntax: cmd search_ui set-temporary-service <USER_ID> <COMPONENT_NAME> <DURATION_MS>
adb shell cmd search_ui set-temporary-service 0 com.example.customsearch/.MySearchUiService 600000
This command binds the Search UI framework to com.example.customsearch for 600,000 milliseconds (10 minutes). Once set, verify the binding with dumpsys:
adb shell dumpsys search_ui | grep -i "temporary"
The output will show Is temporary service: true along with your test package component name.
Clearing the Temporary Service Override
To immediately revert the Search UI subsystem back to the manufacturer’s default on-device intelligence provider, clear the temporary service assignment:
adb shell cmd search_ui set-temporary-service 0
Verify that the default system search provider is restored:
adb shell dumpsys search_ui | grep "Default service name"
Troubleshooting Common Search UI Issues
When debugging empty search results or launcher crashes during search typing, check the following diagnostic indicators:
- Service Unbound (
Service bound: false): Indicates the underlying intelligence package (e.g.com.google.android.as) crashed or was disabled via package manager. Check logcat for system server exceptions using:adb logcat -d -s SearchUiManagerService:V AndroidRuntime:E - Permission Denied on Session Creation: Consumer applications attempting to bind to
SearchUiManagerServicemust hold theandroid.permission.MANAGE_SEARCH_UIsignature permission. Non-system third-party launchers cannot directly bind to this service unless granted privileged platform status. - Work Profile Leakage: Verify that search sessions initiated under User 0 do not receive search targets from User 10 without proper user cross-profile badges by inspecting the
Target IDprefixes in the session dump.