Android adb 说明与详解
Android Debug Bridge(ADB)是一个非常有用的工具,它可以帮助开发人员在Android设备和计算机之间进行通信,以便在设备上进行调试、测试和安装应用程序。
在使用ADB之前,您需要安装Android SDK。安装完SDK后,您可以在SDK目录的platform-tools目录中找到ADB。
现在,使用USB线将Android设备连接到计算机上。打开终端或命令提示符(CMD)并输入以下命令来检查设备是否成功连接:
adb devices
如果设备已成功连接,将会显示设备的标识符。
>> adb devices
List of devices attached
O6Q74AR6QG device
192.168.9.66:5555 device
输出说明:
O6Q74AR6QG
与 192.168.9.66:5555
表示为 device
:设备已连接;offline
:设备未连接成功或无响应;no device
:没有设备、模拟器连接)使用ADB命令可以执行各种设备管理操作。以下是一些常见的命令示例:
adb [-d|-e|-s ]
参数 | 含义 |
---|---|
-d | 指定当前唯一通过 USB 连接的 Android 设备为命令目标 |
-e | 指定当前唯一运行的 wifi连接的Android设备/模拟器 为命令目标 |
-s |
指定相应 serialNumber 号的设备/模拟器为命令目标 |
启动 adb server 命令
adb start-server
停止 adb server 命令
adb kill-server
adb version
adb 的运行原理是 PC 端的 adb server 与手机端的守护进程 adbd 建立连接,然后 PC 端的 adb client 通过 adb server 转发命令,adbd 接收命令后解析运行;所以如果 adbd 以普通权限执行,有些需要 root 权限才能执行的命令无法直接用 adb xxx 执行。这时可以 adb shell 然后 su 后执行命令,也可以让 adbd 以 root 权限执行,这个就能随意执行高权限命令了。
命令
adb root
成功后的输入内容:restarting adbd as root
,之后再执行adb shell
,命令行提示符应该是变成#
。
部分手机或高版本的手机是无法通过 adb root
命令让adbd以root权限执行,会提示 adbd cannot run as root in production builds
。
相对应的,如果要回复adbd为非root权限的话,可以使用 adb unroot
命令。
adb -P start-server
默认端口为5037
adb connect
连接成功提示 connected to 192.168.9.65:5555
,连接失败提示 cannot connect to 192.168.9.69:5555: 由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败。 (10060)
。adb tcpip 5555
让设备在 5555 端口监听TCP/IP连接,断开USB连接后重新通过 adb connect
连接设备su
setprop service.adb.tcp.port 5555
stop adbd
start adbd
命令,之后直接通过ip地址直接连接adb install
#命令格式
adb install [-lrtsdg]
将应用安装到设备上。
是APK文件的路径。
参数说明: -l
将应用安装到包含目录/mnt/asec ; -r
允许覆盖安装; -t
允许安装AndroidManifest.xml里application指定 android:testOnly="true"
的应用; -s
将应用安装到sdcard ; -d
允许降级覆盖安装; -g
授予所有运行时权限; --abi abi-identifier
为特定 ABI 强制安装 apk,abi-identifier 可以是 armeabi-v7a、arm64-v8a、v86、x86_64 等;
adb install
内部原理简介与步骤说明:
adb uninstall [-k]
卸载指定包名的应用,
表示应用的包名, -k
参数可选,表示卸载应用但保留数据和缓存目录
#查询所有应用
adb shell pm list packages
#查询应用列表的基本命令格式
adb shell pm list packages [-f] [-d] [-e] [-s] [-3] [-i] [-u] [--user USER_ID] [FILTER]
列出设备上安装的所有应用程序。
参数说明: -f
显示所有关联的apk文件; -d
只显示disabled的应用; -e
只显示enabled的应用; -s
只显示系统应用; -3
只显示第三方应用; -i
显示引用的install; -u
包含已卸载应用;
包名包含
字符串
命令
adb shell dumpsys activity activities | grep mResumedActivity
输出示例:
$ dumpsys activity activities | grep mResumedActivity
mResumedActivity: ActivityRecord{94e5bd4 u0 net.facelib.eam/.MainActivity t934}
其中 net.facelib.eam/.MainActivity
就是当前处于前台的Activity。
在 Windows 下以上命令可能不可用,可以尝试 adb shell dumpsys activity activities | findstr mResumedActivity
或 adb shell "dumpsys activity activities | grep mResumedActivity"
命令
adb shell dumpsys activity services []
参数不是必须的,指定
表示查看与某个包名相关的 Services,不指定表示查看所有 Services。
不一定要给出完整的包名,比如运行 adb shell dumpsys activity services org.zhan
,那么包名 org.zhan.demo1
、org.zhan.demo2
和 org.zhan
等相关的 Services 都会列出来
命令
adb shell dumpsys package
输出中包含很多信息,包括 Activity Resolver Table、Registered ContentProviders、包名、userId、安装后的文件资源代码等路径、版本信息、权限信息和授予状态、签名版本信息等。
表示应用包名
命令
adb shell pm path
输出应用安装路径
adb backup -apk -shared -all -f
将设备上的应用数据备份为
文件。
adb push
将本地文件复制到设备上。
adb pull
将设备上的文件复制到本地
adb shell screencap
adb pull
进行设备截屏,并将截屏图像从设备复制到本地计算机。
adb shell am start [options]
#启动系统的设置界面
adb shell am start -n com.android.settings/.Settings
[options]
参数的选项
参数 | 含义 |
---|---|
-a |
指定 action,比如 android.intent.action.VIEW |
-c |
指定 category,比如 android.intent.category.APP_CONTACTS |
-n |
指定完整 component 名,用于明确指定启动哪个 Activity,如 com.example.app/.ExampleActivity |
命令
adb shell am force-stop
adb shell am force-stop net.facelib.eam
#调起Service命令
adb shell am startservice [options]
# adb shell am startservice -n net.facelib.eam/net.facelib.eam.service.ServiceBack
#停用Service命令
adb shell am stopservice [options]
# adb shell am stopservice -n net.facelib.eam/net.facelib.eam.service.ServiceBack
命令
adb shell am broadcast [options]
# 向设备上所有的组件广播,发送 BOOT_COMPLETED 设备启动完毕 的广播
adb shell am broadcast -a android.intent.action.BOOT_COMPLETED
# 向设备中指定的组件广播,只向 net.facelib.eam.module/.receiver.BootBroadcastReceiver 广播 BOOT_COMPLETED
adb shell am broadcast -a android.net.wifi.WIFI_STATE_CHANGED -n net.facelib.eam.module/net.facelib.eam.module.receiver.NetWorkStateReceiver
以下是部分系统预定义广播与正常触发时机:
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_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 shell input [
# 命令 input swipe [duration(ms)]
# 模拟长按操作 (在 200 300 位置长按 1000毫秒)
adb shell input swipe 200 300 200 300 1000
x1,y1
和 x2,y2
分别是两个坐标,duration
是从 x1,y1
处滑动到 x2,y2
处规定的时间。为什么滑动可以模拟长按呢:只要我们两个坐标之间的差值足够小,还在当前这个按钮的范围内,android系统就会认为我们进行了长按某个按钮的操作,当然这只能模拟虚拟按钮,因为实体键我们是没法获取到它的坐标的。
# 命令 input keyevent --longpress <键值>
# 模拟长按HOME键
input keyevent --longpress KEYCODE_HOME
那这种长按的方式有什么缺点呢:长按时间太短。比如我们要模拟长按电源键呼出关机菜单或者长按切换应用键呼出分屏(android7.0新功能),这种方式长按时间太短。只适用与拖动选择时一开始的长按情况.
keycode | 含义 |
---|---|
3 | HOME键 |
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 则让系统休眠 |
Android 系统的日志分为两部分,底层的 Linux 内核日志输出到 /proc/kmsg,Android 的日志输出到 /dev/log
命令格式:
[adb] logcat [
例如命令 adb logcat *.W
会将 Warning、Error、Fatal 和 Silent 日志输出。(注: 在 macOS 下需要给 *:W
这样以 *
作为 tag 的参数加双引号,如 adb logcat "*:W"
,不然会报错 no matches found: *:W
)
按级别过滤日志
Android 的日志分为如下几个优先级(priority):
安tag和级别过滤日志
adb logcat facelib:I MyApp:D *:S
# 配置日志输出格式 样式: 07-13 18:00:53.440 D/AudioHardwareTiny( 231): close device
adb logcat -v time facelib:I
adb shell getprop ro.product.model
adb shell dumpsys battery
adb shell wm size
adb shell wm density
adb shell dumpsys window displays
adb shell settings get secure android_id
adb shell dumpsys iphonesubinfo
adb shell getprop ro.build.version.release
adb shell ifconfig | grep Mask
# 获取网络相关的所有数据
adb shell ifconfig
adb shell cat /sys/class/net/wlan0/address
adb shell cat /proc/cpuinfo
adb shell cat /proc/meminfo
其中,MemTotal
就是设备的总内存,MemFree
是当前空闲内存
设备的更多硬件与系统属性可以通过如下命令查看
adb shell cat /system/build.prop
属性名 | 含义 |
---|---|
ro.build.version.sdk | SDK 版本 |
ro.build.version.release | Android 系统版本 |
ro.build.version.security_patch | Android 安全补丁程序级别 |
ro.product.model | 型号 |
ro.product.brand | 品牌 |
ro.product.name | 设备名 |
ro.product.board | 处理器型号 |
ro.product.cpu.abilist | CPU 支持的 abi 列表[节注一] |
persist.sys.isUsbOtgEnabled | 是否支持 OTG |
dalvik.vm.heapsize | 每个应用程序的内存上限 |
ro.sf.lcd_density | 屏幕密度 |
节注一:
一些小厂定制的 ROM 可能修改过 CPU 支持的 abi 列表的属性名,如果用 ro.product.cpu.abilist
属性名查找不到,可以通过 adb shell cat /system/build.prop | grep ro.product.cpu.abi
这样试试:
命令(注: 需要root权限)
adb shell
su
cat /data/misc/wifi/*.conf
# 返回样式
network={
ssid="618a"
psk="88888888"
key_mgmt=WPA-PSK
priority=1331
}
ssid
是我们在WLAN设置里看到的名称, psk
为密码,key_mgmt
为安全加密方式。
命令(注: 需要root权限)
adb shell
su
date -s 20230714.101000
表示将系统日期和时间更改为 2023年7月14日 10点10分00秒
命令
adb reboot
命令
adb shell
su
此时命令行提示符为 $
则表示没有root权限,为 #
则表示已root。
命令
adb shell monkey -p -v 500
表示想
指定的应用程序发送500个伪随机事件
Monkey的详细用法参考官方文档
命令(注: 需要root权限)
#开启WIFI
adb root
adb shell svc wifi enable
#关闭WIFI
adb root
adb shell svc wifi disable
若执行成功,输出为空,若未取得root权限执行此命令,则输出 killed
表示执行失败。
命令
# 重启设备
adb reboot
# 重启设备到 Recovery 模式
adb reboot recovery
# 从 Recovery 重启到 Android
adb reboot
# 重启设备到 Fastboot 模式
adb reboot bootloader
命令
adb shell ps
输出示例
USER PID PPID VSIZE RSS WCHAN PC NAME
root 1 0 8140 1688 SyS_epoll_ 0009052c S /init
root 2 0 0 0 kthreadd 00000000 S kthreadd
root 3 2 0 0 smpboot_th 00000000 S ksoftirqd/0
......
system 23205 230 1687996 72596 SyS_epoll_ b36e97a4 S com.android.gallery3d
system 23228 230 1026800 67864 SyS_epoll_ b36e97a4 S com.android.keychain
system 23676 230 1118908 152028 SyS_epoll_ b36e97a4 S com.android.settings
......
u0_a8 29390 230 1029132 71316 SyS_epoll_ b36e97a4 S android.process.media
u0_a86 29399 230 1804772 212588 SyS_epoll_ b36e97a4 S net.facelib.eam
......
root 30527 29383 4544 2044 0 a7b86938 R ps
各列表的含义:
列名 | 含义 |
---|---|
USER | 所属用户 |
PID | 进程ID |
PPID | 父进程ID |
NAME | 进程名 |
命令 | 功能 |
---|---|
cat | 显示文件内容 |
cd | 切换目录 |
chmod | 改变文件的存取模式/访问权限 |
df | 查看磁盘空间使用情况 |
grep | 过滤输出 |
kill | 杀死指定PID的进程 |
ls | 列举目录内容 |
mount | 挂载目录的查看和管理 |
mv | 移动或重命名文件 |
ps | 查看正在运行的进程 |
rm | 删除文件 |
top | 查看进程的资源占用情况 |