介绍
adb:Android Debug Bridge
安卓调试桥,是一种功能多样的命令行工具,可让开发者与设备进行通信。adb 命令可用于执行各种设备操作,例如安装和调试应用。adb 提供对 Unix shell(可用来在设备上运行各种命令)的访问权限。是用于管理模拟器或真机状态的万能工具,采用了客户端-服务器模型,包括三个部分:
1、客户端部分,运行在开发用的电脑上,可以在命令行中运行adb命令来调用该客户端,像ADB插件和DDMS这样的Android工具也可以调用adb客户端。
2、服务端部分,是运行在开发用电脑上的后台进程,用于管理客户端与运行在模拟器或真机的守护进程通信。
3、守护进程部分,运行于模拟器或手机的后台。
当启动adb客户端时,客户端首先检测adb服务端进程是否运行,如果没有运行,则启动服务端。当服务端启动时,它会绑定到本地的TCP5037端口,并且监听从adb客户端发来的命令——所有的adb客户端都使用5037端口与adb服务端通信。 接下来服务端与所有正在运行的模拟器或手机连接。它通过扫描5555-5585之间的奇数号端口来搜索模拟器或手机,一旦发现adb守护进程,就通过此端口进行连接。需要说明的是,每一个模拟器或手机使用一对有序的端口,偶数号端口用于控制台连接,奇数号端口用于adb连接。
adb 的运行原理是 PC 端的 adb server 与手机端的守护进程 adbd 建立连接,然后 PC 端的 adb client 通过 adb server 转发命令,adbd 接收命令后解析运行。
所以如果 adbd 以普通权限执行,有些需要 root 权限才能执行的命令无法直接用 adb xxx 执行。这时可以 adb shell 然后 su 后执行命令,也可以让 adbd 以 root 权限执行,这个就能随意执行高权限命令了。
adb安装方法
获取adb安装包,安装adb.exe后,将adb安装包文件位置加到环境变量Path里:
控制面板\系统\高级系统设置\环境变量\Path
再重启生效
基本语法
adb [-d | -e | -s <serial-number>] <command>
如果只有一个设备/模拟器连接,可以省略[-d | -e | -s <serial-number>]部分
如果有多个设备/模拟器连接,则需要为命令指定目标设备,参数含义为:
-d 指定当前唯一通过USB连接的Android设备为命令目标
-e 指定当前唯一运行的模拟器为命令目标
-s <serial-number> 指定相应设备序列号的设备/模拟器为命令目标
较常用的是-s <serial-number>参数,serial-number指设备的序列号,可通过adb devices命令获取。
常用命令
adb devices
查询adb服务端连接的模拟器或手机的状态,显示格式为序列号serialNumber+状态state(包括offline未连接或未响应和device已连接到服务端)
adb version
显示当前adb版本信息和安装位置
adb help
输出adb支持的命令
adb reboot
重启手机
adb shell reboot -p
关机
adb reboot edl
使手机进入edl模式,用于刷机
adb reboot recovery
重启进入recovery模式
adb root
获得root权限
adb remount
将 '/system' 部分置于可写入的模式,默认情况下 '/system' 部分是只读模式的。这个命令只适用于已被 root 的设备。在将文件 push 到 '/system' 文件夹之前,必须先输入命令 'adb remount'
adb -s <serialNumber> <command>
操作指定的模拟器或手机。如果有多个模拟器或手机正在运行,当使用adb命令的时候就需要指定目标设备,这可以通过使用-s选项参数实现
adb install <path_to_apk>
从开发用电脑中复制指定路径上的应用程序并且安装到模拟器或手机上 -t 允许测试包 allow test packages -r 覆盖安装(替换已存在的应用程序)replace existing application -d 允许版本降级 allow version code downgrade (debuggable packages only) -g 为应用程序授予所有运行时的权限 grant all runtime permissions -l 锁定该应用程序 -s 把应用程序安装到sd卡上
adb pull <remote> <local>
从模拟器或手机中复制一个文件或文件夹。<local>和<remote>引用的是文件或文件夹的路径,在开发用电脑上的是local,在模拟器或手机上的是remote
adb push <local> <remote>
复制一个文件或文件夹到模拟器或手机中
adb logcat [<option>] [<filter-specs>]
在屏幕上输出日志信息。
adb logcat -c 清空(刷新)所有的日志并且退出
adb logcat -v time 带时间戳输出log
adb logcat -f <filesname> 将logcat保存到某文件
adb logcat --pid=<pidnumber> 抓取特定进程的log
adb shell
在目标模拟器或手机上启动远程shell。
退出远程shell时使用CTRL+D 或 exit 终止会话。
adb提供了shell来在模拟器或手机上运行各种各样的命令,这些命令的二进制形式存在于这个路径中:/system/bin/...
cat 查看文件,显示文件内容
|grep 过滤输出
adb shell dmesg 查看内核日志
实时采集log方法
cmd中,输入命令(adb logcat -c && adb logcat)+(>>)+(保存log的记事本文档的路径[把该文档直接拖到cmd中的光标处即可])开始采集。采集结束后,使用Ctrl+c即可停止采集。
注意事项
电脑利用type-c数据线连接手机时,会出现USB用途的三个选项:仅充电,传输文件/Android Auto,传输照片。选择传输文件/Android Auto,才能用adb找到手机序列号,利用adb对手机进行操作。仅充电和传输照片这两种模式利用adb找不到手机序列号。 针对不会弹出这三个选项情况或者选择了传输文件/Android Auto依旧无法查找手机序列号: (1)手机中,设置-》关于手机-》版本信息-》点击几次版本号进入开发者模式 (2)在设置里找到开发者选项 (3)在开发者选项中,USB调试打开,如果此时弹出之前的三个选项界面,选择传输文件即可,此时使用adb devices就能找到手机序列号
adb获取Android系统属性
adb shell + getprop [key] 取得对应的key的属性值
getprop 列出所有配置属性值
setprop [key] [value] 设置指定key的属性值
watchprops 监听系统属性的变化,如果期间系统的属性发生变化则把变化的值显示出来
其实这三个命令都是toolbox的子命令,如果有兴趣的可以看在android源码中看到其对应的源码:system/core/toolbox/
adb shell getprop ro.hardware 查看机器板子代号/芯片平台代号
adb shell getprop ro.product.board 查看处理器型号
adb shell getprop ro.separate.soft 查看项目数字代号
adb shell getprop ro.product.name 获取手机机型名称
adb shell getprop ro.product.model 获取手机model名称
adb shell getprop ro.build.type 输出编译版本(user或userdebug)
adb shell getprop ro.boot.vbmeta.device_state 输出手机lock状态
adb shell getprop ro.boot.flash.locked 输出手机lock状态,0是unlock,1 是lock
adb shell getprop ro.build.version.ota 查看OTA版本
adb shell getprop ro.build.version.release 查看系统版本
adb shell getprop ro.build.version.sdk 查看sdk版本
adb shell getprop ro.serialno 查看机器的序列号
adb shell getprop ro.product.cpu.abi 查看CPU架构
adb shell getprop ro.carrier 查看机器的CID号
adb shell getprop ro.bootloader 查看SPL(Hboot)版本号
手机操作相关命令
adb shell cat proc/oppoVersion/serialID 获取手机ChipID(仅限user版本)也可直接用adb devices(或者adb shell "getprop|grep ro.serialno")得到的序列号加0x前缀!
adb shell dumpsys activity activities | findstr mResumedActivity 或者 adb shell "dumpsys activity activities | grep mResumedActivity" 查看前台Activity
adb shell dumpsys activity services [<packagename>] 查看正在运行的 Services。 <packagename> 参数不是必须的,指定 <packagename> 表示查看与某个包名相关的 Services,不指定表示查看所有 Services。
adb shell cat /proc/meminfo 查看手机内存信息
adb shell dumpsys cpuinfo 查看CPU使用情况、应用占了多少CPU
adb shell getprop ro.product.cpu.abi 查看android cpu是32位还是64位
adb shell dumpsys battery 查看电量信息,结果中scale代表最大电量,level代表当前电量
adb shell wm size 获取屏幕分辨率
adb shell wm density 查看屏幕密度
adb shell settings get secure android_id 获取Android ID
adb shell getprop ro.build.version.release 查看Android版本
adb shell /system/bin/screencap -p /sdcard/screenshot.png&adb pull /sdcard/screenshot.png Documents\screenshot.png&Documents\screenshot.png 手机截图
adb shell screenrecord /sdcard/test.mp4 手机录屏 adb spull /sdcard/test.mp4 D:\linux\sdk\test\test.mp4 导出到电脑中(记得先在电脑建立一个文件)
adb shell input text hello 输入文本hello
adb shell input tap 250 250 模拟点击
模拟滑动屏幕 adb shell input swipe 800 300 200 300 向左滑动 四个数字分别表示起始点x坐标 y坐标 结束点x坐标 y坐标 adb shell input swipe 200 300 800 300 向右滑动 adb shell input swipe 300 800 300 200 向上滑动 adb shell input swipe 300 200 300 800 向下滑动
adb shell input keyevent 3 模拟点击home键 26电源键 82菜单键 4返回键 24音量加 25音量减 164静音 85播放/暂停 86停止播放 87下一首 88上一首 126恢复播放 127暂停播放 223熄灭屏幕 224点亮屏幕
adb shell svc wifi enable 开wifi adb shell svc wifi disable 关wifi
adb shell svc data enable 开移动数据 adb shell svc data disable 关移动数据
adb shell input text hello 在光标处于某文本框时,可以通过 input 命令来输入文本
adb shell getevent 显示当前的输入设备。可以查看当前所有输入设备的位置和名字
adb shell getevent /dev/input/eventi 打印出驱动上报的input事件(设备i)。命令中最后一个i是一个整数。打出此命令后,操作对应的输入设备,就会在屏幕上列出input事件
adb shell dumpsys input 打印出input的详细信息。可以看到当前的输入事件优先分配给哪个窗口,以及历史的输入事件
蓝牙相关命令
adb shell "service call bluetooth_manager 8\r" 关闭蓝牙服务
adb shell "service call bluetooth_manager 6\r" 开启蓝牙服务
adb shell "ps|grep bluetooth" 查看蓝牙主要进程
adb shell "ps|grep autopair" 查看蓝牙遥控器配对进程
adb shell "getprop|grep -i bt" 查看蓝牙遥控信息
adb shell lsusb 查看蓝牙节点
adb shell dumpsys bluetooth_manager 查看蓝牙状态信息(重要)
adb shell cat /data/vendor/bluetooth/bt_fw_version.txt 获取蓝牙FW版本号
#系统时间相关 adb shell date --help 设置时间 adb shell date "2023-01-11 18:00:00" adb shell "date 01111800.00" 读取时间 adb shell date adb shell date +"%H:%M:%S.%N" adb shell date +"%Y-%m-%d+%H:%M:%S.%N" adb shell date -u +"%Y-%m-%d+%H:%M:%S.%N" //使用标准时区UTC 设置时区 adb shell "setprop persist.sys.timezone Asia/Shanghai" 读取时区 adb shell "getprop persist.sys.timezone"
发送广播
命令格式:adb shell am broadcast [options] <INTENT>
可以向所有组件广播,也可以只向指定组件广播。
例如,向所有组件广播 BOOT_COMPLETED:adb shell am broadcast -a
android.intent.action.BOOT_COMPLETED
又例如,只向 org.mazhuang.boottimemeasure/.BootCompletedReceiver 广播 BOOT_COMPLETED:
adb shell am broadcast -a android.intent.action.BOOT_COMPLETED -n
org.mazhuang.boottimemeasure/.BootCompletedReceiver
这类用法在测试的时候很实用,比如某个广播的场景很难制造,可以考虑通过这种方式来发送广播。
既能发送系统预定义的广播,也能发送自定义广播。
如下是部分系统预定义广播及正常触发时机: 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_CHANGE WiFi 连接状态发生变化 android.net.wifi.WIFI_STATE_CHANGED WiFi 状态变为启用/关闭/正在启动/正在关闭/未知 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 触发)
adb shell "dumpsys |grep BroadcastRecord" 查看广播记录。前面是广播,后面是广播发送的对象用户