Is there a way to get current activity's layout and views via adb?

50,310

Solution 1

Use adb shell uiautomator dump command:

Usage: uiautomator <subcommand> [options]

Available subcommands:

help: displays help message

runtest: executes UI automation tests
    runtest <class spec> [options]
    <class spec>: <JARS> < -c <CLASSES> | -e class <CLASSES> >
      <JARS>: a list of jar files containing test classes and dependencies. If
        the path is relative, it's assumed to be under /data/local/tmp. Use
        absolute path if the file is elsewhere. Multiple files can be
        specified, separated by space.
      <CLASSES>: a list of test class names to run, separated by comma. To
        a single method, use TestClass#testMethod format. The -e or -c option
        may be repeated. This option is not required and if not provided then
        all the tests in provided jars will be run automatically.
    options:
      --nohup: trap SIG_HUP, so test won't terminate even if parent process
               is terminated, e.g. USB is disconnected.
      -e debug [true|false]: wait for debugger to connect before starting.
      -e runner [CLASS]: use specified test runner class instead. If
        unspecified, framework default runner will be used.
      -e <NAME> <VALUE>: other name-value pairs to be passed to test classes.
        May be repeated.
      -e outputFormat simple | -s: enabled less verbose JUnit style output.

dump: creates an XML dump of current UI hierarchy
    dump [--verbose][file]
      [--compressed]: dumps compressed layout information.
      [file]: the location where the dumped XML should be stored, default is
      /storage/emulated/legacy/window_dump.xml

events: prints out accessibility events until terminated

By default it dumps the views hierarchy to $EXTERNAL_STORAGE/window_dump.xml

adb shell uiautomator dump
UI hierchary dumped to: /sdcard/window_dump.xml

Usually you would want to pull that file to your PC for further processing which would be an extra step. But there is a neat trick which allows to combine dumping and pulling into a single command. Using /dev/tty as a dump destination would make a single command which would print the whole dump to the stdout:

adb exec-out uiautomator dump /dev/tty
<?xml version='1.0' encoding='UTF-8' standalone='yes' ?><hierarchy rotation="0"><node ...></node></hierarchy>UI hierchary dumped to: /dev/tty

Solution 2

AndroidViewClient/culebra's dump tool lets you do precisely that. AndroidViewClient can be used as a library and also provides some tools like dump and culebra.

usage: dump [OPTION]... [serialno]

Options:
  -H, --help                       prints this help                             
  -V, --verbose                    verbose comments                             
  -v, --version
  -I, --ignore-secure-device       ignore secure device                         
  -E, --ignore-version-check       ignores ADB version check                    
  -F, --force-view-server-use      force view server use (even if UiAutomator present:w)
  -S, --do-not-start-view-server   don't start ViewServer                       
  -k, --do-not-ignore-uiautomator-killed don't ignore UiAutomator killed              
  -w, --window=WINDOW              dump WINDOW content (default: -1, all windows)
  -a, --all                        dump all information about Views             
  -i, --uniqueId                   dump View unique IDs                         
  -x, --position                   dump View positions                          
  -b, --bounds                     dump View bounds                             
  -d, --content-description        dump View content descriptions               
  -g, --tag                        dump View tags                               
  -c, --center                     dump View centers                            
  -f, --save-screenshot=FILE       save screenshot to file                      
  -W, --save-view-screenshots=DIR  save View screenshots to files in directory  
  -D, --do-not-dump-views          don't dump views, only useful if you specified -f or -W
  -A, --device-art=MODEL           device art model to frame screenshot (auto: autodetected)
  -Z, --drop-shadow                drop shadow for device art screenshot        
  -B, --glare                      screen glare over screenshot                 
  -h, --use-uiautomator-helper     use UiAutomatorHelper Android app            
  -X, --debug=LIST                 debug options 

running dump with no options, just prints the tree of Views and some of its basic properties, like ID

