当前位置:首页 > 今天的世界杯

ADB 操作命令详解及用法大全​

admin 2025-11-08 08:17:06 6260

ADB 操作命令详解及用法大全 ​一、ADB是什么? ​ADB,即 Android Debug Bridge 是一种允许模拟器或已连接的 Android 设备进行通信的命令行工具,它可为各种设备操作提供便利,如安装和调试应用,并提供对 Unix shell(可用来在模拟器或连接的设备上运行各种命令)的访问。可以在Android SDK/platform-tools中找到 adb 工具或下载 ADB Kits 。

注: 有部分命令的支持情况可能与 Android 系统版本及定制 ROM 的实现有关。

二、ADB有什么作用? ​ADB 是 Android SDK 里的一个工具, 用这个工具可以直接操作管理 Android 模拟器或者真实的 Android 设备。它的主要功能有:

在设备上运行Shell命令;将本地APK软件安装至模拟器或Android设备;管理设备或手机模拟器上的预定端口;在设备或手机模拟器上复制或粘贴文件。ADB 是一个客户端-服务器程序程序,包括三个组件:

客户端:该组件发送命令。客户端在开发计算机上运行。您可以通过发出 adb 命令从命令行终端调用客户端。后台程序:该组件在设备上运行命令。后台程序在每个模拟器或设备实例上作为后台进程运行。服务器:该组件管理客户端和后台程序之间的通信。服务器在开发计算机上作为后台进程运行。三、ADB命令语法 ​adb 命令的基本语法如下:

shelladb [-d|-e|-s ] 单一设备/模拟器连接 ​如果只有一个设备/模拟器连接时,可以省略掉 [-d|-e|-s ] 这一部分,直接使用 adb

多个设备/模拟器连接 ​如果有多个设备/模拟器连接,则需要为命令指定目标设备,下表是指定目标设备的命令选项:

参数含义-d指定当前唯一通过 USB 连接的 Android 设备为命令目标-e指定当前唯一运行的模拟器为命令目标-s 指定相应设备序列号的设备/模拟器为命令目标在多个设备/模拟器连接的情况下较常用的是 -s 参数,serial-number是指设备的设备序列号,可以通过 adb devices 命令获取。

四、ADB常用命令 ​4.1 基本命令 ​4.1.1 查看adb的版本信息 ​shelladb version4.1.2 启动adb ​shelladb start-server一般无需手动执行此命令,在运行 adb 命令时若发现 adb server 没有启动会自动调起。

4.1.3 停止adb ​shelladb kill-server4.1.4 以 root 权限运行 adbd ​shelladb root4.1.5 指定 adb server 的网络端口 ​shelladb -P start-serverADB的默认端口为 5037。

4.1.5 查询已连接的设备/模拟器列表 ​shelladb devices4.2 设备连接管理 ​4.2.1 USB 连接 ​通过 USB 连接来正常使用 adb 需要以下步骤:

确认硬件状态正常(包括 Android 设备处于正常开机状态,USB 连接线和各种接口完好)。Android 设备的开发者选项和 USB 调试模式已开启(可以在「设置」-「开发者选项」-「USB调试」打开USB调试)。确认设备驱动状态正常(安装ADB驱动程序)。通过 USB 线连接好电脑和设备后确认状态。通过 adb devices 命令查看设备连接情况。4.2.2 WLAN 连接(需要 USB 线) ​借助 USB 通过 WiFi 连接来正常使用 adb 需要以下步骤: 操作步骤:

将 Android 设备与要运行 adb 的电脑连接到同一个 WiFi。将设备与电脑通过 USB 线连接(可通过 adb devices 命令查看设备连接情况)。通过 adb tcpip 5555 命令让设备在 5555 端口监听 TCP/IP 连接。断开 USB 连接。找到设备的 IP 地址(可以在「设置」-「关于手机」-「状态信息」-「IP地址」查看 IP 地址)。通过 adb connect 命令使用 IP 地址将 Android 设备与电脑连接。通过 adb devices 命令查看设备连接情况。使用完毕后可通过 adb disconnect 命令断开无线连接。4.2.3 WLAN 连接(无需借助 USB 线) ​注:需要 root 权限。 不借助 USB 通过 WiFi 连接来正常使用 adb 需要以下步骤:

在 Android 设备上安装一个终端模拟器(可通过Terminal Emulator for Android Downloads下载)。将 Android 设备与要运行 adb 的电脑连接到同一个 WiFi。打开 Android 设备上的终端模拟器,在里面依次运行命令:shellsu

setprop service.adb.tcp.port 5555找到设备的 IP 地址(可以在「设置」-「关于手机」-「状态信息」-「IP地址」查看 IP 地址)。通过 adb connect 命令使用 IP 地址将 Android 设备与电脑连接。通过 adb devices 命令查看设备连接情况。4.2.4 WiFi 连接转为 USB 连接 ​通过adb usb命令以USB模式重新启动ADB:

shelladb usb4.3 应用管理 ​4.3.1 查看应用列表 ​查看应用列表的基本命令格式是:

shelladb shell pm list packages [-f] [-d] [-e] [-s] [-3] [-i] [-u] [--user USER_ID] [FILTER]adb shell pm list packages 后面可以跟一些可选参数进行过滤查看不同的列表,可用参数及含义如下:

参数显示列表无所有应用-f显示应用关联的 apk 文件-d只显示 disabled 的应用-e只显示 enabled 的应用-s只显示系统应用-3只显示第三方应用-i显示应用的 installer-u包含已卸载应用包名包含 字符串4.3.1.1 查看所有应用 ​shelladb shell pm list packages4.3.1.2 查看系统应用 ​shelladb shell pm list packages -s4.3.1.3 查看第三方应用 ​shelladb shell pm list packages -34.3.1.4 包名包含某字符串的应用 ​比如要查看包名包含字符串 huawei 的应用列表,命令:

shelladb shell pm list packages huawei4.3.2 安装应用 ​安装应用的基本命令格式是:

