2019-10-15
简介adb
ADB,即 Android Debug Bridge, 是一种功能多样的命令行工具,可让您与设备进行通信。它是 Android 开发/测试人员不可替代的强大工具
ADB 分为三部分:PC上的adb client 和 adb server 以及Android设备上的adb daemon(adbd)
- 客户端:用于发送命令。客户端在开发计算机上运行。您可以通过发出 adb 命令从命令行终端调用客户端。
- 守护进程 (adbd):在设备上运行命令。守护进程在每个设备上作为后台进程运行。
- 服务器:管理客户端和守护进程之间的通信。服务器在开发计算机上作为后台进程运行。
adb工作原理
当您启动某个 adb 客户端时,客户端会先检查是否有 adb 服务器进程正在运行。如果没有,它将启动服务器进程。服务器在启动后会与本地 TCP 端口 5037 绑定,并监听 adb 客户端发出的命令 - 所有 adb 客户端均通过端口 5037 与 adb 服务器通信。
然后,服务器会与所有正在运行的设备建立连接。它通过扫描 5555 到 5585 之间(该范围供前 16 个模拟器使用)的奇数号端口查找模拟器。服务器一旦发现 adb 守护进程 (adbd),便会与相应的端口建立连接。请注意,每个模拟器都使用一对按顺序排列的端口 - 用于控制台连接的偶数号端口和用于 adb 连接的奇数号端口。例如:
模拟器 1,控制台:5554
模拟器 1,adb:5555
模拟器 2,控制台:5556
模拟器 2,adb:5557
依此类推…
如上所示,在端口 5555 处与 adb 连接的模拟器与控制台监听端口为 5554 的模拟器是同一个。
服务器与所有设备均建立连接后,您便可以使用 adb 命令访问这些设备。由于服务器管理与设备的连接,并处理来自多个 adb 客户端的命令,因此您可以从任意客户端(或从某个脚本)控制任意设备。
PC 和 Android 设别是一个多对多的关系:一个PC 可以连接多个Android设备;一个Android设备也可以连接多个PC。
基本用法
无线连接(需要借助 USB 线)
除了可以通过 USB 连接设备与电脑来使用 adb,也可以通过无线连接——虽然连接过程中也有需要使用 USB 的步骤,但是连接成功之后你的设备就可以在一定范围内摆脱 USB 连接线的限制啦!
操作步骤:
-
将 Android 设备与要运行 adb 的电脑连接到同一个局域网,比如连到同一个 WiFi。
-
将设备与电脑通过 USB 线连接。
应确保连接成功(可运行
adb devices
看是否能列出该设备)。 -
让设备在 5555 端口监听 TCP/IP 连接:
<pre>adb tcpip 5555</pre>
-
断开 USB 连接。
-
找到设备的 IP 地址。
一般能在「设置」-「关于手机」-「状态信息」-「IP地址」找到
-
通过 IP 地址连接设备。
<pre>adb connect <device-ip-address></pre>
这里的
<device-ip-address>
就是上一步中找到的设备 IP 地址。 -
确认连接状态。
<pre>adb devices</pre>
如果能看到
<pre><device-ip-address>:5555 device</pre>
说明连接成功。
如果连接不了,请确认 Android 设备与电脑是连接到了同一个 WiFi,然后再次执行 adb connect <device-ip-address>
那一步;
断开无线连接
命令:
<pre>adb disconnect <device-ip-address></pre>
[图片上传失败...(image-cf9305-1571193326623)]
adb基本命令
adb 命令的基本语法如下:
<pre>adb [-d|-e|-s <serialNumber>] <command></pre>
如果只有一个设备/模拟器连接时,可以省略掉 [-d|-e|-s <serialNumber>]
这一部分,直接使用 adb <command>
。
为命令指定目标设备
如果有多个设备/模拟器连接,则需要为命令指定目标设备。
<colgroup><col><col></colgroup>
参数 | 含义 |
---|---|
-d | 指定当前唯一通过 USB 连接的 Android 设备为命令目标 |
-e | 指定当前唯一运行的模拟器为命令目标 |
-s <serialNumber> |
指定相应 serialNumber 号的设备/模拟器为命令目标 |
在多个设备/模拟器连接的情况下较常用的是 -s <serialNumber>
参数,serialNumber 可以通过 adb devices
命令获取。如:
[图片上传失败...(image-719a6d-1571193326623)]
输出里的 d8e9b028 和10.234.215.3:5555 即为 serialNumber。
比如此时需要给某个设备安装应用,或者执行cts测试时,可以执行
adb -s d8e9b028 install xxx.apk
adb -s d8e9b028 install -r xxx.apk
输出格式是serialNumber state
<colgroup><col style="width: 29.6168%;" data-mce-style="width: 29.6168%;"><col style="width: 70.5355%;" data-mce-style="width: 70.5355%;"></colgroup>
state值 | 含义 |
---|---|
offline | 表示设备未连接成功或无响应 |
device | 设备已连接 |
no device | 没有设备/模拟器 |
以 root 权限运行adb
[图片上传失败...(image-d8b212-1571193326622)]
adb shell下的am 与 pm
am全称activity manager,你能使用am去模拟各种系统的行为,例如去启动一个activity,强制停止进程,发送广播进程,修改设备屏幕属性等等。
启动应用/ 调起指定 Activity
命令格式:
<pre>adb shell am start [options] <INTENT></pre>
例如:
[图片上传失败...(image-1cecf5-1571193326620)]
表示调起图库主界面。
<pre>adb shell am start -n com.miui.gallery/.activity.HomePageActivity
不指定Activity名称启动(启动主Activity)</pre>
命令格式:
<pre>adb shell monkey -p <packagename> -c android.intent.category.LAUNCHER 1</pre>
例如:
<pre>adb shell monkey -p com.miui.gallery -c android.intent.category.LAUNCHER 1</pre>
表示调起图库主界面。
打开简书 am start -a android.intent.action.VIEW -d [http://www.jianshu.com/](http://www.jianshu.com/)
拨打10086 am start -a android.intent.action.CALL -d tel:10086
强制停止应用
命令:
<pre>adb shell am force-stop <packagename></pre>
命令示例:
<pre>adb shell am force-stop com.miui.gallery</pre>
表示停止图库的一切进程与服务。
查看应用列表
查看应用列表的基本命令格式是
<pre>adb shell pm list packages [-f] [-d] [-e] [-s] [-3] [-i] [-u] [--user USER_ID] [FILTER]</pre>
即在 adb shell pm list packages
的基础上可以加一些参数进行过滤查看不同的列表,支持的过滤参数如下:
<colgroup><col><col></colgroup>
参数 | 显示列表 |
---|---|
无 | 所有应用 |
-f | 显示应用关联的 apk 文件 |
-d | 只显示 disabled 的应用 |
-e | 只显示 enabled 的应用 |
-s | 只显示系统应用 |
-3 | 只显示第三方应用 |
-i | 显示应用的 installer |
-u | 包含已卸载应用 |
<FILTER> |
包名包含 <FILTER> 字符串 |
所有应用
[图片上传失败...(image-d68cc0-1571193326618)]
包名包含某字符串的应用
比如要查看包名包含字符串 smarthome的应用列表,命令:
<pre>adb shell pm list packages smarthome</pre>
当然也可以使用 grep 来过滤:
<pre>adb shell pm list packages | grep mazhuang</pre>
<pre>adb shell pm list packages | findstr mazhuang</pre>
查看应用安装路径
命令:
adb shell pm path <PACKAGE>
输出应用安装路径
输出示例:
[图片上传失败...(image-af6785-1571193326617)]
参考jira:
查看前台 Activity
命令:
adb shell dumpsys activity activities | findstr mResumedActivity
[图片上传失败...(image-a2a9d2-1571193326617)]
查看正在运行的 Services
命令:
<pre>adb shell dumpsys activity services [<packagename>]</pre>
<packagename>
参数不是必须的,指定 <packagename>
表示查看与某个包名相关的 Services,不指定表示查看所有 Services。
<packagename>
不一定要给出完整的包名,比如运行 adb shell dumpsys activity services org.mazhuang
,那么包名 org.mazhuang.demo1
、org.mazhuang.demo2
和 org.mazhuang123
等相关的 Services 都会列出来。
查看最近任务列表的应用
命令
adb shell dumpsys activity r
[图片上传失败...(image-55cbb3-1571193326613)]
类似双task jira:MIUI-1619117
使用 Monkey 进行压力测试
Monkey:是Android系统中自导的一个黑盒测试工具,一般是生成伪随机用户事件来模拟单击、触摸、手势等操作,可以对正在开发中的程序进行随机压力测试,来确定应用是否发生异常
adb shell monkey --help
简单用法:
<pre>adb shell monkey -p <packagename> -v 500</pre>
表示向 <packagename>
指定的应用程序发送 500 个伪随机事件。
参数 含义
-p 用于约束限制,用此参数指定一个包或多个包。指定之后,只允许系统启动指定的APP
-v 用于指定反馈信息级别,总共3个级别
-s 用于指定伪随机数生成器的seed值,如果seed值相同,测试所生成的事件序列也相同
–throttle<毫秒> 指定用户操作间的时延,单位是毫秒
–ignore-crashes 用于指定当应用程序崩溃时,Monkey是否停止运行,如果使用此参数,即使应用程序崩溃,Monkey依然发送事件,直到事件计数完成
–ignre-timeouts 用于指定当应用程序ANR错误时,Monkey是否停止运行。如果使用此参数,即使应用程序发生ANR错误,Monkey依然发送事件,直到事件计数完成
官网:https://developer.android.com/studio/test/monkey
<colgroup><col><col></colgroup>
v参数的级别 | 含义 |
---|---|
Level0 | 说明缺省值 |
Level1 | 说明提供较为详细的日志,包括每个发送到Activity的事件信息 |
Level2 | 说明最详细的日志,包括测试中选中/未选中的Activity信息 |
adb shell monkey -p cn.emoney.acg -v 100 <==Level0
adb shell monkey -p cn.emoney.acg -v -v 100 <==Level1
adb shell monkey -p cn.emoney.acg -v -v -v 100 <==Level2
获取设备名
adb shell getprop ro.product.name
[图片上传失败...(image-c8f166-1571193326612)]
adb shell dumpsys和相关内容
获取前台activity:
获取运行service : adb shell dumpsys activity services 包名(或部分包名)
获取window层级 : adb shell dumpsys window visible
获取app信息 : adb shell dumpsys package 包名(或部分包名)
清除电量信息 : adb shell dumpsys batterystats --reset
内存、进程相关指令
查看内存信息(用来查内存泄漏): adb shell dumpsys meminfo 包名
查看进程: adb shell ps (| grep 某一进程包名)
查看进程UID:adb shell dumpsys package 包名 | grep userId=
杀进程: adb shell kill 进程号
节点查询
adb shell
电流: cat /sys/class/power_supply/battery/current_now
查看日志
Android 系统的日志分为两部分,底层的 Linux 内核日志输出到 /proc/kmsg,Android 的日志输出到 /dev/log。
Android 日志
命令格式:
<pre>[adb] logcat [<option>] ... [<filter-spec>] ...</pre>
常用用法列举如下:
按级别过滤日志
Android 的日志分为如下几个优先级(priority):
- V — 详细,显示所有日志消息(最低优先级)
- D — 调试,显示仅在开发期间有用的调试日志消息
- I — 信息,显示常规使用的预计日志消息
- W — 警告,显示尚不是错误的潜在问题
- E — 错误,显示已经引发错误的问题
- A — 断言,显示开发者预计绝不会发生的问题
按某级别过滤日志则会将该级别及以上的日志输出。
比如,命令:
<pre>adb logcat *:W</pre>
会将 Warning、Error、Fatal 和 Silent 日志输出。
按 tag 和级别过滤日志
<filter-spec>
可以由多个 <tag>[:priority]
组成。
比如,命令:
<pre>adb logcat ActivityManager:I MyApp:D *:S</pre>
表示输出 tag ActivityManager
的 Info 以上级别日志,输出 tag MyApp
的 Debug 以上级别日志,及其它 tag 的 Silent 级别日志(即屏蔽其它 tag 日志)。
eg:
<colgroup><col><col><col><col><col><col></colgroup>
| 日期 | 时间 | 进程标识符 | 线程标识符 | D(log级别) | 包含代码中的常量log标签TAG,定义的debug内容等 |
07-24 17:52:58.705 12280 12300 D BluetoothAdapterService: updateAdapterState() - Broadcasting state BLE_TURNING_ON to 1 receivers.
07-24 17:52:58.705 2129 2161 D BluetoothManagerService: MESSAGE_BLUETOOTH_STATE_CHANGE: OFF > BLE_TURNING_ON
07-24 17:52:58.706 2129 2161 D BluetoothManagerService: Sending BLE State Change: OFF > BLE_TURNING_ON
07-24 17:52:58.706 12280 12300 D BluetoothAdapterService: bleOnProcessStart()
07-24 17:52:58.706 12280 12300 D AdapterServiceConfig: addAudioProfiles profileHeadsetService
07-24 17:52:58.706 12280 12300 I AdapterServiceConfig: addAudioProfiles isA2dpSink :false
07-24 17:52:58.706 12280 12300 V AdapterServiceConfig: Adding HeadsetService
07-24 17:52:58.706 12280 12300 D AdapterServiceConfig: addAudioProfiles profileA2dpService
07-24 17:52:58.706 12280 12300 I AdapterServiceConfig: addAudioProfiles isA2dpSink :false
07-24 17:52:58.706 12280 12300 V AdapterServiceConfig: Adding A2dpService
07-24 17:52:58.706 12280 12300 D AdapterServiceConfig: addAudioProfiles profileHidHostService
07-24 17:52:58.706 12280 12300 I AdapterServiceConfig: addAudioProfiles isA2dpSink :false
清空日志
<pre>adb logcat -c</pre>
内核日志
命令:
<pre>adb shell dmesg</pre>
输出示例:
<pre><6>[14201.684016] PM: noirq resume of devices complete after 0.982 msecs
<6>[14201.685525] PM: early resume of devices complete after 0.838 msecs
<6>[14201.753642] PM: resume of devices complete after 68.106 msecs
<4>[14201.755954] Restarting tasks ... done.
<6>[14201.771229] PM: suspend exit 2016-08-28 13:31:32.679217193 UTC
<6>[14201.872373] PM: suspend entry 2016-08-28 13:31:32.780363596 UTC
<6>[14201.872498] PM: Syncing filesystems ... done.</pre>
中括号里的 [14201.684016]
代表内核开始启动后的时间,单位为秒。
通过内核日志我们可以做一些事情,比如衡量内核启动时间,在系统启动完毕后的内核日志里找到 Freeing init memory
那一行前面的时间就是。
使用-b <buffer>输出某一缓冲区的日志
adb logcat [-b <buffer>]
-b 选项的用法主要有:
adb logcat -b crash ——> 查看crash的信息
adb logcat -b main ——> 查看主要的日志缓冲区
adb logcat -b events ——> 查看包含事件相关消息的缓冲区
adb logcat -b system ——> 查看system相关的信息
adb logcat -b radio ——> 查看包含无线装置/电话相关消息的缓冲区
adb logcat -b all ——> 查看所有缓冲区的log
ADB 常用的命令
adb version // 查看 adb 版本
adb devices // 查看连接设备
adb start-server // 启动 adb server
adb kill-server // 停止 adb server
adb reboot // 重启设备
adb root //设置权限
/ 文件相关 */
adb pull <设备里的文件路径> [电脑上的目录]
adb push <电脑上的文件路径> <设备里的目录>
/* logcat 相关 */
adb logcat -c
adb logcat -s xxx grep | xxx
/* shell 相关 */
adb shell // 进入 shell
su // 切换到 root 用户权限。
adb shell pm list packages // 查看所有安装的应用
adb shell pm clear // 清除数据
adb shell am force-stop // 强制停止
adb install xxx.apk // 安装应用
adb shell am broadcast [options] // 模拟发送广播
adb shell dumpsys battery // 查看电池信息
adb shell wm size // 查看屏幕分辨率
adb shell dumpsys window displays // 查看屏幕信息
adb shell ifconfig | grep Mask // 查看 IP 信息
adb shell input keyevent 26 //电源
adb shell input swipe 1000 500 250 500 //向右滑动 滑动手机屏幕(数字分别代办原始的X坐标,原始Y坐标,需要滑动目标X坐标,目标Y坐标,滑动时间,单位毫秒,滑动时间可不写)
adb shell input swipe 250 500 1000 500 //向左滑动
adb shell dumpsys input > input.txt //窗口导出
adb shell input tap 360 320 //屏幕点击