Android 史上最新最全的ADB及命令百科,没有之一

梦想与她 提交于 2020-08-16 00:31:50


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会帮助检查),并且为其分配了两个连续的端口,比如:

  1. Emulator1, console: 5554
    偶数端口用于控制台与终端设备进行连接交互
  2. 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协议建立长连接实现通信的。其通信流程大致如下:

  1. ADB客户端启动后,会主动寻找并尝试连接ADB Server服务进程,如果Server未启动,则client启动一个server。 随后clent 与server 通过本地端口5037进行通信。
  2. Server通过扫描5555—5585之间的奇数端口来搜寻模拟器或手机,一旦发现adb daemon,则通过该端口建立连接。
  3. 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连接。
手机要打开开发者模式

其连接流程如下:

  1. 检查网络同一
    在电脑上cmd命令行工具中ping Android设备IP,如果未丢失数据,说明两者在同一网络中。
    在这里插入图片描述

  2. 设置设备TCP模式
    在adb.exe所在目录输入命令 adb tcpip 5555,将Android设备设置成TCP/IP连接模式
    在这里插入图片描述
    如果失败了,一般是adb 被别的程序占用了,一般要关掉如360手机助手,豌豆荚等程序然后重启adb


  3. 连接设备
    输入命令 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种方法可以获取:

  1. 通过路由器管理页面查看WLAN,查看IP地址
  2. 通过手机设置》关于手机查看
    在这里插入图片描述
    在这里插入图片描述

  3. 通过adb命令 adb shell ifconfig wlan0,获取连接的手机IP
    在这里插入图片描述
  4. 通过adb命令 adb shell netcfg,获取连接的手机IP
    在这里插入图片描述
  5. 在wifi 设置页面中查看IP地址
    在这里插入图片描述
    在这里插入图片描述


二、ADB的安装

如果只是想对ADB工具及命令进行了解,而不想安装类似Android Studio这样的工具,那么请下载ADB

比如我下载文件后解压放在E盘,那么使用步骤:

  1. 打开cmd,输入命令 E:
  2. 输入 cd E:\adb_1.0.41,进入adb目录中
  3. 输入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端口上 一般用来主机和移送设备进行额外的数据传输
  1. 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命令,有两种方法:

  1. 先进入shell模式输入命令,如先adb shell 进入调试设备的shell 界面,然后dumpsys power
  2. 直接执行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开发帮助是很大的,尤其是越深度的发展技术路线。

博客书写不易,如觉得文章还行,千万别忘记点赞 收藏 ^ _ ^ !

推荐链接


易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!