ShowJoy-com/showjoy-blog

「Android」adb常用命令整理

Opened this issue · 0 comments

本文来自尚妆Android团队青峰
发表于尚妆博客

概述

Android 调试桥 (adb) 是一个通用命令行工具,其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利,如安装和调试应用,并提供对 Unix shell(可用来在模拟器或连接的设备上运行各种命令)的访问。该工具作为一个客户端-服务器程序,包括三个组件:

  • 客户端(adb-client),该组件发送命令。客户端在开发计算机上运行。您可以通过发出 adb 命令从命令行终端调用客户端。
  • 后台程序(adbd),该组件在设备上运行命令。后台程序在每个模拟器或设备实例上作为后台进程运行。
  • 服务器(adb-server),该组件管理客户端和后台程序之间的通信。服务器在开发计算机上作为后台进程运行。

具体实现如图所示:

ADB连接逻辑图

ADB连接具体实现

global options

-d:当没有设备通过USB连接或者有两个或两个以上设备通过USB连接时,使用该选项会报错;当有多个设备连接且仅有一个设备通过USB连接时,使用该选项会直接安装到通过USB连接的设备中

-e:当没有设备通过TCP/IP连接或者有两个或两个以上设备通过TCP/IP连接时,使用该选项会报错;当有多个设备连接且仅有一个设备通过TCP/IP连接时,使用该选项会直接安装到通过TCP/IP连接的设备中

-s SERIAL:同时连接多个设备时,可通过该选项根据SERIAL指定调试设备。SERIAL为设备序列号,可通过adb devices命令获取

-H:指定adb服务的host地址,默认为localhost

-P:指定adb服务的端口,默认为5037

general commands

adb devices:简要显示设备列表信息

adb devices -l:详细显示设备列表信息

adb help:最常用,不用记命令,即时查阅

adb version:显示adb版本信息及安装目录

networking

adb无线连接

执行以下两步即可:

  • adb tcpip 端口号
  • adb connect 设备当前所连WIFI的ip地址:端口号

connect

adb connect device_ip_address:连接ip地址为device_ip_address,端口为5555的设备。

adb connect device_ip_address:port:连接ip地址为device_ip_address,端口为port的设备

  • 若出现unable to connect to device_ip_address:5555: Connection refused错误,则需要先执行adb tcpip device_ip_address命令

disconnect

adb disconnect:断开所有通过TCP/IP连接的设备

adb disconnect device_ip_address:断开ip地址为device_ip_address,端口为5555的设备

adb disconnect device_ip_address:port:断开ip地址为device_ip_address,端口为port的设备

forward

adb forward tcp:port_pc tcp:port_device:开启adb端口转发,把发往电脑监听的port_pc端口的数据转发到设备监听的端口port_device中去,尚未实际运用

adb forward --remove tcp:port_pc:停止port_pc端口的转发,尚未实际运用

adb forward --remove-all:停止所有端口的转发,尚未实际运用

file transfer

adb pull filepath_in_device filepath_in_pc:将设备中的文件上传到电脑

  • 例如:adb pull /sdcard/test.txt ./意思是将设备的sdcard目录下的test.txt文件上传到当前命令窗口中的当前目录下

adb push filepath_in_pc filepath_in_device:将电脑中的文件下载到设备中

  • 例如:adb push ./test.txt /sdcard/意思是将当前命令窗口中当前目录下的test.txt文件下载到设备的sdcard目录下

adb sync:把电脑端改动的内容拷贝到设备(默认为/system、/vendor、/oem(从Lollipop开始被添加,管理一些运营商的数据,如启动屏幕与铃声等等)、/data),尚未理解

shell(只操作设备,不操作PC)

adb shell:运行设备的shell(命令行)

adb shell dmesg:输出设备内核日志

adb shell screencap -p filepath_in_device:截取屏幕并保存在filepath_in_device中,然后使用adb pull filepath_in_device命令即可上传截屏到PC中

adb shell screenrecord -p filepath_in_device:录制屏幕并保存在filepath_in_device中,然后使用adb pull filepath_in_device命令即可上传视频到PC中

adb shell cd folder_name:进入名称为folder_name的文件夹

adb shell rename old_file_path new_file_path:将old_file_path文件重命名为new_file_path

adb shell input keyevent 3:理论上是执行HMOE键,但是此类模拟按键输入的操作在小米4手机上都不成功。

getprop

adb shell getprop ro.product.model:获取设备型号

adb shell getprop ro.build.version.release:获取设备的Android系统版本

dumpsys

adb shell dumpsys battery:获取设备的电池状况

adb shell dumpsys window displays:获取设备显示屏参数信息

adb shell dumpsys iphonesubinfo:若设备Android版本小于等于4.4则可获取IMEI信息,反之需要root设备,再通过以下几步才能解决,注:尚未验证

  • adb shell
  • su
  • service call iphonesubinfo 1

adb shell dumpsys activity:获取设备中所有应用的堆栈信息

adb shell dumpsys activity | grep package_name:获取设备中指定package_name的堆栈信息

adb shell dumpsys activity | grep mFocusedActivity:获取设备中处于栈顶的Activity信息

/frameworks/base/cmds/

wm(WindowManager)

Android KitKat 4.4.4_r1 源码地址:WM源码

adb shell wm size:获取设备屏幕分辨率

adb shell wm density:获取设备屏幕密度(单位:dpi)

am(ActivityManager)

Android KitKat 4.4.4_r1 源码地址:AM源码

adb shell am:可查看Activity Manager (am) 工具的使用命令,各命令具体含义可查看adb官方中文文档#am

adb shell am start -n package_name/.activity_name:启动指定package_name的指定activity_name

adb shell am startservice -n package_name/.service_name:启动指定package_name的指定service_name

adb shell am broadcast -a android.intent.action.BOOT_COMPLETED -n package_name/.receiver_name:向package_namereceiver_name发送一个BOOT_COMPLETED的广播

adb shell am force-stop package_name:强制关闭package_name对应的应用

pm(PackageManager)

Android KitKat 4.4.4_r1 源码地址:PM源码

adb shell pm:可查看软件包管理器 (pm) 工具的使用命令,各命令具体含义可查看adb官方中文文档#pm

adb shell pm clear package_name:删除package_name对应应用的所有数据,需要有android.permission.CLEAR_APP_USER_DATA权限

list

adb shell pm list packages filter_name:显示设备中包含filter_name的应用的包名列表

adb shell pm list packages | grep filter_name:显示设备中包含filter_name的应用的包名列表

adb shell pm list packages:显示设备中所有应用的包名列表

adb shell pm list packages option:根据option的值显示设备中应用的信息,其中option有以下几种:

  • -f:显示设备中所有应用的apk文件路径和包名列表
  • -d:显示设备中被disabled的应用的包名列表
  • -e:显示设备中被enabled的应用的包名列表
  • -s:显示设备中所有系统应用的包名列表
  • -3:显示设备中所有第三方应用的包名列表
  • -i:显示设备中所有应用的installer(值默认为null,如果是通过应用商品下载的,值为该应用商品的包名)列表
  • -u:显示设备中所有已卸载应用的包名列表,不一定正确

/system/core/toolbox/

cat

Android KitKat 4.4.4_r1 源码地址:cat源码

adb shell cat /sys/class/net/wlan0/address:获取设备的MAC地址

adb shell cat /proc/cpuinfo:获取设备的CPU信息

adb shell cat /proc/stat:获取设备的CPU信息

adb shell cat /proc/meminfo:获取设备的内存占用信息

adb shell cat /system/build.prop:获取设备硬件与系统属性信息

adb shell cat /system/build.prop | grep product:获取设备基本信息

kill

Android KitKat 4.4.4_r1 源码地址:kill源码

adb shell kill pid_value:杀死ID为pid_value的进程

ls

Android KitKat 4.4.4_r1 源码地址:ls源码

adb shell ls:列出根目录下的文件和文件夹

mv

Android KitKat 4.4.4_r1 源码地址:mv源码

adb shell mv old_file_path new_file_path:将old_file_path文件移动到new_file_path

ps

Android KitKat 4.4.4_r1 源码地址:ps源码

adb shell ps:查看进程列表

adb shell ps -x pid_value:查看ID为pid_value的状态

rm

Android KitKat 4.4.4_r1 源码地址:rm源码

adb shell rm filepath_in_deivce:删除设备中的filepath_in_deivce文件

adb shell rm -r folder_path_in_device:删除设备中的folder_path_in_device文件夹及其下面的所有文件

top

Android KitKat 4.4.4_r1 源码地址:top源码

adb shell top:实时查看设备CPU、内存占用等信息

adb shell top -m number:实时查看内存占用排名前number的应用

adb shell top -n number:刷新number次内存信息,然后返回

app installation

更多内容请查看PackageManager.java

adb install apk_path:安装APK最普通的方式,若设备中已安装APK则安装失败

adb install -r apk_path:覆盖安装APK且保留设备中已安装APK的数据

adb install -s apk_path:安装APK到设备的sdcard中,若sdcard不存在会出现INSTALL_FAILED_INSUFFICIENT_STORAGE错误

