有一些常用的adb 使用介绍:
当然这些只是冰山一角。
一、ADB介绍
ADB (Android Debug Bridge) ,译作 安卓调试桥
,一个能让你 与Android设备进行通信
的 命令行工具
。
你可以通过它,在命令行输入命令控制Android设备,或者查看Android设备信息。
ADB是一种C/S架构的应用程序,由三个部分组成:
-
服务端 → PC端的adb server → 运行在PC端的后台进程,用于:
-
检测USB端口感知设备连接与拔除;
-
模拟器实例的启动与停止;
-
将adb client的请求通过usb或tcp的方式发送到对应的adbd进程;
-
客户端 → PC端的adb client → 主要用于发送命令
-
解析像:push、shell、install等命令的参数,做必要预处理,然后转移为指令或数据,发送给adb server;
-
守护进程 → 手机端的adbd → 由init进程启动
-
处理来自 adb server的命令行请求,获取对应Android设备的信息,再将结果返回给adb server;
1、工作原理
-
启动adb客户端 → 检查是否有 adb服务端进程 在运行 → 没有的话启动一个;
-
adb服务端进程启动后会 与本地TCP端口5037绑定,并 监听adb客户端发出的命令;
-
服务端扫描 5555-5585 之间的 奇数端口 查找设备/模拟器,一旦发现 adbd进程 便会与相应端口建立连接;
-
注:每个adbd会占用两个PC端口,奇数 用于 adb连接,偶数 用于 命令行连接,如5554和5555端口是一对;
-
adb服务端与所有设备均建立连接后,你便能使用adb命令访问这些设备;
2、通信流程
二、常见问题
1、adb端口被占用**
一般发生在Windows系统,如果你电脑安装了一些 XX手机助手 的软件,那在执行adb命令时,很大概率会遇到这个问题:
说明你的:5037端口被占用了,上面说过这个端口是留给adb server使用的,解决方法有两种:
方法一:干掉占用进程 (建议)
键入: netstat -ano | findstr "5037"
,获取 占用端口的进程PID,如:
C:\Users\xxx>netstat -aon|findstr 5037
TCP 127.0.0.1:5037 0.0.0.0:0 LISTENING 2908
键入: tasklist /fi "PID eq 2908"
,查看 进程PID对应的进程,如:
C:\Users\xxx>netstat -aon|findstr 5037
映像名称 PID 会话名 会话# 内存使用
========================= ======== ================ =========== ============
xxx.exe 2908 Console 1 11,292 K
键入: taskkill /pid 2908 /f
,杀掉占用端口的进程,如:
C:\Users\xxx>taskkill /pid 2908 /f
成功: 已终止 PID 为 2908 的进程。
最后键入adb相关命令,如 adb devices,即可启动adb server进程,效果图如下:
方法二:修改adb server端口
总有一些进程,可能刚干死又重启了,方法一不一定能生效,打不过,躲得过,除了把毒瘤应用卸载外,还可以考虑下修改 adb server的端口号。
建议选一个 五位的端口号(10000-65535) ,没那么容易重复,接着在 系统环境变量 中点击新建环境变量,变量名为
ANDROID_ADB_SERVER_PORT
变量值为端口号,如:
此时关掉命令行再次打开进入adb命令,可以看到端口号已经修改为10024了:
如果不是因为毒瘤,纯粹想改下端口,可以键入 adb kill-server
把adb server干掉,配置完成后,再键入 adb start-server
启动 adb server。
Tips:Linux、Mac系统直接终端输入 export $ANDROID_ADB_SERVER_PORT = 自定义端口
即可设置。
2、adb devices无法识别设备
问题描述:手机连上电脑,键入adb devices,却没输出任何设备?
回答:确定手机 USB调试 开了吗?开启方法如下 (不同手机系统可能存在差异,可自行搜索关键字):
首次连接,点击手机 设置 → 系统信息 → 点击版本号多次直至出现 您已处于开发者模式 → 返回找到 开发者模式 → 找到 USB调试 开启,然后手机一般会弹个 授权的对话框,授权就好。此时再键入adb devices看看设备是否显示。
当然,如果你在授权的时候,手滑点了拒绝,此时键入adb devices时,设备的状态会显示为 unauthorized
,再次拔插手机,授权窗口都不会再弹了,解决方法如下:
-
adb kill-server
关掉adb服务,拔掉手机; -
找到并删除电脑中的两个配置文件:
/用户名/.android/adbkey
和/用户名/.android/adbkey.pub
; -
adb start-server
启动adb服务,再插手机,授权弹窗应该就出来了;
如果使用了上述方法还是无法识别,那可能是 USB接口的问题 和 驱动问题,可以 换个手机或者换条线 试试,如果正常说明不是USB接口问题。手机官网搜下对应手机型号的驱动,安装后试试。另外,重启试试 有时也包治百病~
三、ADB命令详解
adb完整命令语法如下:
adb [-d|-e|-s <serialNumber>] <command>
如果 只有一个设备/模拟器连接PC,不用加中括号里的参数,当有多个时,才需要通过这些参数 指定目标设备:
-
-d
→ 指定当前唯一通过usb连接的Android设备为命令目标; -
-e
→ 指定当前唯一运行的模拟器为命令目标; -
-s serialNumber
→ 指定对应serialNumber号的设备/模拟器为命令目标,最常用;
上面 adb devices
输出的 8c8f689e 就是我当前连接的手机 序列号,除了真机还有 模拟器 和 无线连接设备,如:
emulator-5554device
10.129.164.6:5555device
另外,adb命令 区分权限,有些命令需要 root权限 才能执行!
如果你手机已经Root了,想给adbd授予Root权限,下述方法二选一:
-
① 键入
adb root
,如果正常输出restarting adbd as root
,键入adb shell
; -
② 键入
adb shell
,输入su
;
当然如果想取消adbd的root权限,也可以键入 adb unroot
。
对了,有些手机即使Root了,也可能无法让adbd以root权限执行,如三星的部分机型,会提示 adbd cannot run as root in production builds,可以先安装 adbd Insecure,然后再次尝试。
接着罗列笔者觉得自动化操作最常用的命令,更多命令可到 ADB官方文档 或 mzlogin/awesome-adb 自行查阅~
1、 查看前台Activity
命令:(可以借此拿到应用包名和当前Activity名)
进入Android终端的命令行模式
adb shell
输出前台Activity
dumpsys activity activities | grep mResumedActivity
结果:
2、 启动应用/调起Activity
命令:
adb shell
不指定Activity名称启动,即启动主Activity
monkey -p -c android.intent.category.LAUNCHER 1
指定启动Activity名 (需要root权限)
am start -n /<activity类名>
结果:
3、强行停止应用
命令:
adb shell am force-stop <packagename>
结果:
四、 模拟按键/输入/滑动/点击
命令 (完整Keycode列表可见官网:KeyEvent):
adb shell
# 模拟按键 (Home-3,返回-4,电源-26,亮屏-224、熄屏-223,切换应用-187,小键盘删除-67),如点击Home键:
input keyevent 3
# 在焦点处于某文本框时,使用input命令输入文本
input text Hello
# 滑动,从起始坐标点滑动到结束坐标点,如上滑(300,1000) → (300,500):
input swipe 300 1000 300 500
# 点击坐标点
input tap 500 500
复制代码
Tips:adb默认不支持Unicode编码,所以无法input中文内容,即使你默认使用了支持中文的输入法也不行,解决方法如下:
-
① 下载安装 ADBKeyBoard;
-
② 安装完后依次打开:手机设置 → 语言和输入法 → 键盘 → 虚拟键盘 → 管理键盘 → 启用ADB keyboard;
-
③ 默认输入法 设置为ADB keyboard (比如原生系统点击右下角小键盘设置)
- ④ 接着使用这个命令即可输入中文 (其他语言也可以):
adb shell am broadcast -a ADB_INPUT_TEXT --es msg '中文输入'
5、 截图
命令:
adb shell
# 截图
screencap -p /sdcard/sc.png
# 退出adb shell
exit
# 导出到电脑
adb pull /sdcard/sc.png
另外,还有一种一行命令截图并保存到电脑的方法:
# Mac
adb shell screencap -p | gsed "s/\r$//" > sc.png
# Linux和Windows
adb shell screencap -p | sed "s/\r$//" > sc.png
# Tips:上面的截图方法,Windows能获取图片,但是打不开,可以用下述方法获取:
adb exec-out screencap -p > sc.png
6、 查看分辨率
命令:
adb shell wm size
结果: