一、adb devices连不上手机的几种情况
启动adb
1.打开cmd首次使用adb devices,出现下面这两句,就是正在启动adb服务
C:\Users\admin>adb devices
List of devices attached
* daemon not running. starting it
* daemon started successfully *
2.然后第二次继续输入:adb devices,查看设备名称
没出现设备名称
1.如果List of devices attached下方没出现任何信息,就是手机没连上电脑,或者电脑上没安装手机的驱动
C:\Users\admin>adb devices
List of devices attached
2.插拔usb数据线,电脑屏幕出现无法识别的usb设备,那就是手机驱动没安装好
安装手机驱动
1.电脑下载一个91助手类的管理工具,它会自动识别手机设备型号,安装驱动
2.手机开启开发者选项,在设置里面要是没看到‘开发者选项’,打开关于手机-对着版本号连着点10次就出来了
3.usb调试模式勾选
没授权(unauthorized)
出现unauthorized是因为手机没授权给电脑连接,重新插拔数据线,勾选USB调试
C:\Users\admin>adb devices
List of devices attached
A5RNW18316011440 unauthorized
1.手机重新连上电脑,插拔下数据线,勾选USB调试
2.USB连接方式选择MTP
adb端口冲突
1.如果出现adb server version (32) doesn't match this client (36),这个就是adb端口冲突,被其它应用占用了,比如(91助手,手机管家之类的)
C:\Users\admin>adb devices
List of devices attached
adb server version (32) doesn't mat
error: could not install *smartsock
通常每个套接字地址(协议/网络地址/端
could not read ok from ADB Server
* failed to start daemon *
error: cannot connect to daemon
2.解决办法:卸载91助手,手机管家之类的
offline
1.输入adb devices ,一直显示设备处于offline状态,先尝试以下基本操作:
C:\Users\admin>adb devices
List of devices attached
A5RNW18316011440 offline
- 开启usb调试模式
- 关闭第三方手机助手软件
- 重启adb服务
adb kill-server
adb start-server
2.查看adb版本号,是不是低了
adb -version
3.查看adb环境变量,是不是配置了多个adb
4.在手机设置中点击撤销USB调试授权,然后重新连接电脑,重新授权该电脑。
5.如果还不行的话,那就重启手机、重启电脑
devices
当看到如下设备名称和device,这个才是真正连成功了
C:\Users\admin>adb devices
List of devices attached
A5RNW18316011440 device
二、adb shell模拟点击事件(input tap)
appium有时候定位一个元素很难定位到,或者说明明定位到这个元素了,却无法点击,这个时候该怎么办呢?
求助大神是没用的,点击不了就是点击不了,appium不是万能的,这个时候应该转换思路,换其它的方法去点击,比如我们可以用adb去执行点击事件
input事件
1.先查看input事件语法有哪些,首先确保手机连上电脑(我这里是电脑上打开的手机模拟器)
> adb device
> adb shell
> input
C:\Users\Gloria>adb devices
List of devices attached
127.0.0.1:52007 device
C:\Users\Gloria>adb shell
root@android:/ # input
Usage: input [<source>] <command> [<arg>...]
The sources are:
trackball
joystick
touchnavigation
mouse
keyboard
gamepad
touchpad
dpad
stylus
touchscreen
The commands and default sources are:
text <string> (Default: touchscreen)
keyevent [--longpress] <key code number or name> ... (Default: keyboard)
tap <x> <y> (Default: touchscreen)
swipe <x1> <y1> <x2> <y2> [duration(ms)] (Default: touchscreen)
press (Default: trackball)
roll <dx> <dy> (Default: trackball)
root@android:/ #
2.input可以实现的功能
-
输入文本信息:input text yoyo
-
物理按键操作: input keyevent KEYCODE_VOLUME_DOWN
-
点击(DOWN_UP)操作:input tap 500 500
-
模拟滑动操作:input swipe 200 500 400 500
-
模拟轨迹球操作 input roll 100 200
input tap
1.input tap实现的是DOWN_UP事件,也就是点击操作,后面两个参数是点击的坐标x,y
2.举个例子:点击淘宝app的icon图标,先查看坐标[149,388][290,618],大概可以算出需要点击的点为(200, 500)
打开cmd,输入adb执行,这个时候可以看到淘宝app已经启动了
> adb shell input tap 200 500
3.再继续点击淘宝上的‘我的淘宝’按钮 (600, 1250)
> adb shell input tap 600 1250
python执行adb命令
1.回到手机的home首页,执行以下python脚本,也能达到同样效果
三、adb shell按键操作(input keyevent)
keyevent
1.keyevent事件有一张对应的表,可以直接发送对应的数字,也可以方式字符串,如下两个方法都能实现back键。打开cmd输入指令
# 方法一:
> adb shell input keyevent KEYCODE_BACK
# 方法二:
> adb shell input keyevent 4
2.常用的keyevent事件
-
解锁(KEYCODE_NOTIFICATION): adb shell input keyevent 83
-
向上(KEYCODE_DPAD_UP):adb shell input keyevent 19
-
向下(KEYCODE_DPAD_DOWN):adb shell input keyevent 20
-
向左(KEYCODE_DPAD_LEFT):adb shell input keyevent 21
-
向右(KEYCODE_DPAD_RIGHT):adb shell input keyevent 22
keyevent事件对应数字
0 –> “KEYCODE_UNKNOWN”
1 –> “KEYCODE_MENU”
2 –> “KEYCODE_SOFT_RIGHT”
3 –> “KEYCODE_HOME”
4 –> “KEYCODE_BACK”
5 –> “KEYCODE_CALL”
6 –> “KEYCODE_ENDCALL”
7 –> “KEYCODE_0”
8 –> “KEYCODE_1”
9 –> “KEYCODE_2”
10 –> “KEYCODE_3”
11 –> “KEYCODE_4”
12 –> “KEYCODE_5”
13 –> “KEYCODE_6”
14 –> “KEYCODE_7”
15 –> “KEYCODE_8”
16 –> “KEYCODE_9”
17 –> “KEYCODE_STAR”
18 –> “KEYCODE_POUND”
19 –> “KEYCODE_DPAD_UP”
20 –> “KEYCODE_DPAD_DOWN”
21 –> “KEYCODE_DPAD_LEFT”
22 –> “KEYCODE_DPAD_RIGHT”
23 –> “KEYCODE_DPAD_CENTER”
24 –> “KEYCODE_VOLUME_UP”
25 –> “KEYCODE_VOLUME_DOWN”
26 –> “KEYCODE_POWER”
27 –> “KEYCODE_CAMERA”
28 –> “KEYCODE_CLEAR”
29 –> “KEYCODE_A”
30 –> “KEYCODE_B”
31 –> “KEYCODE_C”
32 –> “KEYCODE_D”
33 –> “KEYCODE_E”
34 –> “KEYCODE_F”
35 –> “KEYCODE_G”
36 –> “KEYCODE_H”
37 –> “KEYCODE_I”
38 –> “KEYCODE_J”
39 –> “KEYCODE_K”
40 –> “KEYCODE_L”
41 –> “KEYCODE_M”
42 –> “KEYCODE_N”
43 –> “KEYCODE_O”
44 –> “KEYCODE_P”
45 –> “KEYCODE_Q”
46 –> “KEYCODE_R”
47 –> “KEYCODE_S”
48 –> “KEYCODE_T”
49 –> “KEYCODE_U”
50 –> “KEYCODE_V”
51 –> “KEYCODE_W”
52 –> “KEYCODE_X”
53 –> “KEYCODE_Y”
54 –> “KEYCODE_Z”
55 –> “KEYCODE_COMMA”
56 –> “KEYCODE_PERIOD”
57 –> “KEYCODE_ALT_LEFT”
58 –> “KEYCODE_ALT_RIGHT”
59 –> “KEYCODE_SHIFT_LEFT”
60 –> “KEYCODE_SHIFT_RIGHT”
61 –> “KEYCODE_TAB”
62 –> “KEYCODE_SPACE”
63 –> “KEYCODE_SYM”
64 –> “KEYCODE_EXPLORER”
65 –> “KEYCODE_ENVELOPE”
66 –> “KEYCODE_ENTER”
67 –> “KEYCODE_DEL”
68 –> “KEYCODE_GRAVE”
69 –> “KEYCODE_MINUS”
70 –> “KEYCODE_EQUALS”
71 –> “KEYCODE_LEFT_BRACKET”
72 –> “KEYCODE_RIGHT_BRACKET”
73 –> “KEYCODE_BACKSLASH”
74 –> “KEYCODE_SEMICOLON”
75 –> “KEYCODE_APOSTROPHE”
76 –> “KEYCODE_SLASH”
77 –> “KEYCODE_AT”
78 –> “KEYCODE_NUM”
79 –> “KEYCODE_HEADSETHOOK”
80 –> “KEYCODE_FOCUS”
81 –> “KEYCODE_PLUS”
82 –> “KEYCODE_MENU”
83 –> “KEYCODE_NOTIFICATION”
84 –> “KEYCODE_SEARCH”
85 –> “TAG_LAST_KEYCODE”
封装keyevent事件
text输入文本
1.adb也可以输入文本
adb shell input text yoyoketang
四、adb shell输入中文(ADBKeyBoard)
keyevent
1.keyevent事件有一张对应的表,可以直接发送对应的数字,也可以方式字符串,如下两个方法都能实现back键。打开cmd输入指令
# 方法一:
> adb shell input keyevent KEYCODE_BACK
# 方法二:
> adb shell input keyevent 4
2.常用的keyevent事件
-
解锁(KEYCODE_NOTIFICATION): adb shell input keyevent 83
-
向上(KEYCODE_DPAD_UP):adb shell input keyevent 19
-
向下(KEYCODE_DPAD_DOWN):adb shell input keyevent 20
-
向左(KEYCODE_DPAD_LEFT):adb shell input keyevent 21
-
向右(KEYCODE_DPAD_RIGHT):adb shell input keyevent 22
keyevent事件对应数字
0 –> “KEYCODE_UNKNOWN”
1 –> “KEYCODE_MENU”
2 –> “KEYCODE_SOFT_RIGHT”
3 –> “KEYCODE_HOME”
4 –> “KEYCODE_BACK”
5 –> “KEYCODE_CALL”
6 –> “KEYCODE_ENDCALL”
7 –> “KEYCODE_0”
8 –> “KEYCODE_1”
9 –> “KEYCODE_2”
10 –> “KEYCODE_3”
11 –> “KEYCODE_4”
12 –> “KEYCODE_5”
13 –> “KEYCODE_6”
14 –> “KEYCODE_7”
15 –> “KEYCODE_8”
16 –> “KEYCODE_9”
17 –> “KEYCODE_STAR”
18 –> “KEYCODE_POUND”
19 –> “KEYCODE_DPAD_UP”
20 –> “KEYCODE_DPAD_DOWN”
21 –> “KEYCODE_DPAD_LEFT”
22 –> “KEYCODE_DPAD_RIGHT”
23 –> “KEYCODE_DPAD_CENTER”
24 –> “KEYCODE_VOLUME_UP”
25 –> “KEYCODE_VOLUME_DOWN”
26 –> “KEYCODE_POWER”
27 –> “KEYCODE_CAMERA”
28 –> “KEYCODE_CLEAR”
29 –> “KEYCODE_A”
30 –> “KEYCODE_B”
31 –> “KEYCODE_C”
32 –> “KEYCODE_D”
33 –> “KEYCODE_E”
34 –> “KEYCODE_F”
35 –> “KEYCODE_G”
36 –> “KEYCODE_H”
37 –> “KEYCODE_I”
38 –> “KEYCODE_J”
39 –> “KEYCODE_K”
40 –> “KEYCODE_L”
41 –> “KEYCODE_M”
42 –> “KEYCODE_N”
43 –> “KEYCODE_O”
44 –> “KEYCODE_P”
45 –> “KEYCODE_Q”
46 –> “KEYCODE_R”
47 –> “KEYCODE_S”
48 –> “KEYCODE_T”
49 –> “KEYCODE_U”
50 –> “KEYCODE_V”
51 –> “KEYCODE_W”
52 –> “KEYCODE_X”
53 –> “KEYCODE_Y”
54 –> “KEYCODE_Z”
55 –> “KEYCODE_COMMA”
56 –> “KEYCODE_PERIOD”
57 –> “KEYCODE_ALT_LEFT”
58 –> “KEYCODE_ALT_RIGHT”
59 –> “KEYCODE_SHIFT_LEFT”
60 –> “KEYCODE_SHIFT_RIGHT”
61 –> “KEYCODE_TAB”
62 –> “KEYCODE_SPACE”
63 –> “KEYCODE_SYM”
64 –> “KEYCODE_EXPLORER”
65 –> “KEYCODE_ENVELOPE”
66 –> “KEYCODE_ENTER”
67 –> “KEYCODE_DEL”
68 –> “KEYCODE_GRAVE”
69 –> “KEYCODE_MINUS”
70 –> “KEYCODE_EQUALS”
71 –> “KEYCODE_LEFT_BRACKET”
72 –> “KEYCODE_RIGHT_BRACKET”
73 –> “KEYCODE_BACKSLASH”
74 –> “KEYCODE_SEMICOLON”
75 –> “KEYCODE_APOSTROPHE”
76 –> “KEYCODE_SLASH”
77 –> “KEYCODE_AT”
78 –> “KEYCODE_NUM”
79 –> “KEYCODE_HEADSETHOOK”
80 –> “KEYCODE_FOCUS”
81 –> “KEYCODE_PLUS”
82 –> “KEYCODE_MENU”
83 –> “KEYCODE_NOTIFICATION”
84 –> “KEYCODE_SEARCH”
85 –> “TAG_LAST_KEYCODE”
封装keyevent事件![](https://img-blog.csdnimg.cn/d867a1b743854fa9b70da2c4b6457be0.png)
text输入文本
1.adb也可以输入文本
adb shell input text yoyoketang
五、adb offline(5037端口被占)
前言
adb连手机的时候经常会出现offline的情况,一般杀掉adb,然后重启adb可以解决。
如果发现不管怎么重启adb都连不上,一直出现offlie的情况,这个时候很大可能就是adb的5037端口被其它应用占了
offline
1.如果之前一直都能正常连上adb,突然连不上了,可以用adb devices查看手机连接情况
C:\Users\admin>adb devices
List of devices attached
* daemon not running; starting now at tcp:5037
* daemon started successfully
emulator-5554 offline
C:\Users\admin>adb devices
List of devices attached
emulator-5554 offline
2.发现无法连上,出现offline。可以尝试adb kill-server,然后再用adb device查看
C:\Users\admin>adb kill-server
C:\Users\admin>adb devices
List of devices attached
* daemon not running; starting now at tcp:5037
* daemon started successfully
emulator-5554 offline
3.上面各种办法尝试了,都无法解决,接下来就要查看5037端口了
查看端口
1.windows上可以用findstr过滤进程(跟linux上grep指令一样),查询结果看最后一项PID,如果是0那就不用管,那最后就有两个PID占用了5037端口,
分别是6532和7200
netstat -aon|findstr 5037
C:\Users\admin>netstat -aon|findstr 5037
TCP 127.0.0.1:5037 0.0.0.0:0 LISTENING 6532
TCP 127.0.0.1:5037 127.0.0.1:56975 TIME_WAIT 0
TCP 127.0.0.1:5037 127.0.0.1:56976 TIME_WAIT 0
TCP 127.0.0.1:5037 127.0.0.1:56981 ESTABLISHED 6532
TCP 127.0.0.1:5037 127.0.0.1:56988 TIME_WAIT 0
TCP 127.0.0.1:5037 127.0.0.1:56990 TIME_WAIT 0
TCP 127.0.0.1:5037 127.0.0.1:56991 TIME_WAIT 0
TCP 127.0.0.1:56981 127.0.0.1:5037 ESTABLISHED 7200
2.接下来就行查看PID,看是哪个应用占了
tasklist /fi "PID eq 端口号"
C:\Users\admin>tasklist /fi "PID eq 6532"
映像名称 PID 会话名 会话# 内存使用
========================= ======== ================ =========== ============
adb.exe 6532 Console 1 18,432 K
C:\Users\admin>tasklist /fi "PID eq 7200"
映像名称 PID 会话名 会话# 内存使用
========================= ======== ================ =========== ============
emulator-arm.exe 7200 Console 1 884,088 K
3.从结果可以看出,有两个应用占了,一个是adb本身,另外一个是模拟器(emulator-arm.exe),端口发生冲突了,接下来杀掉占用5037端口的进程
taskkill /pid 7200 /f
C:\Users\admin>taskkill /pid 7200
成功: 已终止 PID 为 7200 的进程。
六、adb文件导入和导出(pull push)
用手机连电脑的时候,有时候需要把手机(模拟器)上的文件导出到电脑上,或者把电脑的图片导入手机里做测试用,我们可以用第三方的软件管理工具直接复制粘贴,也可以直接通过adb命令导入和导出。
adb shell
1.在导入和导出前先对adb shell基本操作熟悉下,cmd输入adb shell就能进入了,android的系统是基于linux系统开发的,adb shell就是进入shell模式
2.查看文件详情和进入文件夹操作
C:\Users\admin>adb shell
HWBND-H:/ $ cd sdcard/
HWBND-H:/sdcard $ cd DCIM
HWBND-H:/sdcard/DCIM $ cd Camera/
HWBND-H:/sdcard/DCIM/Camera $ ls
05c0de14db194545ae19bd72e3d3e562.png IMG_20180429_205502.jpg
09240909343246bf991e1be463769b7f.png IMG_20180429_205506.jpg
3.exit退出shell
$ exit
adb pull
1.找到需要导入的文件路径后,先exit退出shell,再执行
adb pull [手机路径] [电脑路径]
注意:手机路径是左斜杠/ 电脑路径是右斜杠\ (不能直接导电脑根目录,得指定一个已经存在的文件夹)
C:\Users\admin>adb pull /sdcard/DCIM/Camera/IMG_20180428_164205.jpg d:\img
/sdcard/DCIM/Camera/IMG_20180428_16420...d. 23.5 MB/s (6646804 bytes in 0.270s)
C:\Users\admin>
2.想导出文件夹下的全部内容,就不用指定文件名称了,到文件夹这一层目录就行,如/sdcard/DCIM/Camera/
adb pull /sdcard/DCIM/Camera/ d:\img
adb push
1.把电脑的文件导入手机,跟上面操作刚好相反
adb push [电脑路径] [手机路径]
2.如果想在手机上创建一个文件夹,可以进shell模式,用mkdir创建
C:\Users\admin>adb shell
HWBND-H:/ $ cd /sdcard/
HWBND-H:/sdcard $ mkdir yoyo
HWBND-H:/sdcard $ ls
360
MagazineUpdate backups
yoyo
3.push导入手机指定路径
adb push d:\img\123.jpg /sdcard/yoyo
C:\Users\admin>adb push d:\img\123.jpg /sdcard/yoyo
d:\img\123.jpg: 1 file pushed. 2.1 MB/s (485149 bytes in 0.217s)
七、adb logcat查看日志
做app测试,遇到异常情况,查看日志是必不可少的,日志如何输出到手机sdcard和电脑的目录呢?这就需要用logcat输出日志了
以下操作是基于windows平台的操作:adb logcat | find
linux平台的操作可以把find改成grep: adb logcat | grep
windows上的dos里面是没grep指令的
logcat输出日志
1.把日志存入手机sdcard某个目录(前提是这个目录要是存在的)
adb logcat -f /sdcard/yoyo/yoyo.txt
备注:-f 将日志输出到文件 # 作者:上海-悠悠 QQ交流群:330467341
上面这个指令在真机上(未root)是会报错的,提示没操作权限,在模拟器上可以执行
2.把日志存入电脑的某个目录,如d:\debug
adb logcat >d:debug\yoyo.txt
备注这里没-f, 不要问为什么 # 作者:上海-悠悠 QQ交流群:330467341
find过滤包名
1.如果直接用adb logcat抓日志的话,会把系统的一些其他无关紧要的都抓出来,如果只想抓取被测app的日志,那就根据包名过滤
adb logcat | find "com.sankuai.meituan" >d:\hello.txt
结束logcat
1.结束logcat抓包,可以用ctr+c快捷键结束, 这个是通过手工的快捷键操作完成
2.也可以先查询到logcat的pip,再kill掉
adb shell ps | findstr logcat
adb shell kill -9 [logcatpid]
注意:kill操作在模拟器上是可以的,真机上没权限
help其它功能
1.cmd输入adb logcat -help可以查看其它功能
adb logcat -help
C:\Users\admin>adb logcat -help
Unrecognized Option h
Usage: logcat [options] [filterspecs]
**选项**:
-- "-s"选项 : 设置输出日志的标签, 只显示该标签的日志;
-- "-f"选项 : 将日志输出到文件, 默认输出到标准输出流中, -f 参数执行不成功;
-- "-r"选项 : 按照每千字节输出日志, 需要 -f 参数, 不过这个命令没有执行成功;
-- "-n"选项 : 设置日志输出的最大数目, 需要 -r 参数, 这个执行 感觉 跟 adb logcat 效果一样;
-- "-v"选项 : 设置日志的输出格式, 注意只能设置一项;
-- "-c"选项 : 清空所有的日志缓存信息;
-- "-d"选项 : 将缓存的日志输出到屏幕上, 并且不会阻塞;
-- "-t"选项 : 输出最近的几行日志, 输出完退出, 不阻塞;
-- "-g"选项 : 查看日志缓冲区信息;
-- "-b"选项 : 加载一个日志缓冲区, 默认是 main, 下面详解;
-- "-B"选项 : 以二进制形式输出日志;
**过滤项格式** : <tag>[:priority] , 标签:日志等级, 默认的日志过滤项是 " *:I " ;
-- V : Verbose (明细);
-- D : Debug (调试);
-- I : Info (信息);
-- W : Warn (警告);
-- E : Error (错误);
-- F : Fatal (严重错误);
-- S : Silent(Super all output) (最高的优先级, 可能不会记载东西);
'*' by itself means '*:D' and <tag> by itself means <tag>:V.
If no '*' filterspec or -s on command line, all filter defaults to '*:V'.
eg: '*:S <tag>' prints only <tag>, '<tag>:S' suppresses all <tag> log messages.
If not specified on the command line, filterspec is set from ANDROID_LOG_TAGS.
If not specified with -v on command line, format is set from ANDROID_PRINTF_LOG
or defaults to "threadtime"