shelladb install [-l] [-r] [-t] [-s] [-d] [-g] adb install 后面可以跟一些可选参数来控制安装 APK 的行为,可用参数及含义如下:

参数含义-l将应用安装到保护目录 /mnt/asec-r允许覆盖安装-t允许安装 AndroidManifest.xml 里 application 指定 android:testOnly="true" 的应用-s将应用安装到 sdcard-d允许降级覆盖安装-g授予所有运行时权限运行命令后可以看到输出内容,包含安装进度和状态,安装状态如下:

Success:代表安装成功。Failure:代表安装失败。 APK 安装失败的情况有很多,Failure状态之后有安装失败输出代码。常见安装失败输出代码、含义及可能的解决办法如下:输出代码含义解决办法INSTALL_FAILED_ALREADY_EXISTS应用已经存在,或卸载了但没卸载干净adb install 时使用 -r 参数,或者先 adb uninstall 再安装INSTALL_FAILED_INVALID_APK无效的 APK 文件INSTALL_FAILED_INVALID_URI无效的 APK 文件名确保 APK 文件名里无中文INSTALL_FAILED_INSUFFICIENT_STORAGE空间不足清理空间INSTALL_FAILED_DUPLICATE_PACKAGE已经存在同名程序INSTALL_FAILED_NO_SHARED_USER请求的共享用户不存在INSTALL_FAILED_UPDATE_INCOMPATIBLE以前安装过同名应用,但卸载时数据没有移除;或者已安装该应用,但签名不一致先 adb uninstall 再安装INSTALL_FAILED_SHARED_USER_INCOMPATIBLE请求的共享用户存在但签名不一致INSTALL_FAILED_MISSING_SHARED_LIBRARY安装包使用了设备上不可用的共享库INSTALL_FAILED_REPLACE_COULDNT_DELETE替换时无法删除INSTALL_FAILED_DEXOPTdex 优化验证失败或空间不足INSTALL_FAILED_OLDER_SDK设备系统版本低于应用要求INSTALL_FAILED_CONFLICTING_PROVIDER设备里已经存在与应用里同名的 content providerINSTALL_FAILED_NEWER_SDK设备系统版本高于应用要求INSTALL_FAILED_TEST_ONLY应用是 test-only 的,但安装时没有指定 -t 参数INSTALL_FAILED_CPU_ABI_INCOMPATIBLE包含不兼容设备 CPU 应用程序二进制接口的 native codeINSTALL_FAILED_MISSING_FEATURE应用使用了设备不可用的功能INSTALL_FAILED_CONTAINER_ERROR1. sdcard 访问失败; 2. 应用签名与 ROM 签名一致,被当作内置应用。1. 确认 sdcard 可用,或者安装到内置存储; 2. 打包时不与 ROM 使用相同签名。INSTALL_FAILED_INVALID_INSTALL_LOCATION1. 不能安装到指定位置; 2. 应用签名与 ROM 签名一致,被当作内置应用。1. 切换安装位置,添加或删除 -s 参数; 2. 打包时不与 ROM 使用相同签名。INSTALL_FAILED_MEDIA_UNAVAILABLE安装位置不可用一般为 sdcard,确认 sdcard 可用或安装到内置存储INSTALL_FAILED_VERIFICATION_TIMEOUT验证安装包超时INSTALL_FAILED_VERIFICATION_FAILURE验证安装包失败INSTALL_FAILED_PACKAGE_CHANGED应用与调用程序期望的不一致INSTALL_FAILED_UID_CHANGED以前安装过该应用,与本次分配的 UID 不一致清除以前安装过的残留文件INSTALL_FAILED_VERSION_DOWNGRADE已经安装了该应用更高版本使用 -d 参数INSTALL_FAILED_PERMISSION_MODEL_DOWNGRADE已安装 target SDK 支持运行时权限的同名应用,要安装的版本不支持运行时权限INSTALL_PARSE_FAILED_NOT_APK指定路径不是文件,或不是以 .apk 结尾INSTALL_PARSE_FAILED_BAD_MANIFEST无法解析的 AndroidManifest.xml 文件INSTALL_PARSE_FAILED_UNEXPECTED_EXCEPTION解析器遇到异常INSTALL_PARSE_FAILED_NO_CERTIFICATES安装包没有签名INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES已安装该应用,且签名与 APK 文件不一致先卸载设备上的该应用,再安装INSTALL_PARSE_FAILED_CERTIFICATE_ENCODING解析 APK 文件时遇到 CertificateEncodingExceptionINSTALL_PARSE_FAILED_BAD_PACKAGE_NAMEmanifest 文件里没有或者使用了无效的包名INSTALL_PARSE_FAILED_BAD_SHARED_USER_IDmanifest 文件里指定了无效的共享用户 IDINSTALL_PARSE_FAILED_MANIFEST_MALFORMED解析 manifest 文件时遇到结构性错误INSTALL_PARSE_FAILED_MANIFEST_EMPTY在 manifest 文件里找不到找可操作标签(instrumentation 或 application)INSTALL_FAILED_INTERNAL_ERROR因系统问题安装失败INSTALL_FAILED_USER_RESTRICTED用户被限制安装应用INSTALL_FAILED_DUPLICATE_PERMISSION应用尝试定义一个已经存在的权限名称INSTALL_FAILED_NO_MATCHING_ABIS应用包含设备的应用程序二进制接口不支持的 native codeINSTALL_CANCELED_BY_USER应用安装需要在设备上确认,但未操作设备或点了取消在设备上同意安装INSTALL_FAILED_ACWF_INCOMPATIBLE应用程序与设备不兼容INSTALL_FAILED_TEST_ONLYAPK 文件是使用 Android Studio 直接 RUN 编译出来的文件通过 Gradle 的 assembleDebug 或 assembleRelease 重新编译,或者 Generate Signed APKdoes not contain AndroidManifest.xml无效的 APK 文件is not a valid zip file无效的 APK 文件Offline设备未连接成功先将设备与 adb 连接成功unauthorized设备未授权允许调试error: device not found没有连接成功的设备先将设备与 adb 连接成功protocol failure设备已断开连接先将设备与 adb 连接成功Unknown option: -sAndroid 2.2 以下不支持安装到 sdcard不使用 -s 参数No space left on device空间不足清理空间Permission denied ... sdcard ...sdcard 不可用signatures do not match the previously installed version; ignoring!已安装该应用且签名不一致先卸载设备上的该应用,再安装参考:PackageManager.java

