adb的介绍和使用

2,482 阅读3分钟

有一些常用的adb 使用介绍:

image.png

当然这些只是冰山一角。

一、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命令访问这些设备;

image.png

2、通信流程

image.png  

二、常见问题

1、adb端口被占用**

 

一般发生在Windows系统,如果你电脑安装了一些 XX手机助手 的软件,那在执行adb命令时,很大概率会遇到这个问题:

image

说明你的: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进程,效果图如下:

image

 


方法二修改adb server端口

总有一些进程,可能刚干死又重启了,方法一不一定能生效,打不过,躲得过,除了把毒瘤应用卸载外,还可以考虑下修改 adb server的端口号

建议选一个 五位的端口号(10000-65535) ,没那么容易重复,接着在 系统环境变量 中点击新建环境变量,变量名为
ANDROID_ADB_SERVER_PORT 变量值为端口号,如:

image

此时关掉命令行再次打开进入adb命令,可以看到端口号已经修改为10024了:

image

如果不是因为毒瘤,纯粹想改下端口,可以键入 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

结果

image

2、 启动应用/调起Activity

 

命令

 

adb shell

不指定Activity名称启动,即启动主Activity

monkey -p -c android.intent.category.LAUNCHER 1

指定启动Activity名 (需要root权限)

am start -n /<activity类名>

 

结果

image

3、强行停止应用

 

命令

 

adb shell am force-stop <packagename>

 

结果

image

四、 模拟按键/输入/滑动/点击

 

命令 (完整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
复制代码

Tipsadb默认不支持Unicode编码所以无法input中文内容,即使你默认使用了支持中文的输入法也不行,解决方法如下:

 

  • ① 下载安装 ADBKeyBoard

  • ② 安装完后依次打开:手机设置 → 语言和输入法 → 键盘 → 虚拟键盘 → 管理键盘 → 启用ADB keyboard;

  • ③ 默认输入法 设置为ADB keyboard (比如原生系统点击右下角小键盘设置)

 

image

 

  • ④ 接着使用这个命令即可输入中文 (其他语言也可以): 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
 

结果