adb: The Android Debug Bridge and Commands

1. What is ADB?

    ADB stands for Android Debug Bridge, it is a command line tool (a client-server program) which helps a developer to communicate with an Android device (Phone/Tablet/TV/Watch) to get important log information to debug and test an Android application.

    The adb can be used to run commands on a device.


2. What are the components of adb?

    The adb consists of 3 compoments:

    The ADB Components - Client - Daemon - Server - Android Device - Developer Device
    1. Client: The client runs on the developer's machine and is used to send commands to the Android device.
    2. Daemon: It is also known as atbd (Android Debug Bridge Daemon) which is a background service/process that runs on the device used to run the commands sent by the client.
    3. Server: The server is a program that runs as a background service/process that runs on the developer's device. It is used to manage communication between the client and the daemon (atbd).

3. Where is adb available?

    The adb is available Android SDK Platform Tools package.

    adb location on Mac (macOS)

    You can find adb under /Users/user-name/Library/Android/sdk/platform-tools

    Example:
    % cd ~/Library/Android/sdk/platform-tools
    
    % ls -ltrh
    
    total 49520
    -rwxr-xr-x@ 1 c2ctechtv  staff   235K Jul 13 23:13 dmtracedump
    -rwxr-xr-x@ 1 c2ctechtv  staff   1.5M Jul 13 23:13 mke2fs
    drwxr-xr-x@ 3 c2ctechtv  staff    96B Jul 13 23:13 lib64
    -rwxr-xr-x@ 1 c2ctechtv  staff   549K Jul 13 23:13 make_f2fs_casefold
    -rw-r--r--@ 1 c2ctechtv  staff    38B Jul 13 23:13 source.properties
    -rw-r--r--@ 1 c2ctechtv  staff   1.1K Jul 13 23:13 mke2fs.conf
    -rwxr-xr-x@ 1 c2ctechtv  staff    13M Jul 13 23:13 adb
    -rwxr-xr-x@ 1 c2ctechtv  staff   656K Jul 13 23:13 etc1tool
    -rwxr-xr-x@ 1 c2ctechtv  staff   3.9M Jul 13 23:13 fastboot
    -rwxr-xr-x@ 1 c2ctechtv  staff   549K Jul 13 23:13 make_f2fs
    -rwxr-xr-x@ 1 c2ctechtv  staff   2.7M Jul 13 23:13 sqlite3
    -rwxr-xr-x@ 1 c2ctechtv  staff   131K Jul 13 23:13 hprof-conv
    -rw-r--r--@ 1 c2ctechtv  staff   1.0M Jul 13 23:13 NOTICE.txt
    -rw-r--r--@ 1 c2ctechtv  staff    18K Jul 13 23:13 package.xml
    ADB Location on Mac - macOS

    adb location on Windows

    On Windows you can find adb under C:\Users\user-name\AppData\Local\Android\Sdk\platform-tools\adb.exe

    Example:
    C:\Users\code2care\AppData\Local\Android\Sdk\platform-tools\adb.exe

4. What port does the adb server run on?

    The adb server runs on the TCP port 5037. The adb clients make use of the port 5037 to communicate with the adb server.


5. How to enable adb debugging on your device using USB Cable

    1. Enable USB debugging on the Android device under Developer options (which is disabled by default, needs to be enabled)
    2. Connect your device with USB to the developer's computer.
    3. You can verify the device is connected successfully using the adb devices command.
      ./adb devices
      
      * daemon not running; starting now at tcp:5037
      * daemon started successfully
      List of devices attached
      
      - Google Pixel 6A
      - Samsung Galaxy S10

6. How to enable adb debugging on your device using Wifi Connection

    Note: Wifi Debugging is supported from Android 11 (API level 30) and higher.

    1. Make sure the developer's option is enabled on your Android device.
    2. In Android Studio go to Run -> Run Configurations -> Pair Devices Using Wi-Fi
    3. Now Pair devices over Wi-Fi using the QR code
    4. Now on your device enable - Wireless debugging.
    5. Once connected, run and deploy your app to the device.

7. ADB Commands with Examples

