To run an Android app in a virtual display and retrieve its window UI tree on AOSP (Android Open Source Project) using Java/Android APIs, you’ll need to combine several Android system-level features. Here’s a high-level approach and the key APIs/libraries you’ll use:
A virtual display allows you to render an app’s UI into a virtual screen, which you can then capture or inspect.
VirtualDisplay (via WindowManager or DisplayManager)SurfaceControl (for capturing the display)MediaProjection (for screen mirroring/capture)java// Request user permission for screen capture Intent intent = mediaProjectionManager.createScreenCaptureIntent(); startActivityForResult(intent, REQUEST_CODE);
javaVirtualDisplay virtualDisplay = displayManager.createVirtualDisplay( "VirtualDisplay", width, height, dpi, surface, DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR, null, null);
DisplayManager to create the virtual display.Surface to it.To inspect the app’s window hierarchy (e.g., for UI testing or accessibility), use:
AccessibilityService (for UI tree inspection)WindowManager (for window hierarchy)UiAutomation (for dumping the UI hierarchy)Implement an AccessibilityService:
javapublic class MyAccessibilityService extends AccessibilityService { @Override public void onAccessibilityEvent(AccessibilityEvent event) { // Handle accessibility events (e.g., window state changes) } @Override public void onInterrupt() {} }
AndroidManifest.xml.Dump the UI Hierarchy:
javaUiAutomation uiAutomation = getUiAutomation(); AccessibilityNodeInfo root = uiAutomation.getRootInActiveWindow(); // Traverse the tree or dump it to XML/JSON Log.d("UI_TREE", root.toString());
Use adb shell dumpsys window (for debugging):
bashadb shell dumpsys window windows
If you want to capture the virtual display (e.g., for screenshots or video):
SurfaceControl to create a screenshot:
javaSurfaceControl screenshot = SurfaceControl.screenshot( virtualDisplay.getDisplay().getDisplayId());
MediaProjection to record the virtual display.Here’s a rough outline for a system app:
xml<uses-permission android:name="android.permission.MEDIA_PROJECTION" /> <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /> <uses-permission android:name="android.permission.ACCESSIBILITY_SERVICE" />
java// 1. Create VirtualDisplay DisplayManager displayManager = (DisplayManager) getSystemService(DISPLAY_SERVICE); VirtualDisplay virtualDisplay = displayManager.createVirtualDisplay( "VirtualDisplay", 1080, 1920, 320, surface, DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR, null, null); // 2. Start AccessibilityService Intent intent = new Intent(this, MyAccessibilityService.class); startService(intent); // 3. Dump UI Tree UiAutomation uiAutomation = getUiAutomation(); AccessibilityNodeInfo root = uiAutomation.getRootInActiveWindow();
root.UiAutomator or Espresso.Would you like a more detailed code example for a specific part (e.g., virtual display setup or UI tree dumping)? Or are you targeting a specific AOSP version?