美文网首页
2019-10-15

2019-10-15

作者: 心简单世界就简单_e383 | 来源:发表于2019-10-15 20:14 被阅读0次

    简介adb

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

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

    • 客户端:用于发送命令。客户端在开发计算机上运行。您可以通过发出 adb 命令从命令行终端调用客户端。
    • 守护进程 (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):

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

    相关文章

      网友评论

          本文标题:2019-10-15

          本文链接:https://www.haomeiwen.com/subject/jrkemctx.html