adb install 实际是分三步完成:

push apk 文件到 /data/local/tmp。调用 pm install 安装。删除 /data/local/tmp 下的对应 apk 文件。4.3.3 卸载应用 ​卸载应用的基本命令格式是:

shelladb uninstall [-k] 表示应用的包名,-k 参数可选,表示卸载应用但保留数据和缓存目录。

4.3.4 清除应用数据与缓存 ​shelladb shell pm clear 表示应用名包,这条命令的效果相当于在设置里的应用信息界面点击了「清除缓存」和「清除数据」。

4.3.5 查看前台 Activity ​shelladb shell dumpsys activity activities | grep mFocusedActivity4.3.6 查看正在运行的 Services ​shelladb shell dumpsys activity services [] 参数不是必须的,指定 表示查看与某个包名相关的 Services,不指定表示查看所有 Services。 不一定要给出完整的包名,可以只给一部分,那么所给包名相关的 Services 都会列出来。

4.3.7 查看应用详细信息 ​shelladb shell dumpsys package 表示应用包名。运行次命令的输出中包含很多信息,包括 Activity Resolver Table、Registered ContentProviders、包名、userId、安装后的文件资源代码等路径、版本信息、权限信息和授予状态、签名版本信息等。

4.3.7 查看应用安装路径 ​shelladb shell pm path 4.4 与应用交互 ​与应用交互主要是使用 am 命令,常用的 如下:

command用途start [options] 启动 指定的 Activitystartservice [options] 启动 指定的 Servicebroadcast [options] 发送 指定的广播force-stop 停止 相关的进程 参数很灵活,和写 Android 程序时代码里的 Intent 相对应。

用于决定 intent 对象的选项如下:

参数含义-a 指定 action,比如 android.intent.action.VIEW-c 指定 category,比如 android.intent.category.APP_CONTACTS-n 指定完整 component 名,用于明确指定启动哪个 Activity 里还能带数据,就像写代码时的 Bundle 一样:

