ADB详解及常用命令
Android开发对于ADB想来是不会陌生的,对于ADB的相关知识和使用我们需要熟练掌握。
一、ADB的认识
1. ADB组成
Android Debug Bridge,Android调试桥接器,简称ADB,是用于管理模拟器或真机状态的万能工具。说人话就是:ADB是PC和移动终端通信的桥梁,它采用了C/S模型,由三部分组成。
借用一张图:
2. 服务端部分,是运行在开发用电脑上的后台进程,用于管理客户端与运行在模拟器或真机的守护进程通信。
1. adb client(客户端)
client是运行在PC端的组件,可以在命令行中运行adb命令来调用该客户端,通常的ADB插件、DDMS、豌豆荚等工具都可以调用ADB。
每当我们发起一个ADB命令时,就会开启一个client程序,client开启后就会去检测后台是否已存在server程序在运行,如无存在则开启一个adb-server进程。我们常见的打开Android Studio开发工具时,会帮你自动开启一个client。
client与模拟器是一对多的关系,连接多个手机也只有一个client。client都是通过5037端口与adb-server进行通讯的。
2. adb daemon(adb后台程序)
daemon守护进程,该组件作为一个后台进程运行在模拟器/真实Android设备中。
在PC命令行中中输入的ADB命令,通过Server与daemon的通信,将命令传至daemon,实际命令是在daemon中运行。
daemon使用端口的范围是5554-5585,每个模拟器/设备连接到PC端时,总会开启这样一个后台进程(client会帮助检查),并且为其分配了两个连续的端口,比如:
- Emulator1, console: 5554
偶数端口用于控制台与终端设备进行连接交互 - Emulator1, adb: 5555
奇数端口是用来Server与模拟器、手机进行连接通信的
因为每个设备都分一组两个端口,所以adb连接手机的最大数量为16。
3. adb server(服务器)
Server,该组件管理客户端和后台程序之间的通信,作为一个后台的程序运行在开发PC端。当一个server开启的时候,会自动绑定并且监听5037端口,接收client通过该端口发送过来的命令。
同时server还会对5555-5585间的奇数端口进行扫描,进行对已连接设备的定位。server将client中命令传至daemon.
2. ADB 通信原理
ADB组件是通过TCP/IP协议建立长连接实现通信的。其通信流程大致如下:
- ADB客户端启动后,会主动寻找并尝试连接ADB Server服务进程,如果Server未启动,则client启动一个server。 随后clent 与server 通过本地端口5037进行通信。
- Server通过扫描5555—5585之间的奇数端口来搜寻模拟器或手机,一旦发现adb daemon,则通过该端口建立连接。
- Server可以从多个client接收ADB命令,然后将命令传至连接的多个daemon,在daemon中运行命令达到控制手机/模拟器的效果。
3. ADB连接方式
1) 手机数据线连接
我们Android手机线一般有两种,USB type-C和USB micro。这种方式很常见,不说了。
USB micro数据口
USB type-C数据口
2) USB type-A数据线连接
首选认识下USB type-A数据口,它就是我们常见电脑上的USB口,见图如下:
这种连接方式一般Android开发碰不到,他在一些Android柜台机,广告机中有可能是这样连接的。这种连接线两头都是一模一样的这种USB type-A数据口,常被叫做双公头数据线。
一般都是如上设置,即可建立连接
3) 网络连接
网络连接就是通过让Android终端与电脑处于同一网络内,将设备设置为TCP模式进行连接。让Android 设备与PC处于同一网络,可以是通过网线或者wifi连接。手机要打开开发者模式
其连接流程如下:
-
检查网络同一
在电脑上cmd命令行工具中ping Android设备IP,如果未丢失数据,说明两者在同一网络中。 -
设置设备TCP模式
在adb.exe所在目录输入命令 adb tcpip 5555,将Android设备设置成TCP/IP连接模式
如果失败了,一般是adb 被别的程序占用了,一般要关掉如360手机助手,豌豆荚等程序然后重启adb -
连接设备
输入命令 adb connect 192.168.31.34,如图连接成功,拔掉数据线你会发现设备与PC还是连着的。
如果connect被拒绝,关闭干扰软件,关闭ADB,重新连接。
**注意:**
1) 想要断开连接的命令是adb disconnect 192.168.31.34
2) wifi连接模式至少需要让Android设备与PC用数据线连接一次
3)我们常用的Android studio wifi连接插件其实就是基于如上原理,只是自动帮我们完成了一些ADB命令的键入,直接按钮点击连接就好。
我用华为Honor 9测试,插件 ADB Wifi好像无法使用,插件Android Wifi ADB布局画面也不美观。Android studio进行开发,那么我给你推荐WIFI ADB ULTIMATE这款wifi连接插件,界面美观,功能强大。
4. 手机IP确认
有时候你可能不知道手机的IP地址是多少,这时候有5种方法可以获取:
- 通过路由器管理页面查看WLAN,查看IP地址
- 通过手机设置》关于手机查看
- 通过adb命令 adb shell ifconfig wlan0,获取连接的手机IP
- 通过adb命令 adb shell netcfg,获取连接的手机IP
- 在wifi 设置页面中查看IP地址
二、ADB的安装
如果只是想对ADB工具及命令进行了解,而不想安装类似Android Studio这样的工具,那么请下载ADB
比如我下载文件后解压放在E盘,那么使用步骤:
- 打开cmd,输入命令 E:
- 输入 cd E:\adb_1.0.41,进入adb目录中
- 输入adb version,如下,adb的信息如下,想要进行其他操作,请查看下面的ADB命令
三、ADB命令
注意:
1. 《 》 代表内容需要自己更具实际情况更改
2. 【 】 代表内容是可选项,可以不填写
1. adb 普通命令
adb -s / -e / -d 指定对某个连接成功的设备执行命令
-s: 指定要操作的设备;
-e: 默认操作模拟器;
-d:默认操作硬件设备;
-s、-e、-d 是跟在adb后面的限制符,如adb -s emulator-5556 install helloWorld.apk
这条命令就是往emulator-5556模拟器安装apk文件。 它的原始普通命令是 adb install helloWorld.apk
1) ADB信息
命令模式 | 说明 | 示例 |
---|---|---|
adb pwd | 打印当前路径 | |
adb ls | 查看当前 | |
adb devices | 列举当前连接的调试设备 | |
adb get-serialno | 获取当前连接设备信息, 只能当连接一个设备时使用,并拿到设备的序列号 | |
adb get-state | 获取设备的状态 ,有 3 钟 | device:设备正常连接 ;offline:连接出现异常,设备无响应 ; unknown:没有连接设备 |
adb bugreport | 查看bug报告 | |
adb help | 调出adb命令提示 |
2)操作类
命令模式 | 说明 | 示例 |
---|---|---|
adb pull -a remote-path local-path | 从设备拷贝文件或文件夹到电脑 | -a:保留文件时间戳及属性 ;remote-path:为手机端文件路径; local-path:为文件复制到的路径 |
adb push loacal-path remote-path | 将文件或文件夹(包括文件夹的子目录)拷贝到设备 | adb push /Users/littlejie/Desktop/log.txt /dev |
adb reboot | 重启机器 | adb -s xxx reboot 重启连接成功的指定设备。 |
adb reboot recovery | 重启进入recovery模式 | |
adb reboot bootloader | 重启到bootloader,即刷机模式 | |
adb forward tcp:8000 tcp:9000 | 执行此命令后, PC端的8000端口会被adb监听, 这个时候我们只需要往8000端口写数据, 这个数据就会发送到手机端的9000端口上 | 一般用来主机和移送设备进行额外的数据传输 |
- adb remount 将system分区重新挂载为可读写分区
3 ) ADB 远程
命令模式 | 说明 | 示例 |
---|---|---|
adb version | 查看版本 | |
adb tcpip 5555 | 设置连接设备为TCP模式 | |
adb usb | 切换到usb模式 | |
adb start/kill -server | 启动/杀死adb 的Server | |
adb connect/disconnect 《192.168.1.101》 | 通过局域网远程调试ADB终端 | |
adb install 【-r/-s】 test.apk | 安装apk文件 | -r:保留数据和缓存文件,重新安装apk ; -s:安装apk到sd卡 |
adb uninstall 【-k】 com.tencent.mobileqq | 卸载apk | 有-k 则不删除程序运行所产生的数据和缓存目录。 |
4) log 命令
adb logcat -* * 代表不同flag,如下图
标识 | 说明 |
---|---|
"-s"选项 | 设置输出日志的标签, 只显示该标签的日志; |
"-f"选项 | 将日志输出到文件, 默认输出到标准输出流中, -f 参数执行不成功; |
"-r"选项 : | 按照每千字节输出日志, 需要 -f 参数, 不过这个命令没有执行成功; |
"-n"选项 | 设置日志输出的最大数目, 需要 -r 参数, 这个执行 感觉 跟 adb logcat 效果一样; |
"-v"选项 | 设置日志的输出格式, 注意只能设置一项; |
"-c"选项 | 清空所有的日志缓存信息; |
"-d"选项 | 将缓存的日志输出到屏幕上, 并且不会阻塞; |
"-t"选项 | 输出最近的几行日志, 输出完退出, 不阻塞; |
"-g"选项 | 查看日志缓冲区信息; |
"-b"选项 | 加载一个日志缓冲区, 默认是 main, 下面详解; |
"-B"选项 | 以二进制形式输出日志; |
logcat定义表
命令模式 | 说明 | 示例 |
---|---|---|
adb logcat | 打印信息 | |
adb logcat | grep 【-i】 | 显示包含的logcat ,【并忽略大小写】 | |
adb logcat -c | 清楚手机的log buffer | |
adb logcat -b | 打印指定buffer的log信息 | |
adb logcat -d | 读完所有log后返回,而不会一直等待 | |
adb logcat -f | 输出log到指定文件 | |
log adb logcat -s xys | 打印xys标签 | adb -s 192.168.56.101:5555 logcat -s xys 打印192.168.56.101:5555设备里的xys标签log |
adb logcat -s ActivityManager | findstr “START”** 打印在ActivityManager标签里包含start的日志 | |
logcat -t | 打印最近的指定条数count的logcat | |
adb logcat -v format | 格式化输出log |
format有多种格式,如下:
adb logcat -v time 显示时间
adb logcat -v process |grep 8607 查看PID是:8607进程的日志
brief — 显示优先级/标记和原始进程的PID (默认格式)
process — 仅显示进程PID
tag — 仅显示优先级/标记
thread — 仅显示进程:线程和优先级/标记
raw — 显示原始的日志信息,没有其他的元数据字段
time — 显示日期,调用时间,优先级/标记,PID
long —显示所有的元数据字段并且用空行分隔消息内容
2. adb shell命令
adb 命令是 adb 这个程序自带的一些命令,而 adb shell 则是调用的 Android 系统中的命令,这些 Android 特有的命令都放在了 Android 设备的 system/bin 目录下。想要执行shell命令,有两种方法:
- 先进入shell模式输入命令,如先
adb shell
进入调试设备的shell 界面,然后dumpsys power
- 直接执行
adb shell dumpsys power
两种方式的实际效果是一摸一样的。
进入Shell模式后,如果现实"#",说明该设备拥有root权限,如果现实"$",说明该设备未拥有root权限。
1) adb shell am
am全称activity manager,你能使用am去模拟各种系统的行为,例如去启动一个activity,强制停止进程,发送广播进程,修改设备屏幕属性等等。
命令模式 | 说明 | 示例 |
---|---|---|
am start [options] intent | am即activity manager. 该命令用来执行一些系统动作 | |
am broadcast | 发送一个广播 | |
am start -a android.settings.INPUT_METHOD_SETTINGS | 使用Action方式打开系统设置-输入法设置 | |
am start -n 《包名》/.《类名》 | 开始某个Activit或Intent | |
am start -n com.android.camera/.Camera} | 使用组件名方式启动照相机功能 | |
am start -n | 启动指定包名的应用 | |
am start -a android.intent.action.CALL-d tel:10086 | 打开拨号界面,并传递一个DATA_URI数据给拨号界面 | |
am start -a android.intent.action.VIEW -d http://www.jianshu.cn/ | 打开简书的官网页 | |
am startservice <包名/.Service名> | 使用ComponentName 方式启动一个Service | |
am stopservice 《包名/.Service名》 | 停止一个service | |
am force-stop | 强制结束应用 | |
adb shell am kill | 杀死app 进程 | |
adb shell am monitor | 监控程序的crash和anr错误 |
2)shell pm
pm全称package manager,你能使用pm命令去模拟Android行为或者查询设备上的应用等
命令模式 | 说明 | 示例 |
---|---|---|
pm list packages [option filter ] | 列出当前已安装的应用包名, 根据filter可以搜索你需要的包名 | |
pm list permission-groups | 查看所有可用的权限 | |
pm list permissions [options] group | 查看某个权限组下边所有的权限 | |
shell pm path | 查看某个apk安装路径 | |
pm clear | 删除和这个包有关联的所有数据 | |
pm set-install-location location | 改变apk默认安装位置(只能在已root设备使用,未root设备会报java.lang.SecurityException异常) | |
pm get-install-location | 获取系统默认安装位置 | |
pm install test.apk | 安装apk | |
pm uninstall 《package》 卸载指定包名应用 |
3) shell input
这个命令可以向 Android 设备发送按键事件
命令模式 | 说明 | 示例 |
---|---|---|
input text “发送内容” | 不能发送中文 | |
input keyevent KEYCODE |
发送按键事件 ,KEYCODE表 在文尾 |
input keyevent KEYCODE_HOME 模拟按下Home键 |
input tap | 对屏幕发送一个触摸事件 | input tap 500 500 点击屏幕上坐标为 500 500 的位置 |
adb shell input swipe | 滑动事件 | input swipe 800 600 100 600 从右往左滑动屏幕》 |
4)设备信息
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 重启 |
5)进程、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 |
6)shell 文件操作
命令模式 | 说明 | 示例 |
---|---|---|
ls | 列出目录下的文件和文件夹 | |
du -sh * | 查看目录下的文件大小 | |
cat <folder/file> | 查看文件内容 | |
chmod777 | 设置文件的权限 | |
cd | 进入文件夹,等同于dos中的cd 命令 | |
rename | 重命名文件 | |
rm 【 -r 】 /system/avi.apk | 删除指定路径文件的文件或者文件夹 | |
mv | 移动文件到新的目录 | |
mkdir path/foldelname | 新建文件夹 |
7)其他命令
命令模式 | 说明 | 示例 |
---|---|---|
adb shell screencap /sdcard/screen.png | 截图当前页面并保存到指定目录 | |
adb shell screenrecord | 录屏。Android4.4 及以上才能使用 | |
adb shell bugreport | 打印dumpsys、dumpstate、logcat的输出,也是用于分析错误 | adb shell dumpsys > D:\bugreport.log |
adb shell monkey -v -p your.package.name 500 | 跑monkey | adb -s 192.168.244.151:5555 shell monkey -v -p com.bolexim 500 |
adb shell top | 查看占用内存排序 | 1) adb shell top -m 6 查看占用内存前6的app ; 2)adb shell top -n 1 刷新一次内存信息,然后返回 |
当出现read-only 且 remount命令不管用时 | adb shell mount -o rw,remount / | |
进入9008模式 | adb reboot edl | |
查看高通gpio | sys/class/private/tlmm 或者 sys/private/tlmm | |
查看gpio占用情况 | sys/kernle/debug/gpio | |
systrace | sdk/tools/monitor | |
限频 | echo /sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq 1497600 | |
LPM | echo N > /sys/modue/lpm_levels/parameters/sleep_disabled |
四、 KEYCODE表
这个是按键与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 |
用代码写这个表格太爽歪歪了。
总结
感觉是最全的ADB讲解了,从ADB的基本原理结构》安装》命令使用。如果您还没看懂或学会使用,请留言Call me,由我来帮你洗脑讲解。
ADB 的使用,尤其是ADB shell的使用对我们的Android开发帮助是很大的,尤其是越深度的发展技术路线。
博客书写不易,如觉得文章还行,千万别忘记点赞 收藏 ^ _ ^ !
推荐链接
来源:oschina
链接:https://my.oschina.net/u/4271231/blog/4305075