认识 ADB

ADB:用于管理模拟器或真机状态的工具。说人话就是:ADB是PC和移动终端通信的桥梁。

它采用了C/S模型,由三部分组成。

img

img

adb client

client是运行在PC端的组件,可以在命令行中运行adb命令来调用该客户端,通常的ADB插件、DDMS、豌豆荚等工具都可以调用ADB。

每当我们发起一个ADB命令时,就会开启一个client程序,client开启后就会去检测后台是否已存在server程序在运行,如无存在则开启一个adb-server进程。我们常见的打开Android Studio开发工具时,会帮你自动开启一个client。

client与模拟器是一对多的关系,连接多个手机也只有一个client。client都是通过5037端口与adb-server进行通讯的。

adb daemon

daemon守护进程,该组件作为一个后台进程运行在模拟器/真实Android设备中。在PC命令行中中输入的ADB命令,通过Server与daemon的通信,将命令传至daemon,实际命令是在daemon中运行。

daemon使用端口的范围是5554-5585,每个模拟器/设备连接到PC端时,总会开启这样一个后台进程(client会帮助检查),并且为其分配了两个连续的端口,比如:

  • Emulator1, console: 5554

    偶数端口用于控制台与终端设备进行连接交互

  • Emulator1, adb: 5555

    奇数端口是用来Server与模拟器、手机进行连接通信的
    因为每个设备都分一组两个端口,所以adb连接手机的最大数量为16。

adb server

Server,该组件管理客户端和后台程序之间的通信,作为一个后台的程序运行在开发PC端。当一个server开启的时候,会自动绑定并且监听5037端口,接收client通过该端口发送过来的命令。同时server还会对5555-5585间的奇数端口进行扫描,进行对已连接设备的定位。server将client中命令传至daemon。

ADB 通信原理

ADB组件是通过TCP/IP协议建立长连接实现通信的。其通信流程大致如下:

  1. ADB客户端启动后,会主动寻找并尝试连接ADB Server服务进程,如果Server未启动,则client启动一个server。
  2. 随后 client 与 server 通过本地端口5037进行通信。Server通过扫描5555—5585之间的奇数端口来搜寻模拟器或手机,一旦发现adb daemon,则通过该端口建立连接。
  3. Server可以从多个client接收ADB命令,然后将命令传至连接的多个daemon,在daemon中运行命令达到控制手机/模拟器的效果。

ADB命令

常用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
# 锁定手机
adb shell input keyevent 26

# 解锁手机(如果设置了密码,会提示输入密码)
adb shell input keyevent 82

# 输入密码,并回车
adb shell input text 123456 && adb shell input keyevent 66

# 重启 / 关机
adb reboot //重启
adb shell reboot //重启
adb shell reboot -p //关机

# 打开关闭蓝牙
adb shell service call bluetooth_manager 6 //打开蓝牙
adb shell service call bluetooth_manager 9 //关闭蓝牙

# 打开关闭 wifi
adb shell svc wifi enable //打开wifi
adb shell svc wifi disable //关闭wifi

# 打开 wifi 设置界面
adb shell am start -a android.intent.action.MAIN -n com.android.settings/.wifi.WifiSettings

# 连接时保持亮屏 设置
svc power stayon [true|false|usb|ac|wireless]

# 模拟按键操作
# 更多按键代码,在这里https://developer.android.com/reference/android/view/KeyEvent.html
adb shell input keyevent 111 //关闭软键盘(其实是按下ESC,111=KEYCODE_ESCAPE)

# 模拟滑动触屏操作
adb shell input touchscreen swipe 930 880 930 380 //向上滑
adb shell input touchscreen swipe 930 880 330 880 //向左滑
adb shell input touchscreen swipe 330 880 930 880 //向右滑
adb shell input touchscreen swipe 930 380 930 880 //向下滑

# 模拟鼠标操作
# 100 是 x,500 是 y。原点在屏幕左上角。
adb shell input mouse tap 100 500

# 将上面的组合一下
# 解锁手机 -- 向上滑动(进入密码输入页面) -- 输入密码
adb shell input keyevent 82 && adb shell input touchscreen swipe 930 880 930 380 && adb shell input text 258369

# 拨打电话
adb shell am start -a android.intent.action.CALL -d tel:10010

# 打开网站
adb shell am start -a android.intent.action.VIEW -d https://baidu.com

# 启动 APP
adb shell am start -n com.package.name/com.package.name.MainActivity
adb shell am start -n com.package.name/.MainActivity