参数含义--esn null 值(只有 key 名)-e|--es string 值--ez boolean 值--ei integer 值--el long 值--ef float 值--eu URI--ecn component name--eia [, [,例如:

shelladb shell am start -a android.settings.SETTINGS # 打开系统设置页面

adb shell am start -a android.intent.action.DIAL -d tel:10086 # 打开拨号页面

adb shell am start -n com.android.mms/.ui.ConversationList # 打开短信会话列表options 是一些改变其行为的选项,支持的可选参数及含义如下:

选项含义-D启用调试-W等待启动完成--start-profiler file启动分析器并将结果发送到 file-P file类似于 --start-profiler,但当应用进入空闲状态时分析停止-R count重复 Activity 启动次数-S启动 Activity 前强行停止目标应用--opengl-trace启用 OpenGL 函数的跟踪--user user_id | current指定要作为哪个用户运行;如果未指定,则作为当前用户运行4.4.2 调起 Service ​shelladb shell am startservice [options] 一个典型的用例是如果设备上原本应该显示虚拟按键但是没有显示,可以试试这个:

shelladb shell am startservice -n com.android.systemui/.SystemUIService4.4.3 停止 Service ​shelladb shell am stopservice [options] 4.4.4 发送广播 ​shelladb shell am broadcast [options] 可以向所有组件广播,也可以只向指定组件广播。

例如,向所有组件广播 BOOT_COMPLETED:

shelladb shell am broadcast -a android.intent.action.BOOT_COMPLETED又例如,只向 com.android.receiver.test/.BootCompletedReceiver 广播 BOOT_COMPLETED:

shelladb shell am broadcast -a android.intent.action.BOOT_COMPLETED -n com.android.receiver.test/.BootCompletedReceiver这类用法在测试的时候很实用,比如某个广播的场景很难制造,可以考虑通过这种方式来发送广播。

既能发送系统预定义的广播,也能发送自定义广播。如下是部分系统预定义广播及正常触发时机:

action触发时机android.net.conn.CONNECTIVITY_CHANGE网络连接发生变化android.intent.action.SCREEN_ON屏幕点亮android.intent.action.SCREEN_OFF屏幕熄灭android.intent.action.BATTERY_LOW电量低,会弹出电量低提示框android.intent.action.BATTERY_OKAY电量恢复了android.intent.action.BOOT_COMPLETED设备启动完毕android.intent.action.DEVICE_STORAGE_LOW存储空间过低android.intent.action.DEVICE_STORAGE_OK存储空间恢复android.intent.action.PACKAGE_ADDED安装了新的应用android.net.wifi.STATE_CHANGEWiFi连接状态发生变化android.net.wifi.WIFI_STATE_CHANGEDWiFi状态变为启用/关闭/正在启动/正在关闭/未知android.intent.action.BATTERY_CHANGED电池电量发生变化android.intent.action.INPUT_METHOD_CHANGED系统输入法发生变化android.intent.action.ACTION_POWER_CONNECTED外部电源连接android.intent.action.ACTION_POWER_DISCONNECTED外部电源断开连接android.intent.action.DREAMING_STARTED系统开始休眠android.intent.action.DREAMING_STOPPED系统停止休眠android.intent.action.WALLPAPER_CHANGED壁纸发生变化android.intent.action.HEADSET_PLUG插入耳机android.intent.action.MEDIA_UNMOUNTED卸载外部介质android.intent.action.MEDIA_MOUNTED挂载外部介质android.os.action.POWER_SAVE_MODE_CHANGED省电模式开启(以上广播均可使用 adb 触发)

4.4.5 强制停止应用 ​shelladb shell am force-stop 4.4.6 收紧内存 ​shelladb shell am send-trim-memory 参数说明:

pid: 进程 IDlevel:HIDDEN、RUNNING_MODERATE、BACKGROUND、RUNNING_LOW、MODERATE、RUNNING_CRITICAL、COMPLETE4.5 文件管理 ​4.5.1 从模拟器/设备下载指定的文件到计算机 ​从模拟器/设备下载指定的文件到计算机的基本命令格式是:

shelladb pull [local]参数说明:

remote: 模拟器/设备里的文件路径local:计算机上的目录,参数可以省略,默认复制到当前目录例如,将 /sdcard/music.mp4 下载到计算机的当前目录:

shelladb pull /sdcard/music.mp4将 /sdcard/music.mp4 下载到计算机的当前目录(目录需存在):

shelladb pull /sdcard/music.mp4 D:\Download4.5.2 将指定的文件从计算机上传到模拟器/设备 ​将指定的文件从计算机上传到模拟器/设备的基本命令格式是:

shelladb push 参数说明:

local:计算机上的文件路径remote: 模拟器/设备里的目录例如,将 D:\Download\music.mp4 下载到设备的/sdcard/music/目录:

shelladb push D:\Download\music.mp4 /sdcard/music/4.5.4 列出指定目录的内容 ​列出模拟器/设备上指定目录的内容的基本命令格式是:

shelladb shell ls [options] 表示指定目录,可以省略,表示列出根目录下的所有文件和目录。 adb shell ls 后面可以跟一些可选参数进行过滤查看不同的列表,可用参数及含义如下:

参数显示列表无列出目录下的所有文件和目录-a列出目录下的所有文件(包括隐藏的)-i列出目录下的所有文件和索引编号-s列出目录下的所有文件和文件大小-n列出目录下的所有文件及其 UID和 GID-R列出目录下的所有子目录中的文件4.5.5 切换到目标目录 ​shelladb shell cd 第一步:执行adb shell命令; 第二步:执行cd 命令切换到目标目录。

4.5.6 删除文件或目录 ​shelladb shell rm [options] 第一步:执行adb shell命令; 第二步:执行rm [options] 命令删除文件或目录。

rm 后面可以跟一些可选参数进行不同的操作,可用参数及含义如下:

参数含义无删除文件-f强制删除文件,系统不提示-r强制删除指定目录中的所有文件和子目录-d删除指定目录,即使它是一个非空目录-i交互式删除,删除前提示rm -d 等同于 rmdir 命令,有些版本不包含-d 参数。

4.5.7 创建目录 ​shelladb shell mkdir [options] 第一步:执行adb shell命令; 第二步:执行mkdir [options] 命令创建目录。 mkdir 后面可以跟一些可选参数进行不同的操作,可用参数及含义如下:

参数含义无创建指定目录-m创建指定目录并赋予读写权限-p创建指定目录及其父目录4.5.8 创建空文件或改变文件时间戳 ​shelladb shell touch [options] 第一步:执行adb shell命令; 第二步:执行touch [options] 命令创建空文件或改变文件时间戳。

可通过ls -n 命令查看文件的时间。

4.5.9 输出当前目录路径 ​shelladb shell pwd第一步:执行adb shell命令; 第二步:执行pwd命令输出当前目录路径。

4.5.10 复制文件和目录 ​shelladb shell cp [options] 第一步:执行adb shell命令; 第二步:执行cp [options] 命令复制文件和目录。 参数说明:

source:源文件路径dest: 目标文件路径4.5.11 移动或重命名文件 ​shelladb shell mv [options] 第一步:执行adb shell命令; 第二步:执行mv [options] 命令移动或重命名文件。 参数说明:

source:源文件路径dest: 目标文件路径4.6 网络管理 ​4.6.1 查看网络统计信息 ​shelladb shell netstat也可以将网络统计信息输出到指定文件:

shelladb shell netstat>例如,可以通过 adb shell netstat>D:\netstat.log 将日志输出到 D:\netstat.log 中。

4.6.2 测试两个网络间的连接和延迟 ​ping 命令的格式如下:

shelladb shell ping [-aAbBdDfhLnOqrRUvV] [-c count] [-i interval] [-I interface]

[-m mark] [-M pmtudisc_option] [-l preload] [-p pattern] [-Q tos]

[-s packetsize] [-S sndbuf] [-t ttl] [-T timestamp_option]

[-w deadline] [-W timeout] [hop1 ...] destination例如,ping一个域名:

shelladb shell ping www.google.com不结束的话会一直ping下去,可以按 Ctrl + C 停止ping操作。

也可以指定ping的次数:

shelladb shell ping -c 4 www.google.com4.6.3 通过配置文件配置和管理网络连接 ​netcfg 命令的格式如下:

shelladb shell netcfg [ {dhcp|up|down}]输出示例:

shellrmnet_ims10 DOWN 0.0.0.0/0 0x00001002

rmnet_ims00 DOWN 0.0.0.0/0 0x00001002

rmnet_tun04 DOWN 0.0.0.0/0 0x00001002

rmnet_tun03 DOWN 0.0.0.0/0 0x00001002

rmnet_tun02 DOWN 0.0.0.0/0 0x00001002

rmnet_tun01 DOWN 0.0.0.0/0 0x00001002

rmnet_tun00 DOWN 0.0.0.0/0 0x00001002

rmnet_tun14 DOWN 0.0.0.0/0 0x00001002

rmnet_tun13 DOWN 0.0.0.0/0 0x00001002

rmnet_tun12 DOWN 0.0.0.0/0 0x00001002

rmnet_tun11 DOWN 0.0.0.0/0 0x00001002

rmnet_tun10 DOWN 0.0.0.0/0 0x00001002

rmnet1 DOWN 0.0.0.0/0 0x00001002

rmnet0 DOWN 0.0.0.0/0 0x00001002

rmnet4 DOWN 0.0.0.0/0 0x00001002

rmnet3 DOWN 0.0.0.0/0 0x00001002

rmnet2 DOWN 0.0.0.0/0 0x00001002

rmnet6 DOWN 0.0.0.0/0 0x00001002

rmnet5 DOWN 0.0.0.0/0 0x00001002

dummy0 UP 0.0.0.0/0 0x000000c3

rmnet_r_ims10 DOWN 0.0.0.0/0 0x00001002

rmnet_r_ims00 DOWN 0.0.0.0/0 0x00001002

rmnet_emc0 DOWN 0.0.0.0/0 0x00001002

lo UP 127.0.0.1/8 0x00000049

sit0 DOWN 0.0.0.0/0 0x00000080

wlan0 UP 10.0.38.176/23 0x000010434.6.4 显示、操作路由、设备、策略路由和隧道 ​ip 命令的格式如下:

shelladb shell ip [ options ] objectoptions := { -V[ersion] | -s[tatistics] | -d[etails] | -r[esolve] |-f[amily] { inet | inet6 | ipx | dnet | link } |-l[oops] { maximum-addr-flush-attempts } |-o[neline] | -t[imestamp] | -b[atch] [filename] |-rc[vbuf] [size]}object := { link | addr | addrlabel | route | rule | neigh | ntable |tunnel | tuntap | maddr | mroute | mrule | monitor | xfrm |netns | l2tp }options 是一些修改ip行为或者改变其输出的选项。所有的选项都是以-字符开头,分为长、短两种形式,支持的可选参数及含义如下:

选项含义-V,-Version打印ip的版本并退出-s,-stats,-statistics输出更为详尽的信息(如果这个选项出现两次或者多次,输出的信息将更为详尽)-f,-family强调使用的协议种类(包括:inet、inet6或者link)-4是-family inet的简写-6是-family inet6的简写-0是-family link的简写-o,-oneline对每行记录都使用单行输出,回行用字符代替-r,-resolve查询域名解析系统,用获得的主机名代替主机IP地址object 是你要管理或者获取信息的对象。目前ip认识的对象包括:

参数显示列表link网络设备address一个设备的协议(IP或者IPV6)地址neighbourARP或者NDISC缓冲区条目route路由表条目rule路由策略数据库中的规则maddress多播地址mroute多播路由缓冲区条目tuntap管理 TUN/TAP 设备netns管理网络空间例如,查看 WiFi IP 地址:

shelladb shell ip -f inet addr show wlan04.7 模拟按键/输入 ​在 adb shell 里有个很实用的命令叫 input,通过它可以做一些有趣的事情。 可以执行adb shell input命令查看完整 help 信息如下:

shellUsage: input [] [...]

The sources are:

dpad

keyboard

mouse

touchpad

gamepad

touchnavigation

joystick

touchscreen

stylus

trackball

The commands and default sources are:

text (Default: touchscreen)

keyevent [--longpress] ... (Default: keyboard)

tap (Default: touchscreen)

swipe [duration(ms)] (Default: touchscreen)

draganddrop [duration(ms)] (Default: touchscreen)

press (Default: trackball)

roll (Default: trackball)比如使用 adb shell input keyevent 命令,不同的 keycode 能实现不同的功能,完整的 keycode 列表详见 KeyEvent,摘引部分我觉得有意思的如下:

keycode含义3HOME 键4返回键5打开拨号应用6挂断电话24增加音量25降低音量26电源键27拍照(需要在相机应用里)64打开浏览器82菜单键85播放/暂停86停止播放87播放下一首88播放上一首122移动光标到行首或列表顶部123移动光标到行末或列表底部126恢复播放127暂停播放164静音176打开系统设置187切换应用207打开联系人208打开日历209打开音乐210打开计算器220降低屏幕亮度221提高屏幕亮度223系统休眠224点亮屏幕231打开语音助手276如果没有 wakelock 则让系统休眠下面是 input 命令的一些用法举例。

4.7.1 电源键 ​shelladb shell input keyevent 26执行效果相当于按电源键。

4.7.2 菜单键 ​shelladb shell input keyevent 824.7.3 HOME 键 ​shelladb shell input keyevent 34.7.4 返回键 ​shelladb shell input keyevent 44.7.5 音量控制 ​增加音量:shelladb shell input keyevent 24降低音量:shelladb shell input keyevent 25静音:shelladb shell input keyevent 1644.7.6 媒体控制 ​播放/暂停:shelladb shell input keyevent 85停止播放:shelladb shell input keyevent 86播放下一首:shelladb shell input keyevent 87播放上一首:shelladb shell input keyevent 88恢复播放:shelladb shell input keyevent 126暂停播放:shelladb shell input keyevent 1274.7.7 点亮/熄灭屏幕 ​点亮屏幕:shelladb shell input keyevent 224熄灭屏幕:shelladb shell input keyevent 2234.7.8 滑动解锁 ​如果锁屏没有密码,是通过滑动手势解锁,那么可以通过 input swipe 来解锁。 命令(参数以机型 Nexus 5,向上滑动手势解锁举例):

shelladb shell input swipe 300 1000 300 500参数 300 1000 300 500 分别表示起始点x坐标 起始点y坐标 结束点x坐标 结束点y坐标。

4.7.9 输入文本 ​在焦点处于某文本框时,可以通过 input 命令来输入文本。

shelladb shell input text hello4.8 日志打印 ​Android 系统的日志分为两部分,底层的 Linux 内核日志输出到 /proc/kmsg,Android 的日志输出到 /dev/log。

4.8.1 Android 日志 ​查看 Android 设备系统属性的基本命令格式是:

shelladb logcat [option] [filter-specs]如果需要停止 logcat 日志打印,可以按 Ctrl + C 停止日志监控。

4.8.1.1 按级别过滤日志 ​按级别过滤日志的基本命令格式是:

shelladb logcat [filter-specs]Android 的日志分为如下几个优先级(priority):

级别含义*:V过滤只显示 Verbose 及以上级别(优先级最低)*😄过滤只显示 Debug 及以上级别*:I过滤只显示 Info 及以上级别*:W过滤只显示 Warning 及以上级别*:E过滤只显示 Error 及以上级别*:F过滤只显示 Fatal 及以上级别*:S过滤只显示 Silent 及以上级别(优先级最高,什么也不输出)按某级别过滤日志则会将该级别及以上的日志输出。

比如,命令:

shelladb logcat *:W会将 Warning、Error、Fatal 和 Silent 日志输出。

(注: 在 macOS 下需要给 *:W 这样以 * 作为 tag 的参数加双引号,如 adb logcat "*:W",不然会报错 no matches found: *:W。)

4.8.1.2 按 tag 和级别过滤日志 ​按 tag 和级别过滤日志的基本命令格式是:

shelladb logcat [tag:level] [tag:level] ...比如,命令:

shelladb logcat ActivityManager:I MyApp:D *:S表示输出 tag ActivityManager 的 Info 以上级别日志,输出 tag MyApp 的 Debug 以上级别日志,及其它 tag 的 Silent 级别日志(即屏蔽其它 tag 日志)。

4.8.1.3 将日志格式化输出 ​可以用 adb logcat -v 选项指定日志输出格式。

日志支持按以下几种

参数显示格式brief/(): process() tag/: rawtime /(): threadtime : long[ : / ] 日志格式默认为 brief,指定格式可与上面的过滤同时使用。比如:

shelladb logcat -v long ActivityManager:I *:S4.8.1.3 清空已存在的日志 ​shelladb logcat -c4.8.1.4 将日志显示在控制台 ​shelladb logcat -d4.8.1.5 将日志输出到文件 ​shelladb logcat -f 4.8.1.6 加载一个可使用的日志缓冲区供查看 ​shelladb logcat -b Android log 输出量巨大,特别是通信系统的log,因此,Android把log输出到不同的缓冲区中,目前定义了四个log缓冲区:

缓冲区含义Radio输出通信系统的 logSystem输出系统组件的 logEvent输出 event 模块的 logMain所有 java 层的 log 以及不属于上面3层的 log缓冲区主要给系统组件使用,一般的应用不需要关心,应用的log都输出到main缓冲区中。默认log输出(不指定缓冲区的情况下)是输出System和Main缓冲区的log。

4.8.1.7 打印指定日志缓冲区的大小 ​shelladb logcat -g4.8.2 内核日志 ​shelladb shell dmesg输出示例:

shell<6>[14201.684016] PM: noirq resume of devices complete after 0.982 msecs

<6>[14201.685525] PM: early resume of devices complete after 0.838 msecs

<6>[14201.753642] PM: resume of devices complete after 68.106 msecs

<4>[14201.755954] Restarting tasks ... done.

<6>[14201.771229] PM: suspend exit 2016-08-28 13:31:32.679217193 UTC

<6>[14201.872373] PM: suspend entry 2016-08-28 13:31:32.780363596 UTC

<6>[14201.872498] PM: Syncing filesystems ... done.中括号里的 [14201.684016] 代表内核开始启动后的时间,单位为秒。

通过内核日志我们可以做一些事情,比如衡量内核启动时间,在系统启动完毕后的内核日志里找到 Freeing init memory 那一行前面的时间就是。

4.9 查看 Android 设备系统属性 ​查看 Android 设备系统属性的基本命令格式是:

shelladb shell getprop [options]除了可以查看 Android 设备系统属性之外,还可以设置系统属性,设置系统属性的基本命令格式是:

shelladb shell setprop 4.9.1 查看设备型号 ​shelladb shell getprop ro.product.model输出示例:

shellNexus 54.9.2 查看设备电池状况 ​shelladb shell dumpsys battery输出示例:

shellCurrent Battery Service state:

AC powered: false

USB powered: true

Wireless powered: false

status: 2

health: 2

present: true

level: 44

scale: 100

voltage: 3872

temperature: 280

technology: Li-poly其中 scale 代表最大电量,level 代表当前电量。上面的输出表示还剩下 44% 的电量。

4.9.3 查看设备屏幕分辨率 ​shelladb shell wm size输出示例:

shellPhysical size: 1080x1920该设备屏幕分辨率为 1080px * 1920px。

如果使用命令修改过,那输出可能是:

shellPhysical size: 1080x1920

Override size: 480x1024表明设备的屏幕分辨率原本是 1080px * 1920px,当前被修改为 480px * 1024px。

4.9.4 查看设备屏幕密度 ​shelladb shell wm density输出示例:

shellPhysical density: 420该设备屏幕密度为 420dpi。

如果使用命令修改过,那输出可能是:

shellPhysical density: 480

Override density: 160表明设备的屏幕密度原来是 480dpi,当前被修改为 160dpi。

4.9.5 查看设备显示屏参数 ​shelladb shell dumpsys window displays输出示例:

shellWINDOW MANAGER DISPLAY CONTENTS (dumpsys window displays)

Display: mDisplayId=0

init=1080x1920 420dpi cur=1080x1920 app=1080x1794 rng=1080x1017-1810x1731

deferred=false layoutNeeded=false其中 mDisplayId 为 显示屏编号,init 是初始分辨率和屏幕密度,app 的高度比 init 里的要小,表示屏幕底部有虚拟按键,高度为 1920 - 1794 = 126px 合 42dp。

4.9.6 查看设备 android_id ​shelladb shell settings get secure android_id输出示例:

shell51b6be48bac8c5694.9.7 查看设备IMEI ​在 Android 4.4 及以下版本可通过如下命令获取 IMEI:

shelladb shell dumpsys iphonesubinfo输出示例:

shellPhone Subscriber Info:

Phone Type = GSM

Device ID = 860955027785041其中的 Device ID 就是 IMEI。

而在 Android 5.0 及以上版本里这个命令输出为空,得通过其它方式获取了(需要 root 权限):

shelladb shell

su

service call iphonesubinfo 1把里面的有效内容提取出来就是 IMEI 了,比如这里的是 860955027785041。

参考:adb shell dumpsys iphonesubinfo not working since Android 5.0 Lollipop

4.9.8 查看设备 Android 系统版本 ​shelladb shell getprop ro.build.version.release输出示例:

shell5.0.24.9.9 查看设备 IP 地址 ​shelladb shell ifconfig | grep Mask在有的设备上这个命令没有输出,如果设备连着 WiFi,可以使用如下命令来查看局域网 IP:

shelladb shell ifconfig wlan0如果以上命令仍然不能得到期望的信息,那可以试试以下命令(部分系统版本里可用):

shelladb shell netcfg4.9.10 查看设备 Mac 地址 ​shelladb shell cat /sys/class/net/wlan0/address输出示例:

shellf8:a9:d0:17:42:4d这查看的是局域网 Mac 地址,移动网络或其它连接的信息可以通过前面的小节「IP 地址」里提到的 adb shell netcfg 命令来查看。

4.9.11 查看设备 CPU 信息 ​shelladb shell cat /proc/cpuinfo4.9.12 查看设备内存信息 ​shelladb shell cat /proc/meminfo4.9.13 查看设备更多硬件与系统属性 ​设备的更多硬件与系统属性可以通过如下命令查看:

shelladb shell cat /system/build.prop这会输出很多信息,包括前面几个小节提到的「型号」和「Android 系统版本」等。

输出里还包括一些其它有用的信息,它们也可通过 adb shell getprop <属性名> 命令单独查看,列举一部分属性如下:

属性名含义ro.build.version.sdkSDK 版本ro.build.version.releaseAndroid 系统版本ro.build.version.security_patchAndroid 安全补丁程序级别ro.product.model型号ro.product.brand品牌ro.product.name设备名ro.product.board处理器型号ro.product.cpu.abilistCPU 支持的 abi 列表[节注一]persist.sys.isUsbOtgEnabled是否支持 OTGdalvik.vm.heapsize每个应用程序的内存上限ro.sf.lcd_density屏幕密度节注一:

一些小厂定制的 ROM 可能修改过 CPU 支持的 abi 列表的属性名,如果用 ro.product.cpu.abilist 属性名查找不到,可以这样试试:

shelladb shell cat /system/build.prop | grep ro.product.cpu.abi示例输出:

shellro.product.cpu.abi=armeabi-v7a

ro.product.cpu.abi2=armeabi4.10 修改设置 ​注: 修改设置之后,运行恢复命令有可能显示仍然不太正常,可以运行 adb reboot 重启设备,或手动重启。

修改设置的原理主要是通过 settings 命令修改 /data/data/com.android.providers.settings/databases/settings.db 里存放的设置值。

4.10.1 修改分辨率 ​shelladb shell wm size 480x1024表示将分辨率修改为 480px * 1024px。

恢复原分辨率命令:

shelladb shell wm size reset4.10.2 修改屏幕密度 ​shelladb shell wm density 160表示将屏幕密度修改为 160dpi。

恢复原屏幕密度命令:

shelladb shell wm density reset4.10.3 修改显示区域 ​shelladb shell wm overscan 0,0,0,200四个数字分别表示距离左、上、右、下边缘的留白像素,以上命令表示将屏幕底部 200px 留白。

恢复原显示区域命令:

shelladb shell wm overscan reset4.10.4 修改关闭 USB 调试模式 ​shelladb shell settings put global adb_enabled 0用命令恢复不了了,毕竟关闭了 USB 调试 adb 就连接不上 Android 设备了。 去设备上手动恢复吧:「设置」-「开发者选项」-「Android 调试」。

4.10.5 修改允许/禁止访问非 SDK API ​允许访问非 SDK API:

shelladb shell settings put global hidden_api_policy_pre_p_apps 1

adb shell settings put global hidden_api_policy_p_apps 1禁止访问非 SDK API:

shelladb shell settings delete global hidden_api_policy_pre_p_apps

adb shell settings delete global hidden_api_policy_p_apps不需要设备获得 Root 权限。

命令最后的数字的含义:

值含义0禁止检测非 SDK 接口的调用。该情况下,日志记录功能被禁用,并且令 strict mode API,即 detectNonSdkApiUsage() 无效。不推荐。1仅警告——允许访问所有非 SDK 接口,但保留日志中的警告信息,可继续使用 strick mode API。2禁止调用深灰名单和黑名单中的接口。3禁止调用黑名单中的接口,但允许调用深灰名单中的接口。4.10.6 修改状态栏和导航栏的显示隐藏 ​shelladb shell settings put global policy_control 可由如下几种键及其对应的值组成,格式为 =:=

key含义immersive.full同时隐藏immersive.status隐藏状态栏immersive.navigation隐藏导航栏immersive.preconfirms?这些键对应的值可则如下值用逗号组合:

value含义apps所有应用*所有界面package-name指定应用-package-name排除指定应用例如:

shelladb shell settings put global policy_control immersive.full=*表示设置在所有界面下都同时隐藏状态栏和导航栏。

shelladb shell settings put global policy_control immersive.status=com.package1,com.package2:immersive.navigation=apps,-com.package3表示设置在包名为 com.package1 和 com.package2 的应用里隐藏状态栏,在除了包名为 com.package3 的所有应用里隐藏导航栏。

4.11 实用功能 ​4.11.1 屏幕截图 ​截图保存到电脑:

shelladb exec-out screencap -p > sc.png如果 adb 版本较老,无法使用 exec-out 命令,这时候建议更新 adb 版本。无法更新的话可以使用以下麻烦点的办法:

先截图保存到设备里:

shelladb shell screencap -p /sdcard/sc.png然后将 png 文件导出到电脑:

shelladb pull /sdcard/sc.png可以使用 adb shell screencap -h 查看 screencap 命令的帮助信息,下面是两个有意义的参数及含义:

参数含义-p指定保存文件为 png 格式-d display-id指定截图的显示屏编号(有多显示屏的情况下)实测如果指定文件名以 .png 结尾时可以省略 -p 参数;否则需要使用 -p 参数。如果不指定文件名,截图文件的内容将直接输出到 stdout。

另外一种一行命令截图并保存到电脑的方法: Linux 和 Windows

shelladb shell screencap -p | sed "s/\r$//" > sc.pngMac OS X

shelladb shell screencap -p | gsed "s/\r$//" > sc.png这个方法需要用到 gnu sed 命令,在 Linux 下直接就有,在 Windows 下 Git 安装目录的 bin 文件夹下也有。如果确实找不到该命令,可以下载 sed for Windows 并将 sed.exe 所在文件夹添加到 PATH 环境变量里。

而在 Mac 下使用系统自带的 sed 命令会报错:

shellsed: RE error: illegal byte sequence需要安装 gnu-sed,然后使用 gsed 命令:

shellbrew install gnu-sed4.11.2 录制屏幕 ​录制屏幕以 mp4 格式保存到 /sdcard:

shelladb shell screenrecord /sdcard/filename.mp4需要停止时按 Ctrl-C,默认录制时间和最长录制时间都是 180 秒。

如果需要导出到电脑:

shelladb pull /sdcard/filename.mp4可以使用 adb shell screenrecord --help 查看 screenrecord 命令的帮助信息,下面是常见参数及含义:

参数含义--size WIDTHxHEIGHT视频的尺寸,比如 1280x720,默认是屏幕分辨率。--bit-rate RATE视频的比特率,默认是 4Mbps。--time-limit TIME录制时长,单位秒。--verbose输出更多信息。4.11.3 查看连接过的 WiFi 密码 ​注:需要 root 权限。

shelladb shell

su

cat /data/misc/wifi/*.conf4.11.4 设置系统日期和时间 ​注:需要 root 权限。

shelladb shell

su

date -s 20160823.131500表示将系统日期和时间更改为 2016 年 08 月 23 日 13 点 15 分 00 秒。

4.11.5 重启手机 ​shelladb reboot4.11.6 检测设备是否已 root ​shelladb shell

su此时命令行提示符是 $ 则表示没有 root 权限,是 # 则表示已 root。

4.11.7 使用 Monkey 进行压力测试 ​Monkey 可以生成伪随机用户事件来模拟单击、触摸、手势等操作,可以对正在开发中的程序进行随机压力测试。

简单用法:

shelladb shell monkey -p -v 500表示向 指定的应用程序发送 500 个伪随机事件。 Monkey 的详细用法参考 官方文档。

4.11.8 开启/关闭 WiFi ​注:需要 root 权限。

开启 WiFi:shelladb root

adb shell svc wifi enable关闭 WiFi:shelladb root

adb shell svc wifi disable若执行成功,输出为空;若未取得 root 权限执行此命令,将执行失败,输出 Killed。

4.12 刷机相关命令 ​4.12.1 重启到 Recovery 模式 ​shelladb reboot recovery4.12.2 从 Recovery 重启到 Android ​shelladb reboot4.12.2 重启到 Fastboot 模式 ​shelladb reboot bootloader4.12.4 通过 sideload 更新系统 ​如果我们下载了 Android 设备对应的系统更新包到电脑上,那么也可以通过 adb 来完成更新。

以 Recovery 模式下更新为例:

重启到 Recovery 模式。shelladb reboot recovery在设备的 Recovery 界面上操作进入 Apply update-Apply from ADB。 注:不同的 Recovery 菜单可能与此有差异,有的是一级菜单就有 Apply update from ADB。通过 adb 上传和更新系统。shelladb sideload 4.13 安全相关命令 ​4.13.1 启用/禁用 SELinux ​启用 SELinux

shelladb root

adb shell setenforce 1禁用 SELinux

shelladb root

adb shell setenforce 04.13.2 启用/禁用 dm_verity ​启用 dm_verity

shelladb root

adb enable-verity禁用 dm_verity

shelladb root

adb disable-verity4.14 更多 adb shell 命令 ​Android 系统是基于 Linux 内核的,所以 Linux 里的很多命令在 Android 里也有相同或类似的实现,在 adb shell 里可以调用。本文档前面的部分内容已经用到了 adb shell 命令。

4.14.1 查看进程状态 ​shelladb shell ps输出信息各列含义:

列名含义USER所属用户PID进程 IDPPID父进程 IDNAME进程名4.14.2 查看处理器实时状态 ​shelladb shell top [-m max_procs] [-n iterations] [-d delay] [-s sort_column] [-t] [-h]adb shell top 后面可以跟一些可选参数进行过滤查看不同的列表,可用参数及含义如下:

参数含义-m最多显示多少个进程-n刷新多少次后退出-d刷新时间间隔(单位秒,默认值5)-s按某列排序(可用col值:cpu, vss, rss, thr)-t显示线程信息-h显示帮助文档输出信息各列含义:

列名含义PID进程 IDPR优先级CPU%当前瞬间占用 CPU 百分比S进程状态(R=运行,S=睡眠,T=跟踪/停止,Z=僵尸进程)#THR线程数VSSVirtual Set Size 虚拟耗用内存(包含共享库占用的内存)RSSResident Set Size 实际使用物理内存(包含共享库占用的内存)PCY调度策略优先级,SP_BACKGROUND/SPFOREGROUNDUID进程所有者的用户 IDNAME进程名4.14.3 查看进程 UID ​有两种方案:

adb shell dumpsys package | grep userId= 如:shell adb shell dumpsys package org.mazhuang.guanggoo | grep userId=

userId=10394通过 ps 命令找到对应进程的 pid 之后

shelladb shell cat /proc//status | grep Uid如:

shelladb shell

gemini:/ $ ps | grep org.mazhuang.guanggoo

u0_a394 28635 770 1795812 78736 SyS_epoll_ 0000000000 S org.mazhuang.guanggoo

gemini:/ $ cat /proc/28635/status | grep Uid

Uid: 10394 10394 10394 10394

gemini:/ $五、致谢 ​ADB ShellAwesome AdbAndroid Debug Bridge