2019-10-15

2019-10-15  本文已影响0人  心简单世界就简单_e383

简介adb

ADB,即 Android Debug Bridge, 是一种功能多样的命令行工具,可让您与设备进行通信。它是 Android 开发/测试人员不可替代的强大工具

ADB 分为三部分:PC上的adb client 和 adb server 以及Android设备上的adb daemon(adbd)

image

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 连接线的限制啦!

操作步骤:

  1. 将 Android 设备与要运行 adb 的电脑连接到同一个局域网,比如连到同一个 WiFi。

  2. 将设备与电脑通过 USB 线连接。

    应确保连接成功(可运行 adb devices 看是否能列出该设备)。

  3. 让设备在 5555 端口监听 TCP/IP 连接:

    <pre>adb tcpip 5555</pre>

  4. 断开 USB 连接。

  5. 找到设备的 IP 地址。

    一般能在「设置」-「关于手机」-「状态信息」-「IP地址」找到

  6. 通过 IP 地址连接设备。

    <pre>adb connect <device-ip-address></pre>

    这里的 <device-ip-address> 就是上一步中找到的设备 IP 地址。

  7. 确认连接状态。

    <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.demo1org.mazhuang.demo2org.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):

按某级别过滤日志则会将该级别及以上的日志输出。

比如,命令:

<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 //屏幕点击

上一篇下一篇

猜你喜欢

热点阅读