android.widget.FrameLayout  
   com.android.launcher3.Workspace com.google.android.apps.nexuslauncher:id/workspace 
      android.widget.FrameLayout com.google.android.apps.nexuslauncher:id/workspace_blocked_row 
         android.widget.TextView com.google.android.apps.nexuslauncher:id/date_text1 May 1
         android.widget.TextView com.google.android.apps.nexuslauncher:id/date_text2 MONDAY, 2017
      android.widget.TextView  Maps
   android.widget.ImageView com.google.android.apps.nexuslauncher:id/g_icon 
   android.widget.ImageView com.google.android.apps.nexuslauncher:id/all_apps_handle 
   android.view.ViewGroup com.google.android.apps.nexuslauncher:id/layout 
      android.widget.TextView  Messenger
      android.widget.TextView  Chrome

on the other hand, if you want the positions of the views, you can run

$ dump -x

android.widget.FrameLayout   (0, 0, 1440, 2392)
   com.android.launcher3.Workspace com.google.android.apps.nexuslauncher:id/workspace  (0, 0, 1440, 2392)
      android.widget.FrameLayout com.google.android.apps.nexuslauncher:id/workspace_blocked_row  (30, 126, 1380, 372)
         android.widget.TextView com.google.android.apps.nexuslauncher:id/date_text1 May 1 (1037, 194, 337, 162)
         android.widget.TextView com.google.android.apps.nexuslauncher:id/date_text2 MONDAY, 2017 (1092, 356, 282, 73)
      android.widget.TextView  Maps (30, 1614, 276, 372)
   android.widget.ImageView com.google.android.apps.nexuslauncher:id/g_icon  (30, 214, 276, 196)
   android.widget.ImageView com.google.android.apps.nexuslauncher:id/all_apps_handle  (636, 1986, 168, 98)
   android.view.ViewGroup com.google.android.apps.nexuslauncher:id/layout  (0, 2084, 1440, 308)
      android.widget.TextView  Messenger (306, 2112, 276, 280)
      android.widget.TextView  Chrome (858, 2112, 276, 280)

The options will give you control over the output. You can get some more info here.

Solution 3

adb pull $(adb shell uiautomator dump | grep -oP '[^ ]+.xml') /tmp/view.xml

Open /tmp/view.xml in a web browser like:

google-chrome /tmp/view.xml

adb exec-out uiautomator dump /dev/tty

from the other answer didn't work for me.

Solution 4

I used the following on a Mac to print formatted xml to the console:

adb shell uiautomator dump && adb pull /sdcard/window_dump.xml $TMPDIR && more $TMPDIR/window_dump.xml | xmllint --format -

You may need to change the path of the /sdcard/window_dump.xml file to pull based on where the xml file is dumped.

Solution 5

Use the following to view the xml layout in notepad or your default text editor

adb shell uiautomator dump && adb pull /sdcard/window_dump.xml && start window_dump.xml
Share:
50,310
Filipe Arruda
Author by

Filipe Arruda

Updated on September 09, 2021

Comments

  • Filipe Arruda
    Filipe Arruda almost 3 years

    For environment reasons I can only use adb commands.

    Is there a way to get the current layout attributes like id, position, text etc ?

    Similar to what uiautomatorviewer shows.

  • George Pantazes
    George Pantazes over 7 years
    Wanted to add a note that only one UIAutomator client can be running or the command will output "killed" and not work. I was stumped by this until I found out I was blocked by running tests using an open UIAutomator connection.
  • Jignesh
    Jignesh about 7 years
    @Alex I tried running the command ui automator dump to get the ui hierarchy from android emulator, but it seems that I am not getting the complete dump. What am I doing wrong? I am trying to get the dump for the activity of UCBrowser running in android emulator so that I can get the bound of a button/item to click. I have also asked a question on SO regarding same here - stackoverflow.com/questions/43780490/…
  • chinaanihchen
    chinaanihchen over 6 years
    in my computer not work. i change to this adb pull $(adb shell uiautomator dump | egrep -o '/.*?xml')
  • Alex P.
    Alex P. over 4 years
    In 2020 it's recommended to read the question you are replying to. For environment reasons I can only use adb commands.
  • Sam
    Sam over 4 years
    I got this error :( null root node returned by UiTestAutomationBridge