adb install -d apk_path:降级(即要安装的APK的versionCode比已安装的APK的versionCode低)覆盖安装APK到设备中

adb install-multiple apk_path...:安装多个APK最普通的方式,若设备中已安装APK则安装失败

  • 理论上是正确的,实际中出现INSTALL_FAILED_INVALID_APK: Split null was defined multiple times错误,网上说是Gradle2.0.0的BUG之类的,但是我的是2.3.2,尚未解决

adb uninstall package_name:卸载指定包名的APK

adb shell pm uninstall -k package_name:卸载指定包名的APK但保留设备中已安装APK的数据

logcat

adb logcat:输出设备日志到当前窗口中

adb logcat > log.txt:输出设备日志到log.txt文件中

adb logcat -s tag_name:仅输出标签名为tag_name的设备日志到当前窗口中

adb logcat -f filepath_in_device:输出设备日志到指定的设备文件中,例如:adb logcat -f /sdcard/log.txt

adb logcat -v format_type:输出指定format_type格式的设备日志到当前窗口中,下面是一些常见的输出格式:

  • raw:输出格式为日志信息
  • tag:输出格式为优先级/标签:日志信息
  • process:输出格式为优先级(进程ID):日志信息
  • thread:输出格式为优先级(进程ID:线程ID):日志信息
  • brief:输出格式为优先级/标签(进程ID):日志信息
  • time:输出格式为日期 时间 优先级/标签(进程ID):日志信息
  • threadtime:输出格式为日期 时间 线程ID 线程ID 优先级 标签:日志信息该命令的格式可能存在错误
  • long:输出格式为[日期 时间 进程ID:线程ID 优先级/标签]日志信息

adb logcat -c:清空所有的设备日志缓存信息

adb logcat -d:将缓存的设备日志输出到当前窗口中, 并且不会阻塞

adb logcat -t number:输出最近的number行日志到当前窗口中, 并且不会阻塞

adb logcat -g:查看设备日志缓冲区信息

adb logcat -b buffer_type:输出指定的日志缓冲区内容到当前窗口中,其中buffer_type有以下几种:

  • system:系统相关的日志信息
  • radio:广播电话相关的日志信息
  • events:事件相关的日志信息
  • main:默认的缓冲区

adb logcat -B:以二进制形式输出日志到当前窗口中

adb logcat *:priority_type:输出所有priority_type级别以上的设备日志到当前窗口中,例如:adb logcat *:E,其中priority_type有以下几种:

  • V:Verbose(明细)
  • D:Debug(调试)
  • I:Info(信息)
  • W:Warn(警告)
  • E:Error(错误)
  • F:Fatal(严重错误)
  • S:Silent(Super all output)(最高的优先级, 可能不会记载日志)

adb logcat tag_name:priority_type *:S:输出指定标签名为tag_name且优先级为priority_type的设备日志到当前窗口中,注意必须包含*:S否则无效

adb logcat | grep filter_name:仅输出包含filter_name的设备日志到当前窗口中,注意:filter_name区分大小写

adb logcat | grep -i filter_name:仅输出包含filter_name的设备日志到当前窗口中,注意:filter_name忽略大小写

scripting

adb get-state:显示设备的状态,注:设备的状态有以下三种:

  • device:设备连接正常
  • offline:设备连接异常,无响应
  • error: no devices/emulators found:没有设备连接

adb get-serialno:显示设备的序列号

adb get-devpath:显示设备的路径信息,实践发现只显示了adb devices -lusb的信息

adb reboot:重启设备

adb reboot reboot_type:根据reboot_type重启设备,其中reboot_type有以下几种:

  • bootloader:重启到bootloader,即刷机模式
  • recovery:重启到recovery,即恢复模式
  • sideload:重启到Sideload加载模式,尚不清楚Sideload是什么模式
  • sideload-auto-reboot:重启到Sideload加载模式,命令完成后会自动地重启

adb root:以root权限重启adbd服务。如果成功的话会出现restarting adbd as root提示,如果失败的话会出现adbd cannot run as root in production builds提示,通过以下几种方式或许能够解决:

  • root手机
  • root手机并安装adbd Insecure
  • 以MIUI系统为例,如果是稳定版需切换为开发版

adb unroot:以非root权限重启adbd服务,可能会出现adbd not running as root错误信息,尚未解决

adb usb:重启adbd服务,监听USB

adb tcpip PORT:重启adbd服务,监听指定的TCP端口

internal debugging

adb start-server:启动adb服务

adb kill-server:杀死正在运行的adb服务

monkey

adb shell monkey -v -p package_name number:为包名为package_name的应用跑number次monkey测试

参考链接