# 手机和电脑的文件复制
adb push test.zip /sdcard/ //从本地复制文件到设备
adb pull /sdcard/abc.zip ~/ //从设备复制文件到本地
# eg:
adb pull /data/local/tmp/uidump.xml D:\tmp

# 捕获键盘操作
adb shell getevent -ltr

设备信息

KeyCode值 对应按键名
亮度 /sys/class/leds/lcd-backlight/brightness
CPU /sys/devices/system/cpu/cpu0/cpufreq
GPU /sys/class/ kgsl/kgsl-3d0/gpuclk
限频 cat /data/pmlist.config
电流 cat /sys/class/power_supply/battery/current_now
获取设备信息 cat /system/build.prop 【grep】
获取手机MAC地址 cat /sys/class/net/wlan0/address
查看wifi密码 cat /data/misc/wifi/*.conf
获取连接设备的IP地址 ifconfig wlan0
查看连接设备的IP地址 netcfg
获取手机内存信息 cat /proc/meminfo
获取手机存储信息 df
获取手机内部存储信息 df /data
获取系统版本 getprop ro.build.version.release
获取系统api版本 getprop ro.build.version.sdk
获取手机设备型号 getprop ro.product.model
获取手机厂商名称 getprop ro.product.brand
列出设备上的输入法 adb shell ime list -s
查看Power dumpsys power
获取Android设备屏幕分辨率 dumpsys window (或 grep mUnrestrictedScreen)
WIFI data/misc/wifi/wpa_supplicant.conf
持有wake_lock echo a> sys/power/wake_lock
释放wake_lock echo a> sys/power/wake_unlock
查看Wakeup_source cat sys/kernel/debug/wakeup_sources
Display(关闭AD) mv /data/misc/display/calib.cfg /data/misc/display/calib.cfg.bak 重启

进程、Service及状态

命令模式 说明 示例
su root 获取root权限 一般Android板子可以,手机一般不行
service list 查看后台services信息
dumpsys services [] 查看正在运行的Services
dumpsys activity [] 查看正在运行的Activity
procrank 查看运行进程
kill 366 关闭或杀掉进程
ps 列出当前运行的进程 adb shell ps -x [PID] 查看指定进程状态
cat /proc/1460/maps 查看进程的文件结构 1460进程的PID
cat /proc/1460/status 查看进程的状态 1460进程的PID
关闭cabc echo 0 > /sys/device/virtual/graphics/fb0/cabc_onoff
打开cabc echo 3 > /sys/device/virtual/graphics/fb0/cabc_onoff

KEYCODE表

KeyCode值 对应按键名
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

常用python+adb指令集

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
# 查看包名和activity
adb shell dumpsys window w |findstr \/ |findstr name=

# 熄屏、亮屏操作
os.popen("adb shell input keyevent 26") #操作设备的power键

# 重启设备操作
os.popen("adb reboot") #直接(热)重启

# 打开指定应用(package/.activity)
os.popen("adb shell am start -n cn.kuwo.kwmusiccar/cn.kuwo.kwmusiccar.WelcomeActivity") # 打开酷我
os.popen("adb shell am start -n com.edog.car/com.kaolafm.auto.home.MainActivity") # 打开考拉电台
os.popen("adb shell am start -n cn.yunovo.car.settings/cn.yunovo.car.settings.SettingsListActivity") # 打开设置
os.popen("adb shell am start -n cn.yunovo.nxos.bt/cn.yunovo.nxos.bt.activitys.BluetoothActivity") # 打开蓝牙电话
os.popen("adb shell am start -n com.aispeech.aios/.MainActivity") #打开语音助手

# 切换至后台(HOME按键)
os.popen("adb shell input keyevent 3") #切换至后台

# 查看系统内存情况
os.popen("adb shell dumpsys meminfo")

# 获取wifi信息
os.popen(" adb shell dumpsys wifi ")

# 查看进程占用CPU情况
os.popen(" top -m 20 -d 2 ") #top -m 进程数 -d 秒

# 查看设备电量信息
os.popen(" dumpsys battery ")

# 截图操作
os.popen(" adb shell screencap -p /sdcard/screen.png ")

# 跑Monkey
adb shell monkey -p com.spt.carengine.txz.voice -s 1000 --ignore-crashes --ignore-timeouts --monitor-native-crashes -v -v 100000000

# 安装和卸载APK
adb install xx.apk #安装apk
adb uninstall xx.apk #卸载apk

# 通过WiFi连接设备
adb connect 10.0.0.123