wy168 发表于 2023-5-5 22:45:23

技术分享 | App测试时常用的adb命令你都掌握了哪些呢?


    <div style="text-align: left; margin-bottom: 10px;"><img src="https://p3-sign.toutiaoimg.com/tos-cn-i-qvj2lq49k0/1cdf91819d5e4cdbabced63fd409c387~noop.image?_iz=58558&amp;from=article.pc_detail&amp;x-expires=1679818987&amp;x-signature=hP2MStuqvjC%2BxWK5Br8b42hoKnw%3D" style="width: 100%; margin-bottom: 20px;"></div>
    <p style="font-size: 18px; line-height: 40px; text-align: left; margin-bottom: 30px;"><span style="color: green;"><span style="color: green;">本文节选自霍格沃兹测试开发学社内部教材</span></span></p>
    <p style="font-size: 18px; line-height: 40px; text-align: left; margin-bottom: 30px;"><span style="color: green;"><span style="color: green;">adb 全称为 Android Debug Bridge(Android 调试桥),是 Android SDK 中提供的用于管理 Android 模拟器或真机的工具。</span></span></p>
    <p style="font-size: 18px; line-height: 40px; text-align: left; margin-bottom: 30px;"><span style="color: green;"><span style="color: green;">adb 是一种功能强大的命令行工具,可让 PC 端与 Android 设备进行通信。adb 命令可执行各种设备操作,例如安装和调试应用。</span></span></p>
    <h1 style="text-align: left; margin-bottom: 10px;">adb组成</h1>
    <p style="font-size: 18px; line-height: 40px; text-align: left; margin-bottom: 30px;"><span style="color: green;"><span style="color: green;">采用了客户端-服务器(C/S)模型,包括三个部分:</span></span></p>
    <div style="text-align: left; margin-bottom: 10px;"><img src="https://p3-sign.toutiaoimg.com/tos-cn-i-qvj2lq49k0/ef7c47b0e1124aef96a12f48d2c80f4c~noop.image?_iz=58558&amp;from=article.pc_detail&amp;x-expires=1679818987&amp;x-signature=K5QFqwXxfxgwIpDSQiznV8QSxVo%3D" style="width: 100%; margin-bottom: 20px;"></div><span style="color: green;"><span style="color: green;">adb Client:运行在电脑上,可以在命令行中运行 adb 命令来调用该客户端。Client 本质上就是 Shell,用来发送命令给 Server。发送命令时,首先检测 PC 上有没有启动 Server,如果没有 Server,则会自动启动一个,然后将命令发送到 Server。</span></span><span style="color: green;"><span style="color: green;">adb Server:运行在电脑上的后台进程,用于管理客户端与运行在模拟器或真机的守护进程通信。</span></span><span style="color: green;"><span style="color: green;">adb Daemon:守护进程作为一个后台进程在 Android 设备或模拟器系统中运行。它的作用是连接 adb 服务端,并且为运行在主机上的 adb 客户端提供一些服务。</span></span>
    <h1 style="text-align: left; margin-bottom: 10px;">adb工作原理</h1>
    <div style="text-align: left; margin-bottom: 10px;"><img src="https://p3-sign.toutiaoimg.com/tos-cn-i-qvj2lq49k0/906c93dd562540b19f1d074c79d2ef01~noop.image?_iz=58558&amp;from=article.pc_detail&amp;x-expires=1679818987&amp;x-signature=rMKvN%2BcLeUGP2K8i9mHzYMKheUk%3D" style="width: 100%; margin-bottom: 20px;"></div>
    <p style="font-size: 18px; line-height: 40px; text-align: left; margin-bottom: 30px;"><span style="color: green;"><span style="color: green;">当 adb 客户端启动时,客户端会先检查 adb 服务端是否启动。如果没有,会先启动服务端进程。adb 服务端在启动后,会与 5037 端口绑定,并监听 adb 客户端发出的命令。</span></span></p>
    <p style="font-size: 18px; line-height: 40px; text-align: left; margin-bottom: 30px;"><span style="color: green;"><span style="color: green;">然后服务端会与所有正在运行的 Android 设备建立连接。它通过扫描 5555 到 5585 之间的奇数号端口查找 Android 设备。服务端一旦发现 Android 设备上的 adb 守护进程在运行,便会与相应的端口建立连接。每个 Android 设备都使用一对端口,偶数端口用于控制台连接,奇数端口用于 adb 连接。</span></span></p>
    <p style="font-size: 18px; line-height: 40px; text-align: left; margin-bottom: 30px;"><span style="color: green;"><span style="color: green;">服务端与所有 Android 设备建立连接后,就可以使用 adb 命令来访问这些设备了。服务端会管理已经建立的连接,并处理来自 adb 客户端的命令。</span></span></p>
    <h1 style="text-align: left; margin-bottom: 10px;">启动adb调试</h1>
    <p style="font-size: 18px; line-height: 40px; text-align: left; margin-bottom: 30px;"><span style="color: green;"><span style="color: green;">Android 真机可以通过 USB 连接到 adb,连接时需要在设备的系统设置中启用 USB 调试(位于开发者选项下),启动 USB 调试后,设备上的 adb 守护进程就会被启动,adb 服务端才可以和设备建立连接。除了用 USB 的方式连接之外,也可以通过 WLAN 的方式连接,这种方式不做赘述。</span></span></p><span style="color: green;"><span style="color: green;">模拟器:不需要手动设置 USB 调试开关,默认是打开的</span></span><span style="color: green;"><span style="color: green;">真机通过 USB 连接</span></span><span style="color: green;"><span style="color: green;">安装 Android 手机驱动</span></span><span style="color: green;"><span style="color: green;">设备启用 USB 调试</span></span>
    <h1 style="text-align: left; margin-bottom: 10px;">adb常用命令</h1>
    <h1 style="text-align: left; margin-bottom: 10px;">adb 命令格式</h1>adb [-d|-e|-s <span style="color: green;">&lt;<span style="color: green;">serialNumber</span>&gt;</span>] <span style="color: green;">&lt;<span style="color: green;">command</span>&gt;</span><span style="color: green;"><span style="color: green;">-d:指定当前唯一通过 USB 连接的 Android 设备为命令目标</span></span><span style="color: green;"><span style="color: green;">-e:指定当前唯一运行的模拟器为命令目标</span></span><span style="color: green;"><span style="color: green;">-s:指定相应 serialNumber 号的设备/模拟器为命令目标</span></span>
    <p style="font-size: 18px; line-height: 40px; text-align: left; margin-bottom: 30px;"><span style="color: green;"><span style="color: green;">方括号中的内容是可选的,尖括号内容的是必填的。方括号中参数可以指定设备,关于设备的指定有三个参数可以使用。-d、-e 和 -s,其中使用最多的是 -s 参数,在连接多台设备的时候,一般都是使用 -s 加上设备的序列号这种方式去指定具体设备。</span></span></p>
    <p style="font-size: 18px; line-height: 40px; text-align: left; margin-bottom: 30px;"><span style="color: green;"><span style="color: green;">adb 可以同时连接多台设备,但是一次只能对一台设备执行命令。所有连接多台设备的时候,是必须要制定设备,命令才可以执行成功的。</span></span></p>
    <h1 style="text-align: left; margin-bottom: 10px;">查询设备</h1>
    <p style="font-size: 18px; line-height: 40px; text-align: left; margin-bottom: 30px;"><span style="color: green;"><span style="color: green;">把 Android 设备连接到 adb 服务端后,需要确认设备的连接状态。这时可以使用查询命令进行查询。</span></span></p>
    <h1 style="text-align: left; margin-bottom: 10px;">连接模拟器(以 MUMU 模拟器为例)</h1><span style="color: green;">adb</span> <span style="color: green;">connect</span> 127<span style="color: green;">.0</span><span style="color: green;">.0</span><span style="color: green;">.1</span><span style="color: green;">:7555</span>

    <span style="color: green;">adb</span> <span style="color: green;">devices</span><span style="color: green;"><span style="color: green;"><span style="color: green;">adb connect</span></span><span style="color: green;"> 命令可以通过 WLAN 的方式连接到模拟器,7555 为 mumu 模拟器的端口</span></span><span style="color: green;"><span style="color: green;"><span style="color: green;">adb devices</span></span><span style="color: green;"> 可以查询设备连接的状态</span></span>
    <p style="font-size: 18px; line-height: 40px; text-align: left; margin-bottom: 30px;"><span style="color: green;"><span style="color: green;">Windows 系统中,连接模拟器需要先执行 connect 命令去连接模拟器,127.0.0.1 是本地的 IP 地址,因为模拟器就是安装在本地的,所以要使用本地的 IP 地址,加上模拟器本身规定的一个端口号。mumu 的端口号是 7555,如果使用的是其他的模拟器的话,需要先去了解它的端口号是什么,然后再去连接。MacOS 系统中连接模拟器不需要先执行 connect 命令,直接执行 </span><span style="color: green;"><span style="color: green;">adb kill-server &amp;&amp; adb devices</span></span><span style="color: green;"> 命令即可。</span></span></p>
    <h1 style="text-align: left; margin-bottom: 10px;">连接真机</h1>
    <p style="font-size: 18px; line-height: 40px; text-align: left; margin-bottom: 30px;"><span style="color: green;"><span style="color: green;">真机直接用 USB 连接到电脑,不需要执行 connect 命令。</span></span></p>
    <p style="font-size: 18px; line-height: 40px; text-align: left; margin-bottom: 30px;"><span style="color: green;"><span style="color: green;">直接用 </span><span style="color: green;"><span style="color: green;">adb devices</span></span><span style="color: green;"> 命令查看已经连接的设备列表即可。</span></span></p><span style="color: green;">hogwarts@</span> ~ % adb devices

    List of devices attached

    emulator-<span style="color: green;">5554</span> device<p style="font-size: 18px; line-height: 40px; text-align: left; margin-bottom: 30px;"><span style="color: green;"><span style="color: green;">直接命令后,如果设备已经成功连接,那么设备列表中就会展示已连接设备的信息。</span></span></p><span style="color: green;"><span style="color: green;">emualotr-5554:设备序列号</span></span><span style="color: green;"><span style="color: green;">device:设备连接状态为成功</span></span>
    <h1 style="text-align: left; margin-bottom: 10px;">安装卸载应用</h1>
    <p style="font-size: 18px; line-height: 40px; text-align: left; margin-bottom: 30px;"><span style="color: green;"><span style="color: green;">测试过程中,如果需要安装或者卸载应用,可以直接用 adb 命令来操作。</span></span></p><span style="color: green;"><span style="color: green;">普通安装:</span><span style="color: green;"><span style="color: green;">adb install &lt;apk路径&gt;</span></span></span><span style="color: green;"><span style="color: green;">覆盖安装:</span><span style="color: green;"><span style="color: green;">adb install -r &lt;apk路径&gt;</span></span></span><span style="color: green;"><span style="color: green;">完全卸载:</span><span style="color: green;"><span style="color: green;">adb uninstall &lt;包名&gt;</span></span></span><span style="color: green;"><span style="color: green;">保留配置文件:</span><span style="color: green;"><span style="color: green;">adb uninstall -k &lt;包名&gt;</span></span></span>
    <h1 style="text-align: left; margin-bottom: 10px;">设备与电脑传输文件</h1>
    <p style="font-size: 18px; line-height: 40px; text-align: left; margin-bottom: 30px;"><span style="color: green;"><span style="color: green;">adb 命令支持电脑和 Android 设备之间的文件互传。比如要提取 Android 设备中的日志文件到本地,就可以通过 adb 命令的方式来完成。</span></span></p><span style="color: green;"><span style="color: green;">从电脑上传文件至设备:</span><span style="color: green;"><span style="color: green;">adb push &lt;电脑路径&gt; &lt;设备路径&gt;</span></span></span><span style="color: green;"><span style="color: green;">从设备复制文件至电脑:</span><span style="color: green;"><span style="color: green;">adb pull &lt;设备路径&gt; &lt;电脑路径&gt;</span></span></span>
    <h1 style="text-align: left; margin-bottom: 10px;">日志</h1>
    <p style="font-size: 18px; line-height: 40px; text-align: left; margin-bottom: 30px;"><span style="color: green;"><span style="color: green;">打印链接设备的 log 信息</span></span></p><span style="color: green;"><span style="color: green;">屏幕输出日志:</span><span style="color: green;"><span style="color: green;">adb logcat</span></span></span><span style="color: green;"><span style="color: green;">通过标签过滤:</span><span style="color: green;"><span style="color: green;">adb logcat -s 标签</span></span></span><span style="color: green;"><span style="color: green;">显示时间:</span><span style="color: green;"><span style="color: green;">adb logcat -v time</span></span></span><span style="color: green;"><span style="color: green;">输出所有信息:</span><span style="color: green;"><span style="color: green;">adb logcat -v long</span></span></span><span style="color: green;"><span style="color: green;">输出日志到文件:</span><span style="color: green;"><span style="color: green;">adb logcat -v time &gt; log.txt</span></span></span><span style="color: green;"><span style="color: green;">清除缓存日志信息:</span><span style="color: green;"><span style="color: green;">adb logcat -c</span></span></span>
    <h1 style="text-align: left; margin-bottom: 10px;">adb shell 命令</h1>
    <p style="font-size: 18px; line-height: 40px; text-align: left; margin-bottom: 30px;"><span style="color: green;"><span style="color: green;">使用 adb shell 命令相当于远程登录了 Android 系统,可以进入 Android 设备的系统内部。进入系统内部既可以执行一些简单的 Linux 命令也支持很多特有的命令。</span></span></p>
    <p style="font-size: 18px; line-height: 40px; text-align: left; margin-bottom: 30px;"><span style="color: green;"><span style="color: green;">使用 adb shell 命令有两种方式。</span></span></p>
    <p style="font-size: 18px; line-height: 40px; text-align: left; margin-bottom: 30px;"><span style="color: green;"><span style="color: green;">一种是直接在 adb shell 后面跟上命令。</span></span></p>adb [-s serial_number] shell &lt;<span style="color: green;">command</span>&gt;<p style="font-size: 18px; line-height: 40px; text-align: left; margin-bottom: 30px;"><span style="color: green;"><span style="color: green;">比如:</span></span></p><span style="color: green;">hogwarts@</span> ~ % adb shell ls
    acct
    cache
    charger
    config
    d
    <span style="color: green;">data</span>
    <span style="color: green;">default</span>.prop
    dev
    etc
    ...<p style="font-size: 18px; line-height: 40px; text-align: left; margin-bottom: 30px;"><span style="color: green;"><span style="color: green;">另一种方式是在设备上启动交互式 shell</span></span></p><span style="color: green;">adb</span> <span style="color: green;">[-s serial_number]</span> <span style="color: green;">shell</span>
    <p style="font-size: 18px; line-height: 40px; text-align: left; margin-bottom: 30px;"><span style="color: green;"><span style="color: green;">进入 shell 之后,再执行对应的命令。</span></span></p>
    <p style="font-size: 18px; line-height: 40px; text-align: left; margin-bottom: 30px;"><span style="color: green;"><span style="color: green;">比如进入设备内部,可以查看设备内部的目录结构和内容</span></span></p><span style="color: green;">hogwarts@</span> ~ % adb shell
    <span style="color: green;">root@</span>x86:/ # ls
    acct
    cache
    charger
    config
    d
    <span style="color: green;">data</span>
    <span style="color: green;">default</span>.prop
    dev
    ...<p style="font-size: 18px; line-height: 40px; text-align: left; margin-bottom: 30px;"><span style="color: green;"><span style="color: green;">要退出交互式 shell,可以按 Ctrl + D 键或输入 exit。</span></span></p>
    <h1 style="text-align: left; margin-bottom: 10px;">Andriod常用测试命令</h1>
    <h1 style="text-align: left; margin-bottom: 10px;">设备截图 / 录屏</h1>
    <p style="font-size: 18px; line-height: 40px; text-align: left; margin-bottom: 30px;"><span style="color: green;"><span style="color: green;">在测试过程中,如果需要截图或者是录屏,也可以直接使用 adb 命令来完成。</span></span></p><span style="color: green;"><span style="color: green;">截图:</span><span style="color: green;"><span style="color: green;">adb shell screencap &lt;设备路径&gt;</span></span></span><span style="color: green;"><span style="color: green;">录屏:</span><span style="color: green;"><span style="color: green;">adb shell screenrecord &lt;设备路径&gt;</span></span></span>
    <h1 style="text-align: left; margin-bottom: 10px;">调用 Activity 管理器</h1>
    <p style="font-size: 18px; line-height: 40px; text-align: left; margin-bottom: 30px;"><span style="color: green;"><span style="color: green;">在 adb shell 中,可以使用 Activity 管理器 (am) 工具发出命令以执行各种系统操作,如启动 Activity、强行停止进程、修改设备屏幕属性,等等。</span></span></p>
    <p style="font-size: 18px; line-height: 40px; text-align: left; margin-bottom: 30px;"><span style="color: green;"><span style="color: green;">在测试过程中,如果需要启动 app 或者强制关闭 app,可以通过 adb 命令来实现。</span></span></p><span style="color: green;"><span style="color: green;">启动应用:</span><span style="color: green;"><span style="color: green;">adb shell am start -n &lt;包名&gt;/&lt;Activity名&gt;</span></span></span><span style="color: green;"><span style="color: green;">强制停止应用:</span><span style="color: green;"><span style="color: green;">adb shell am force-stop &lt;包名&gt;</span></span></span>
    <h1 style="text-align: left; margin-bottom: 10px;">调用软件包管理器</h1>
    <p style="font-size: 18px; line-height: 40px; text-align: left; margin-bottom: 30px;"><span style="color: green;"><span style="color: green;">在 adb shell 中,可以使用软件包管理器 (pm) 工具发出命令,以对设备上安装的应用软件包执行操作和查询。</span></span></p>
    <p style="font-size: 18px; line-height: 40px; text-align: left; margin-bottom: 30px;"><span style="color: green;"><span style="color: green;">如果需要查询设备里都安装了什么应用,就可以使用 </span><span style="color: green;"><span style="color: green;">adb shell pm list</span></span><span style="color: green;"> 来查看,还可以加上不同的参数去查看不同类型的应用。而且也可以通过 adb 命令来清除应用相关的数据。</span></span></p><span style="color: green;"><span style="color: green;">显示设备中安装的所有应用:</span><span style="color: green;"><span style="color: green;">adb shell pm list packages</span></span></span><span style="color: green;"><span style="color: green;">只显示系统应用:</span><span style="color: green;"><span style="color: green;">adb shell pm list packages -s</span></span></span><span style="color: green;"><span style="color: green;">只显示第三方应用:</span><span style="color: green;"><span style="color: green;">adb shell pm list packages -3</span></span></span><span style="color: green;"><span style="color: green;">删除与软件包关联的所有数据:</span><span style="color: green;"><span style="color: green;">adb shell pm clear &lt;包名&gt;</span></span></span>
    <h1 style="text-align: left; margin-bottom: 10px;">adb shell dumpsys</h1>
    <p style="font-size: 18px; line-height: 40px; text-align: left; margin-bottom: 30px;"><span style="color: green;"><span style="color: green;">dumpsys 是一种在 Android 设备上运行的工具,可提供有关系统服务的信息。可以使用 adb 从命令行调用 dumpsys,获取在连接的设备上运行的所有系统服务的诊断输出。</span></span></p>
    <p style="font-size: 18px; line-height: 40px; text-align: left; margin-bottom: 30px;"><span style="color: green;"><span style="color: green;">比如在测试中,如果需要通过 adb 命令启动 app,则需要知道 app 的包名和入口的 Activity 名。这个时候,就可以通过下面这条命令获取到这两个信息。</span></span></p>
    <p style="font-size: 18px; line-height: 40px; text-align: left; margin-bottom: 30px;"><span style="color: green;"><span style="color: green;">这个场景,需要先把要获取信息的应用启动,让它在前台运行,然后执行命令</span></span></p>
    <p style="font-size: 18px; line-height: 40px; text-align: left; margin-bottom: 30px;"><span style="color: green;"><span style="color: green;"><span style="color: green;">adb shell dumpsys activity | grep mFocusedActivity</span></span></span></p><span style="color: green;">hogwarts@</span> ~ % adb shell dumpsys activity | grep mFocusedActivity

    mFocusedActivity: ActivityRecord{<span style="color: green;">9</span>dae968 u0

    com.xueqiu.android/.common.MainActivity t139}<p style="font-size: 18px; line-height: 40px; text-align: left; margin-bottom: 30px;"><span style="color: green;"><span style="color: green;">下方的日志中就会展示出来当前的包名和 Activity 名称。</span></span></p><span style="color: green;"><span style="color: green;">包名:</span><span style="color: green;"><span style="color: green;">com.xueqiu.android</span></span></span><span style="color: green;"><span style="color: green;">Activity 名:</span><span style="color: green;"><span style="color: green;">.common.MainActivity</span></span></span>
    <h1 style="text-align: left; margin-bottom: 10px;">adb uiautomator</h1>
    <p style="font-size: 18px; line-height: 40px; text-align: left; margin-bottom: 30px;"><span style="color: green;"><span style="color: green;">adb 命令还支持直接获取应用的页面信息。这个页面信息包含了页面中元素的属性,可以方便做自动化测试的时候去定位元素。获取到的页面布局会输出到一个 xml 文件中。</span></span></p><span style="color: green;"><span style="color: green;">当前窗口的 UI 布局简化信息:</span><span style="color: green;"><span style="color: green;">adb shell uiautomator dump --compressed</span></span></span>hogwarts@ ~ % adb shell uiautomator <span style="color: green;">dump</span> <span style="color: green;">--compressed</span>

    UI hierchary dumped to: /sdcard/window_dump.xml<p style="font-size: 18px; line-height: 40px; text-align: left; margin-bottom: 30px;"><span style="color: green;"><span style="color: green;">不指定输出文件路径时,dump 下来的文件默认存储路径为 </span><span style="color: green;"><span style="color: green;">/sdcard/window_dump.xml</span></span></span></p>
    <p style="font-size: 18px; line-height: 40px; text-align: left; margin-bottom: 30px;"><span style="color: green;"><span style="color: green;">可以通过 adb pull 命令把文件传输到电脑中,然后用 uiautomatorviewer 工具打开查看布局。</span></span></p><span style="color: green;"><span style="color: green;">指定输出文件路径:</span><span style="color: green;"><span style="color: green;">adb shell uiautomator dump file &lt;设备路径&gt;</span></span></span>
    <p style="font-size: 18px; line-height: 40px; text-align: left; margin-bottom: 30px;">获取更多相关资料:</p>
    <p style="font-size: 18px; line-height: 40px; text-align: left; margin-bottom: 30px;">https://qrcode.ceba.ceshiren.com/link?name=article&amp;project_id=qrcode&amp;from=toutiao×tamp=1653615193&amp;author=MM</p>


页: [1]
查看完整版本: 技术分享 | App测试时常用的adb命令你都掌握了哪些呢?