Command Description Example Sample Output
adb devices To list all connected Android devices adb devices List of devices attached
emulator-5554 device
adb shell To open an interactive shell on the device adb shell shell@device:/ $
adb install <path_to_apk> To install an Android application adb install app.apk Success
Package com.example.app installed
adb uninstall <package_name> To uninstall an installed application adb uninstall com.example.app Success
Uninstall succeeded
adb push <local_path> <device_path> To copy a file from your computer to the device adb push file.txt /sdcard/ [100%] /sdcard/file.txt
adb pull <device_path> <local_path> To copy a file from the device to your computer adb pull /sdcard/file.txt /path/to/save/ /sdcard/file.txt: 1 file pulled
adb logcat To display the device log messages adb logcat Log messages from the device
adb reboot To reboot the device adb reboot Device reboots
adb shell screencap <filename> To capture a screenshot of the device's screen adb shell screencap /sdcard/screenshot.png -
adb shell screenrecord <filename> To record the device's screen as a video adb shell screenrecord /sdcard/video.mp4 -
adb shell am start -n <package/activity> To launch an activity of a specific package on the device adb shell am start -n org.code2care.app/.MainActivity -
adb shell pm list packages To list all installed packages on the device adb shell pm list packages List of installed packages
adb forward <local> <remote> To forward a local port to a remote port on the device adb forward tcp:8080 tcp:8080 -
adb reverse <remote> <local> To reverse port forwarding from a remote to a local port adb reverse tcp:8080 tcp:8080 -
adb backup <package> To create a full backup of the specified package adb backup org.code2care.app Now unlock your device and confirm the backup operation
adb restore <backup_file> To restore a backup previously created with adb adb restore backup.ab Now unlock your device and confirm the restore operation
adb shell pm grant <package> <permission> To grant permission to a specified package on the device adb shell pm grant org.code2care.app android.permission.CAMERA -
adb shell pm revoke <package> <permission> To revoke permission from a specified package on the device adb shell pm revoke org.code2care.app android.permission.CAMERA -

