认识 ADB
ADB:用于管理模拟器或真机状态的工具。说人话就是:ADB是PC和移动终端通信的桥梁。
它采用了C/S模型,由三部分组成。


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协议建立长连接实现通信的。其通信流程大致如下:
- ADB客户端启动后,会主动寻找并尝试连接ADB Server服务进程,如果Server未启动,则client启动一个server。
- 随后 client 与 server 通过本地端口5037进行通信。Server通过扫描5555—5585之间的奇数端口来搜寻模拟器或手机,一旦发现adb daemon,则通过该端口建立连接。
- Server可以从多个client接收ADB命令,然后将命令传至连接的多个daemon,在daemon中运行命令达到控制手机/模拟器的效果。
ADB命令
常用
1 | # 锁定手机 |
设备信息
| 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 | # 查看包名和activity |