Android 调试桥 (adb
) 是一种功能多样的命令行工具,可让您与设备进行通信。adb
命令可用于执行各种设备操作,例如安装和调试应用。adb
提供对 Unix shell(可用来在设备上运行各种命令)的访问权限。它是一种客户端-服务器程序,包括以下三个组件:
- 客户端 :用于发送命令。客户端在开发机器上运行。您可以通过发出
adb
命令从命令行终端调用客户端。 - 守护程序 (adbd) :用于在设备上运行命令。守护程序在每个设备上作为后台进程运行。
- 服务器:用于管理客户端与守护程序之间的通信。服务器在开发机器上作为后台进程运行。
adb
包含在 Android SDK 平台工具软件包中。您可以使用 SDK 管理器下载此软件包,该管理器会将其安装在 android_sdk/platform-tools/
下。如果您需要独立的 Android SDK 平台工具软件包,请点击此处进行下载。
adb是Android SDK里的一个工具, 用这个工具可以直接操作管理android模拟器或者真实的android设备。
adb 的工作原理
当您启动某个 adb
客户端时,该客户端会先检查是否有 adb
服务器进程已在运行。如果没有,它会启动服务器进程。服务器在启动后会与本地 TCP 端口 5037 绑定,并监听 adb
客户端发出的命令。
注意 :所有 adb
客户端均使用端口 5037 与 adb
服务器通信。
然后,服务器会与所有正在运行的设备建立连接。它通过扫描 5555 到 5585 之间(该范围供前 16 个模拟器使用)的奇数号端口查找模拟器。服务器一旦发现 adb
守护程序 (adbd),便会与相应的端口建立连接。
每个模拟器都使用一对按顺序排列的端口:一个用于控制台连接的偶数号端口,另一个用于 adb
连接的奇数号端口。例如:
模拟器 1,控制台:5554
模拟器 1,adb
:5555
模拟器 2,控制台:5556
模拟器 2,adb
:5557
依此类推。
如上所示,在端口 5555 处与 adb
连接的模拟器与控制台监听端口为 5554 的模拟器是同一个。
服务器与所有设备均建立连接后,您便可以使用 adb
命令访问这些设备。由于服务器管理与设备的连接,并处理来自多个 adb
客户端的命令,因此您可以从任意客户端或从某个脚本控制任意设备。
在设备上启用 adb 调试
如要在通过 USB 连接的设备上使用 adb,您必须在设备的系统设置中启用 USB 调试 (位于开发者选项 下)。在 Android 4.2(API 级别 17)及更高版本中,开发者选项 屏幕默认处于隐藏状态。如需将其显示出来,请启用开发者选项。
现在,您已经可以通过 USB 连接设备了。您可以通过从 android_sdk/platform-tools/
目录执行 adb devices
来验证设备是否已连接。如果已连接,您将看到设备名称以"设备"形式列出。
注意:当您连接搭载 Android 4.2.2(API 级别 17)或更高版本的设备时,系统会显示一个对话框,询问您是否接受允许通过此计算机进行调试的 RSA 密钥。这种安全机制可以保护用户设备,因为它可以确保用户只有在能够解锁设备并确认对话框的情况下才能执行 USB 调试和其他 adb 命令。
如需详细了解如何通过 USB 连接到设备,请参阅在硬件设备上运行应用。
选择设备
如果同时连接了多个设备,则需要选择你想操作/控制的设备,用 -s 来选择设备
makefile
# 例如连接了两个设备如下
~ yezi$ adb devices
List of devices attached
10.1.1.217:5555 device
192.168.31.78:5555 device
# 通过-s选择对应的设备执行命令即可,如果只连接了一个设备,可以直接执行adb命令,无需选择对应的设备
adb -s 10.1.1.217:5555 shell
检索日志
perl
adb logcat -v threadtime | grep 检索条件 #不含空格可不加"",含空格需加""
adb logcat -v threadtime -d | grep 检索条件 #检索缓冲区日志
adb logcat -t 100 | grep 检索条件 #检索最近100行日志
adb logcat -t 100 *:E | grep 检索条件 #检索最近100行error日志
模拟按键
php
# 模拟按下返回键
adb -s shell input keyevent 4
# 常用按键键值
/** Key code constant: Home key.
* This key is handled by the framework and is never delivered to applications. */
public static final int KEYCODE_HOME = 3;
/** Key code constant: Back key. */
public static final int KEYCODE_BACK = 4;
/** Key code constant: '0' key. */
public static final int KEYCODE_0 = 7;
/** Key code constant: '1' key. */
public static final int KEYCODE_1 = 8;
/** Key code constant: '2' key. */
public static final int KEYCODE_2 = 9;
/** Key code constant: '3' key. */
public static final int KEYCODE_3 = 10;
/** Key code constant: '4' key. */
public static final int KEYCODE_4 = 11;
/** Key code constant: '5' key. */
public static final int KEYCODE_5 = 12;
/** Key code constant: '6' key. */
public static final int KEYCODE_6 = 13;
/** Key code constant: '7' key. */
public static final int KEYCODE_7 = 14;
/** Key code constant: '8' key. */
public static final int KEYCODE_8 = 15;
/** Key code constant: '9' key. */
public static final int KEYCODE_9 = 16;
/** Key code constant: Directional Pad Up key.
* May also be synthesized from trackball motions. */
public static final int KEYCODE_DPAD_UP = 19;
/** Key code constant: Directional Pad Down key.
* May also be synthesized from trackball motions. */
public static final int KEYCODE_DPAD_DOWN = 20;
/** Key code constant: Directional Pad Left key.
* May also be synthesized from trackball motions. */
public static final int KEYCODE_DPAD_LEFT = 21;
/** Key code constant: Directional Pad Right key.
* May also be synthesized from trackball motions. */
public static final int KEYCODE_DPAD_RIGHT = 22;
/** Key code constant: Directional Pad Center key.
* May also be synthesized from trackball motions. */
public static final int KEYCODE_DPAD_CENTER = 23;
文本输入
python
adb shell input text "string"
adb shell input text '12ab\$ab12' #特殊字符使用单引号加\转义
模拟touch
xml
adb shell input tap <x> <y>
模拟滑动
xml
adb shell input swipe <x1> <y1> <x2> <y2>
检索盒子信息
perl
adb shell getprop | grep mac
启动应用
ini
#通过包名启动
adb shell am start com.android.camera
#通过Action启动
adb shell am start -a android.settings.SETTINGS
#通过包名类名启动
adb shell am start -n com.android.camera/.Camera
#携带参数
adb shell am start -n com.android.camera/.Camera -e key1 value1 --es key2 value2 --ez key value
#通过monkey启动
adb shell monkey -p com.android.settings 1
# 常用参数类型
[-e|--es <EXTRA_KEY> <EXTRA_STRING_VALUE> ...]
[--ez <EXTRA_KEY> <EXTRA_BOOLEAN_VALUE> ...]
[--ei <EXTRA_KEY> <EXTRA_INT_VALUE> ...]
[--el <EXTRA_KEY> <EXTRA_LONG_VALUE> ...]
[--ef <EXTRA_KEY> <EXTRA_FLOAT_VALUE> ...]
[--eu <EXTRA_KEY> <EXTRA_URI_VALUE> ...]
停止应用
arduino
adb shell am force-stop com.android.settings
修改系统时间
bash
adb shell date -s 20231113.173800
查看ContentProvider
css
adb shell content query --uri content://settings/system/
修改ContentProvider
css
adb shell content update --uri content://xxx/xxx/xxx --bind value:s:111
删除ContentProvider
css
adb shell content delete --uri content://settings/system/xxx
发送广播通知
css
# 通过Action发送
adb shell am broadcast -a com.android.test --es test_string "this is test string" --ei test_int 100 --ez test_boolean true
# 通过包名类名发送
adb shell am broadcast -n com.android.settings/com.android.settings.iflytek.IflytekReceiver -a Search -t xiri/search
# broadcast 常用参数
adb shell am broadcast 后面的参数有:
[-a <ACTION>]
[-d <DATA_URI>]
[-t <MIME_TYPE>]
[-c <CATEGORY> ]
[-e|--es <EXTRA_KEY> <EXTRA_STRING_VALUE> ...]
[--ez <EXTRA_KEY> <EXTRA_BOOLEAN_VALUE> ...]
[-e|--ei <EXTRA_KEY> <EXTRA_INT_VALUE> ...]
[-n <COMPONENT>]
[-f <FLAGS>]
[<URI>]
抓网络包
bash
#抓网络包保存至SD卡
adb shell tcpdump -i any -p -s 0 -w /sdcard/11.pcap
#从SD卡pull
adb pull /sdcard/11.pcap ~/log/11.pcap
截图
bash
#截图保存到sdcard
adb shell screencap -p /mnt/sdcard/*.png
#截图直接保存到电脑, 将\n转换\r\n, 因此需要用sed删除多余的\r (适用windows和Linux)
adb shell screencap -p | sed 's/\r$//' > screen.png
#截图直接保存到电脑(适用macos)
adb shell screencap -p | perl -pe 's/\x0D\x0A/\x0A/g' > 11.png
查询安装包信息
go
adb shell dumpsys package com.android.settings
查询栈顶Activity信息
css
adb shell dumpsys activity top
查看已安装apk路径
lua
adb shell pm path com.android.settings
清除已安装apk数据和缓存
arduino
adb shell pm clear com.android.settings
重新挂载system分区,获取读写权限
方式一:
bash
su
mount -o remount,rw rootfs /system/
方式二:
arduino
su
mount -o rw,remount -t auto /system
播放视频
sql
adb shell am start -a android.intent.action.VIEW -t "video/*" -d "playUrl"
启动浏览器
sql
adb shell am start -a android.intent.action.VIEW -d "https://www.baidu.com"
设置代理
添加全局代理
arduino
adb shell settings put global http_proxy 127.0.0.1:8888
查看已设置代理
csharp
adb shell settings get global http_proxy
删除全局代理(推荐方案三)
方案一(需重启)如 delete 命令无效请参考方案二
javascript
adb shell settings delete global http_proxy
adb shell settings delete global global_http_proxy_host
adb shell settings delete global global_http_proxy_port
方案二(需要root权限 , 执行后需重启设备)
sql
sqlite3 /data/data/com.android.providers.settings/databases/settings.db
# sqlite> select * from global;
sqlite> delete from global where name="global_http_proxy_host";
sqlite> delete from global where name="global_http_proxy_port";
sqlite> delete from global where name="http_proxy";
sqlite> .exit
方案三 设置一个无效代理 (效果等同于删除代理) ,实时生效
arduino
adb shell settings put global http_proxy :0
安装证书
使用charles或finder等工具查看https接口里需要安装证书,手机可直接通过系统设置可视化界面安装,没有可视化界面的机顶盒可以尝试使用下方命令安装,部分设备系统可能会阉割相关服务导致无法使用
bash
adb shell am start -n com.android.certinstaller/.CertInstallerMain -a android.intent.action.VIEW -t application/x-x509-ca-cert -d file:///sdcard/charles.cer
启动锁屏密码设置页
通过命令安装证书时可能需要设置pin码,如果无法打开pin码设置尝试通过下述命令打开。
bash
adb shell am start com.android.settings/.ChooseLockGeneric
查看Activity启动时间
测试冷启动时间时可以使用-W查看启动时间
sql
adb shell am start -W -a "Action"
查看系统启动时间
bash
# 查看系统启动时间 /proc/uptime 记录两个数值 例如:327098.68 959753.11 ,第一个数值是 从系统启动到现在的时间(单位:秒)第二个数值是 系统空闲的时间(单位:秒)
adb shell cat /proc/uptime
# 借助awk直接格式化
adb shell cat /proc/uptime| awk -F. '{run_days=$1 / 86400;run_hour=($1 % 86400)/3600;run_minute=($1 % 3600)/60;run_second=$1 % 60;printf("系统已运行:%d天%d时%d分%d 秒",run_days,run_hour,run_minute,run_second);print("");}'
查看设备组件信息
bash
adb shell dumpsys activity activities # 查看Activity组件信息
adb shell dumpsys activity services # 查看Service组件信息
adb shell dumpsys activity providers # 查看ContentProvider组件信息
adb shell dumpsys activity broadcasts # 查看BraodcastReceiver信息
adb shell dumpsys activity intents # 查看Intent信息
adb shell dumpsys activity processes # 查看进程信息
封堵IP
可以通过adb直接拦截某个服务器的请求,可用于测试异常情况,ACCEPT放通,DROP封堵
css
# Ipv4
封堵:iptables -I INPUT -s 192.168.1.138 -j DROP
解除:iptables -I INPUT -s 192.168.1.138 -j ACCEPT
# Ipv6
封堵:ip6tables -I INPUT -s 1050:0000:0000:0000:0005:0600:300c:326b -j DROP
解除:ip6tables -I INPUT -s 1050:0000:0000:0000:0005:0600:300c:326b -j ACCEPT
无线连接ADB
设备未root
arduino
1.连接数据线开启adb调试
2.打开端口5555(支持5555-5585) "adb tcpip 5555"
3.拔掉数据线,使用"adb connect ip:port" 连接
设备已root
借助wireless adb
等第三方软件连接
MIUI 删除系统内置应用
css
adb shell pm uninstall --user 0 {pkg}