8. ADB Commands List

    You can make use of the help command in Terminal/Console to know the list of all commands.

    ./adb help
    
    Android Debug Bridge version 1.0.41
    Version 34.0.4-10411341
    Installed as /Users/c2ctechtv/Library/Android/sdk/platform-tools/adb
    Running on Darwin 23.0.0 (arm64)
    
    global options:
     -a                       listen on all network interfaces, not just localhost
     -d                       use USB device (error if multiple devices connected)
     -e                       use TCP/IP device (error if multiple TCP/IP devices available)
     -s SERIAL                use device with given serial (overrides $ANDROID_SERIAL)
     -t ID                    use device with given transport id
     -H                       name of adb server host [default=localhost]
     -P                       port of adb server [default=5037]
     -L SOCKET                listen on given socket for adb server [default=tcp:localhost:5037]
     --one-device SERIAL|USB  only allowed with 'start-server' or 'server nodaemon', server will only connect to one USB device, specified by a serial number or USB device address.
     --exit-on-write-error    exit if stdout is closed
    
    general commands:
     devices [-l]             list connected devices (-l for long output)
     help                     show this help message
     version                  show version num
    
    networking:
     connect HOST[:PORT]      connect to a device via TCP/IP [default port=5555]
     disconnect [HOST[:PORT]]
         disconnect from given TCP/IP device [default port=5555], or all
     pair HOST[:PORT] [PAIRING CODE]
         pair with a device for secure TCP/IP communication
     forward --list           list all forward socket connections
     forward [--no-rebind] LOCAL REMOTE
         forward socket connection using:
           tcp:<port> (<local> may be "tcp:0" to pick any open port)
           localabstract:<unix domain socket name>
           localreserved:<unix domain socket name>
           localfilesystem:<unix domain socket name>
           dev:<character device name>
           jdwp:<process pid> (remote only)
           vsock:<CID>:<port> (remote only)
           acceptfd:<fd> (listen only)
     forward --remove LOCAL   remove specific forward socket connection
     forward --remove-all     remove all forward socket connections
     reverse --list           list all reverse socket connections from device
     reverse [--no-rebind] REMOTE LOCAL
         reverse socket connection using:
           tcp:<port> (<remote> may be "tcp:0" to pick any open port)
           localabstract:<unix domain socket name>
           localreserved:<unix domain socket name>
           localfilesystem:<unix domain socket name>
     reverse --remove REMOTE  remove specific reverse socket connection
     reverse --remove-all     remove all reverse socket connections from device
     mdns check               check if mdns discovery is available
     mdns services            list all discovered services
    
    file transfer:
     push [--sync] [-z ALGORITHM] [-Z] LOCAL... REMOTE
         copy local files/directories to device
         --sync: only push files that are newer on the host than the device
         -n: dry run: push files to device without storing to the filesystem
         -z: enable compression with a specified algorithm (any/none/brotli/lz4/zstd)
         -Z: disable compression
     pull [-a] [-z ALGORITHM] [-Z] REMOTE... LOCAL
         copy files/dirs from device
         -a: preserve file timestamp and mode
         -z: enable compression with a specified algorithm (any/none/brotli/lz4/zstd)
         -Z: disable compression
     sync [-l] [-z ALGORITHM] [-Z] [all|data|odm|oem|product|system|system_ext|vendor]
         sync a local build from $ANDROID_PRODUCT_OUT to the device (default all)
         -n: dry run: push files to device without storing to the filesystem
         -l: list files that would be copied, but don't copy them
         -z: enable compression with a specified algorithm (any/none/brotli/lz4/zstd)
         -Z: disable compression
    
    shell:
     shell [-e ESCAPE] [-n] [-Tt] [-x] [COMMAND...]
         run remote shell command (interactive shell if no command given)
         -e: choose escape character, or "none"; default '~'
         -n: don't read from stdin
         -T: disable pty allocation
         -t: allocate a pty if on a tty (-tt: force pty allocation)
         -x: disable remote exit codes and stdout/stderr separation
     emu COMMAND              run emulator console command
    
    app installation (see also `adb shell cmd package help`):
     install [-lrtsdg] [--instant] PACKAGE
         push a single package to the device and install it
     install-multiple [-lrtsdpg] [--instant] PACKAGE...
         push multiple APKs to the device for a single package and install them
     install-multi-package [-lrtsdpg] [--instant] PACKAGE...
         push one or more packages to the device and install them atomically
         -r: replace existing application
         -t: allow test packages
         -d: allow version code downgrade (debuggable packages only)
         -p: partial application install (install-multiple only)
         -g: grant all runtime permissions
         --abi ABI: override platform's default ABI
         --instant: cause the app to be installed as an ephemeral install app
         --no-streaming: always push APK to device and invoke Package Manager as separate steps
         --streaming: force streaming APK directly into Package Manager
         --fastdeploy: use fast deploy
         --no-fastdeploy: prevent use of fast deploy
         --force-agent: force update of deployment agent when using fast deploy
         --date-check-agent: update deployment agent when local version is newer and using fast deploy
         --version-check-agent: update deployment agent when local version has different version code and using fast deploy
         --local-agent: locate agent files from local source build (instead of SDK location)
         (See also `adb shell pm help` for more options.)
     uninstall [-k] PACKAGE
         remove this app package from the device
         '-k': keep the data and cache directories
    
    debugging:
     bugreport [PATH]
         write bugreport to given PATH [default=bugreport.zip];
         if PATH is a directory, the bug report is saved in that directory.
         devices that don't support zipped bug reports output to stdout.
     jdwp                     list pids of processes hosting a JDWP transport
     logcat                   show device log (logcat --help for more)
    
    security:
     disable-verity           disable dm-verity checking on userdebug builds
     enable-verity            re-enable dm-verity checking on userdebug builds
     keygen FILE
         generate adb public/private key; private key stored in FILE,
    
    scripting:
     wait-for[-TRANSPORT]-STATE...
         wait for device to be in a given state
         STATE: device, recovery, rescue, sideload, bootloader, or disconnect
         TRANSPORT: usb, local, or any [default=any]
     get-state                print offline | bootloader | device
     get-serialno             print <serial-number>
     get-devpath              print <device-path>
     remount [-R]
          remount partitions read-write. if a reboot is required, -R will
          will automatically reboot the device.
     reboot [bootloader|recovery|sideload|sideload-auto-reboot]
         reboot the device; defaults to booting system image but
         supports bootloader and recovery too. sideload reboots
         into recovery and automatically starts sideload mode,
         sideload-auto-reboot is the same but reboots after sideloading.
     sideload OTAPACKAGE      sideload the given full OTA package
     root                     restart adbd with root permissions
     unroot                   restart adbd without root permissions
     usb                      restart adbd listening on USB
     tcpip PORT               restart adbd listening on TCP on PORT
    
    internal debugging:
     start-server             ensure that there is a server running
     kill-server              kill the server if it is running
     reconnect                kick connection from host side to force reconnect
     reconnect device         kick connection from device side to force reconnect
     reconnect offline        reset offline/unauthorized devices to force reconnect
    
    usb:
     attach                   attach a detached USB device
     detach                   detach from a USB device to allow use by other processes
    environment variables:
     $ADB_TRACE
         comma-separated list of debug info to log:
         all,adb,sockets,packets,rwx,usb,sync,sysdeps,transport,jdwp
     $ADB_VENDOR_KEYS         colon-separated list of keys (files or directories)
     $ANDROID_SERIAL          serial number to connect to (see -s)
     $ANDROID_LOG_TAGS        tags to be used by logcat (see logcat --help)
     $ADB_LOCAL_TRANSPORT_MAX_PORT max emulator scan port (default 5585, 16 emus)
     $ADB_MDNS_AUTO_CONNECT   comma-separated list of mdns services to allow auto-connect (default adb-tls-connect)
    
    Online documentation (MAN Page): 
    
    https://android.googlesource.com/platform/packages/modules/adb/+/refs/heads/master/docs/user/adb.1.md

    Comments & Discussion

    Facing issues? Have questions? Post them here! We're happy to help!