Android自动化之-ADB与ADB shell常用命令

  • 2019 年 11 月 23 日
  • 笔记

针对移动端 Android 的测试, adb 命令是很重要的一个点,必须将常用的 adb 命令熟记于心, 将会为 Android 测试带来很大的方便,其中很多命令将会用于自动化测试的脚本当中。

目录:

  1. ADB原理
  2. ADB常用命令
  3. adb shell 命令
  • pm(包管理系列命令)
  • am 系列:控制应用
  • input 系列,向安卓设备发送按键事件
  • screencap截图录像系列
  • uiautomator 获取当前界面的控件信息
  • ime 输入法系列:
  • wm 获取设备分辨率
  • monkey :发送伪随机用户事件流
  • settings 更改系统设置中的参数

4. ADB查看设备信息–完整版

ADB原理:

adb 其实就是 Android Debug Bridge, Android 调试桥的缩写,adb 是一个 C/S 架构的命令行工具,ADB使用端口为 5037 :主要由 3 部分组成

1:运行在 PC 端的 Client : 可以通过它对 Android 应用进行安装、卸载及调试

  • Eclipse 中的 ADT、SDK Tools 目录下的 DDMS、Monitor 等工具,都是同样地用到了 adb 的功能来与 Android 设备进行交互。 PC 端的手机助手,诸如 360 手机助手、豌豆荚、应用宝等,其除了安装第三方应用方便,其他的功能,基本上都可以通过 adb 命令去完成,这里建议测试人员尽量不要在电脑上安装这类手机助手,因为其自带的 adb 程序可能会与 Android SDK 下的 adb 程序产生冲突,5037 端口被占用,导致使用 adb 命令时无法连接到设备

2:运行在 PC 端的 Service : 其管理客户端到 Android 设备上 adb 后台进程的连接

  • adb 服务启动后,Windows 可以在任务管理器中找到 adb.exe 这个进程

3:运行在 Android 设备上的 adb 后台进程

  • 执行 adb shell ps | grep adbd ,可以找到该后台进程,windows 请使用 findstr 替代 grep
  • Python adb shell ps | grep adbd root 23227 1 6672 832 ffffffff 00019bb4 S /sbin/adbd 1 2 adb shell ps | grep adbd root 23227 1 6672 832 ffffffff 00019bb4 S /sbin/adbd

ADB命令:

如果多设备需要单独控选定调试则:

Python

adb [-e | -d | -s <设备序列号>] <子命令>

1

adb [-e | -d | -s <设备序列号>] <子命令>

常用的命令:

  • adb devices , 获取设备列表及设备状态
  • adb get-state , 获取设备的状态:device:设备正常连接 offline:连接出现异常,设备无响应 unknown:没有连接设备
  • adb kill-server , adb start-server , 结束 adb 服务, 启动 adb 服务,通常两个命令一起用
  • adb install , 安装应用,覆盖安装是使用 -r 选项,安装中文为名的APK则需要使用另外的其他大牛修改的ADB软件,
  • adb uninstall , 卸载应用,后面跟的参数是应用的包名,请区别于 apk 文件名, -k 选项,卸载时保存数据和缓存目录
  • adb pull , 将 Android 设备上的文件或者文件夹复制到本地如下:

Python

adb pull sdcard/pull.txt d: <span class="n">adb</span> <span class="n">pull</span> <span class="n">sdcard</span><span class="o">/</span><span class="n">pull</span><span class="o">.</span><span class="na">txt</span> <span class="nl">d:</span><span class="err"></span><span class="n">rename</span><span class="o">.</span><span class="na">txt</span>

12

adb pull sdcard/pull.txt d:<span class="n">adb</span> <span class="n">pull</span> <span class="n">sdcard</span><span class="o">/</span><span class="n">pull</span><span class="o">.</span><span class="na">txt</span> <span class="nl">d:</span><span class="err"></span><span class="n">rename</span><span class="o">.</span><span class="na">txt</span>

注意权限,复制系统权限的目录下的文件,需要 root ,并且一般的 Android 机 root 之后并不能使用命令去复制,而需要在手机上使用类似于 RE 的文件浏览器,先对系统的文件系统进行挂载为可读写后,才能在手机上复制移动系统文件

  • adb push , 推送本地文件至 Android 设备

Python

adb push d:push.txt sdcard/

1

adb push d:push.txt sdcard/

  • adb reboot , 重启 Android 设备

Python

bootloader , 重启设备,进入 fastboot 模式,同 adb reboot-bootloader 命令 recovery , 重启设备,进入 recovery 模式,经常刷机的同学比较熟悉这个模式

12

bootloader , 重启设备,进入 fastboot 模式,同 adb reboot-bootloader 命令recovery , 重启设备,进入 recovery 模式,经常刷机的同学比较熟悉这个模式

  • adb forward , 将 宿主机上的某个端口重定向到设备的某个端口

Python

adb forward tcp:1314 tcp :8888

1

adb forward tcp:1314 tcp :8888

执行该命令后所有发往宿主机 1314 端口的消息、数据都会转发到 Android 设备的 8888 端口上,因此可以通过远程的方式控制 Android 设备。

  • adb connect 远程连接 Android 设备

adb shell 命令

adb 命令是 adb 这个程序自带的一些命令,而 adb shell 则是调用的 Android 系统中的命令,这些 Android 特有的命令都放在了 Android 设备的 system/bin 目录下

pm(包管理系列命令)可以用获取到一些安装在 Android 设备上得应用信息

直接运行 adb shell pm 可以获取到该命令的帮助信息

  • pm list package 列出安装在设备上的应用
  • adb shell pm list package(列出全部)
  • adb shell pm list package –s (列出系统应用)
  • adb shell pm list package –3(列出第三方应用)
  • adb shell pm list package –f(列出应用包名及对应的apk名及存放位置)
  • adb shell pm list package –i(命令最后增加 FILTER:过滤关键字,可以很方便地查找自己想要的应用如下)

Python

C:UsersAdministrator>adb shell pm list package -i ali package:com.aliyun.ams.tyid installer=null package:com.alicom.smartdail installer=com.meizu.mstore

123

C:UsersAdministrator>adb shell pm list package -i alipackage:com.aliyun.ams.tyid  installer=nullpackage:com.alicom.smartdail  installer=com.meizu.mstore

  • pm path 列出对应包名的 .apk 位置

Python

adb shell pm path com.tencent.mobileqq package:/data/app/com.tencent.mobileqq-1.apk

12

adb shell pm path com.tencent.mobileqqpackage:/data/app/com.tencent.mobileqq-1.apk

  • pm list instrumentation  列出含有单元测试 case 的应用,后面可跟参数 -f (与 pm list package 中一样),以及 [TARGET-PACKAGE]
  • pm dump , 后跟包名,列出指定应用的 dump 信息,里面有各种信息,自行查看
  • pm install , 安装Android 设备上APK应用(目标 apk 存放于 PC 端,请用 adb install 安装;目标 apk 存放于 Android 设备上,请用 pm install 安装)
  • pm uninstall , 卸载应用,同 adb uninstall , 后面跟的参数都是应用的包名
  • pm clear , 清除应用数据
  • pm set-install-location , pm get-install-location , 设置应用安装位置,获取应用安装位置
  • 如何通过adb 获取应用的版本号
  • windows: adb shell pm dump com.android.dialer | findstr “versionName” linux: adb shell pm dump com.android.dialer | grep “versionName”

am 系列:控制应用

  • adb shell am start –n com.android.camera/.Camera   启动相机
  • adb shell am start –S com.android.camera/.Camera  先停止目标应用,再启动
  • adb shell am start –W com.android.camera/.Camera  等待应用完成启动
  • adb shell am start –a android.intent.action.VIEW –d http://testerhome.com  启动默认浏览器打开一个网页
  • adb shell am start –a android.intent.action.CALL –d tel:10086  启动拨号器拨打 10086
  • am instrument , 启动一个 instrumentation , 单元测试或者 Robotium 会用到
  • am monitor , 监控 crash 与 ANR
  • am force-stop , 后跟包名,结束应用
  • am startservice , 启动一个服务
  • am broadcast , 发送一个广播

input 系列,向安卓设备发送按键事件

  • adb shell input text test123456  发送文本内容,不能发送中文
  • adb shell input keyevent KEYCODE_HOME  发送按键事件模拟按下 Home 键
  • adb shell input tap 500 500  对屏幕发送一个触摸事件
  • adb shell input swipe 900 500 100 500   对屏幕发送一个滑动事件

screencap截图录像系列:没有sd卡就在自带存储的根目录sdcard

  • adb shell screencap –p /sdcard/screen.png  截屏,保存至 sdcard 目录
  • adb shell screenrecord /sdcard/record.mp4  录制命令,执行命令后操作手机,ctrl + c 结束录制,录制结果保存至 sdcard

uiautomator 获取当前界面的控件信息:

  • adb shell uiautomator dump 获取控件信息默认放在 /storage/emulated/legacy/window_dump.xml

ime 输入法系列:

  • adb shell ime list –s  列出设备上的输入法
  • adb shell ime set com.baidu.input_mi/.ImeService   选择输入法

wm 获取设备分辨率

  • adb shell wm size   获取设备分辨率

monkey :发送伪随机用户事件流

它可以向系统发送伪随机(pseudo-random)的用户事件流(如按键输入、触摸屏输入、手势输入等),可以对待测的目标应用或整个 Android 系统进行压力测试。因此 Monkey 测试是一种为了测试软件的稳定性、健壮性的快速有效的方法

  • 完整资料:http://xuxu1988.com/2015/05/14/2015-05-02-Monkey/

settings 更改系统设置中的参数

  • adb shell settings get secure default_input_method  获取系统默认输入法
  • adb shell settings get secure default_input_method  默认为Appium使用中文输入时安装的输入法
  • adb shell settings put secure default_input_method com.sohu.inputmethod.sogouoem/.SogouIME   put命令更改默认输入法
  • adb shell settings get system screen_brightness_mode  获取亮度是否为自动获取
  • adb shell settings get system screen_brightness  获取亮度是否为自动获取
  • adb shell settings put system screen_brightness 150  更改亮度值(亮度值在0—255之间)

ADB查看设备信息–完整版

此部分参考:https://www.jianshu.com/p/811741a2ad97

注: 有部分命令的支持情况可能与 Android 系统版本及定制 ROM 的实现有关。

  • [查看设备信息]
    • [型号]
    • [电池状况]
    • [屏幕分辨率]
    • [屏幕密度]
    • [显示屏参数]
    • [android_id]
    • [IMEI]
    • [Android 系统版本]
    • [IP 地址]
    • [Mac 地址]
    • [CPU 信息]
    • [内存信息]
    • [更多硬件与系统属性]

查看设备信息

型号 :

Python

adb shell getprop ro.product.model

1

adb shell getprop ro.product.model

输出示例:

Python

Nexus 5

12

Nexus 5

电池状况

Python

adb shell dumpsys battery

1

adb shell dumpsys battery

输入示例:

Python

Current Battery Service state: AC powered: false USB powered: true Wireless powered: false status: 2 health: 2 present: true level: 44 scale: 100 voltage: 3872 temperature: 280 technology: Li-poly

123456789101112

Current Battery Service state:  AC powered: false  USB powered: true  Wireless powered: false  status: 2  health: 2  present: true  level: 44  scale: 100  voltage: 3872  temperature: 280  technology: Li-poly

其中 scale 代表最大电量,level 代表当前电量。上面的输出表示还剩下 44% 的电量。

屏幕分辨率

Python

adb shell wm size

1

adb shell wm size

输出示例:

Python

Physical size: 1080×1920

1

Physical size: 1080×1920

该设备屏幕分辨率为 1080px * 1920px。

如果使用命令修改过,那输出可能是:

Python

Physical size: 1080×1920 Override size: 480×1024

12

Physical size: 1080x1920Override size: 480×1024

表明设备的屏幕分辨率原本是 1080px * 1920px,当前被修改为 480px * 1024px。

屏幕密度

Python

adb shell wm density

1

adb shell wm density

输出示例:

Python

Physical density: 420

1

Physical density: 420

该设备屏幕密度为 420dpi。

如果使用命令修改过,那输出可能是:

Python

Physical density: 480 Override density: 160

12

Physical density: 480Override density: 160

表明设备的屏幕密度原来是 480dpi,当前被修改为 160dpi。

显示屏参数

Python

adb shell dumpsys window displays

1

adb shell dumpsys window displays

输出示例:

Python

WINDOW MANAGER DISPLAY CONTENTS (dumpsys window displays) Display: mDisplayId=0 init=1080×1920 420dpi cur=1080×1920 app=1080×1794 rng=1080×1017-1810×1731 deferred=false layoutNeeded=false

1234

WINDOW MANAGER DISPLAY CONTENTS (dumpsys window displays)  Display: mDisplayId=0    init=1080×1920 420dpi cur=1080×1920 app=1080×1794 rng=1080×1017-1810×1731    deferred=false layoutNeeded=false

其中 mDisplayId 为 显示屏编号,init 是初始分辨率和屏幕密度,app 的高度比 init 里的要小,表示屏幕底部有虚拟按键,高度为 1920 – 1794 = 126px 合 42dp。

android_id

Python

adb shell settings get secure android_id

1

adb shell settings get secure android_id

输出示例:

Python

51b6be48bac8c569

12

51b6be48bac8c569

IMEI

在 Android 4.4 及以下版本可通过如下命令获取 IMEI:

Python

adb shell dumpsys iphonesubinfo

1

adb shell dumpsys iphonesubinfo

输出示例:

Python

Phone Subscriber Info: Phone Type = GSM Device ID = 860955027785041

123

Phone Subscriber Info:  Phone Type = GSM  Device ID = 860955027785041

其中的 Device ID 就是 IMEI。

而在 Android 5.0 及以上版本里这个命令输出为空,得通过其它方式获取了(需要 root 权限):

Python

adb shell su service call iphonesubinfo 1

123

adb shellsuservice call iphonesubinfo 1

输出示例:

Python

Result: Parcel( 0x00000000: 00000000 0000000f 00360038 00390030 '……..8.6.0.9.' 0x00000010: 00350035 00320030 00370037 00350038 '5.5.0.2.7.7.8.5.' 0x00000020: 00340030 00000031 '0.4.1… ')

1234

Result: Parcel(  0x00000000: 00000000 0000000f 00360038 00390030 '……..8.6.0.9.'  0x00000010: 00350035 00320030 00370037 00350038 '5.5.0.2.7.7.8.5.'  0x00000020: 00340030 00000031                   '0.4.1…        ')

把里面的有效内容提取出来就是 IMEI 了,比如这里的是 860955027785041

参考:adb shell dumpsys iphonesubinfo not working since Android 5.0 Lollipop

Android 系统版本

命令:

Python

adb shell getprop ro.build.version.release

1

adb shell getprop ro.build.version.release

输出示例:

Python

5<span class="hljs-selector-class">.0</span><span class="hljs-selector-class">.2</span>

12

5<span class="hljs-selector-class">.0</span><span class="hljs-selector-class">.2</span>

IP 地址

每次想知道设备的 IP 地址的时候都得“设置”-“关于手机”-“状态信息”-“IP地址”很烦对不对?通过 adb 可以方便地查看。

Python

adb shell ifconfig | grep Mask

1

adb shell ifconfig | grep Mask

输出示例:

Python

inet addr:10.130.245.230 Mask:255.255.255.252 inet addr:127.0.0.1 Mask:255.0.0.0

12

inet addr:10.130.245.230  Mask:255.255.255.252inet addr:127.0.0.1  Mask:255.0.0.0

那么 10.130.245.230 就是设备 IP 地址。

在有的设备上这个命令没有输出,如果设备连着 WiFi,可以使用如下命令来查看局域网 IP:

Python

adb shell ifconfig wlan0

1

adb shell ifconfig wlan0

输出示例:

Python

wlan0: ip 10.129.160.99 mask 255.255.240.0 flags [up broadcast running multicast]

1

wlan0: ip 10.129.160.99 mask 255.255.240.0 flags [up broadcast running multicast]

Python

wlan0 Link encap:UNSPEC inet addr:10.129.168.57 Bcast:10.129.175.255 Mask:255.255.240.0 inet6 addr: fe80::66cc:2eff:fe68:b6b6/64 Scope: Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:496520 errors:0 dropped:0 overruns:0 frame:0 TX packets:68215 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:3000 RX bytes:116266821 TX bytes:8311736

12345678

wlan0     Link encap:UNSPEC          inet addr:10.129.168.57  Bcast:10.129.175.255  Mask:255.255.240.0          inet6 addr: fe80::66cc:2eff:fe68:b6b6/64 Scope: Link          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1          RX packets:496520 errors:0 dropped:0 overruns:0 frame:0          TX packets:68215 errors:0 dropped:0 overruns:0 carrier:0          collisions:0 txqueuelen:3000          RX bytes:116266821 TX bytes:8311736

如果以上命令仍然不能得到期望的信息,那可以试试以下命令(部分系统版本里可用):

Python

adb shell netcfg

1

adb shell netcfg

输出示例:

Python

wlan0 UP 10.129.160.99/20 0x00001043 f8:a9:d0:17:42:4d lo UP 127.0.0.1/8 0x00000049 00:00:00:00:00:00 p2p0 UP 0.0.0.0/0 0x00001003 fa:a9:d0:17:42:4d sit0 DOWN 0.0.0.0/0 0x00000080 00:00:00:00:00:00 rmnet0 DOWN 0.0.0.0/0 0x00000000 00:00:00:00:00:00

12345

wlan0    UP                               10.129.160.99/20  0x00001043 f8:a9:d0:17:42:4dlo       UP                                   127.0.0.1/8   0x00000049 00:00:00:00:00:00p2p0     UP                                     0.0.0.0/0   0x00001003 fa:a9:d0:17:42:4dsit0     DOWN                                   0.0.0.0/0   0x00000080 00:00:00:00:00:00rmnet0   DOWN                                   0.0.0.0/0   0x00000000 00:00:00:00:00:00

可以看到网络连接名称、启用状态、IP 地址和 Mac 地址等信息。

Mac 地址

Python

adb shell cat /sys/class/net/wlan0/address

1

adb shell cat /sys/class/net/wlan0/address

输出示例:

Python

f8:a9:d0:17:42:4d

1

f8:a9:d0:17:42:4d

这查看的是局域网 Mac 地址,移动网络或其它连接的信息可以通过前面的小节“IP 地址”里提到的 adb shell netcfg 命令来查看。

CPU 信息

Python

adb shell cat /proc/cpuinfo

1

adb shell cat /proc/cpuinfo

输出示例:

Python

Processor : ARMv7 Processor rev 0 (v7l) processor : 0 BogoMIPS : 38.40 processor : 1 BogoMIPS : 38.40 processor : 2 BogoMIPS : 38.40 processor : 3 BogoMIPS : 38.40 Features : swp half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt CPU implementer : 0x51 CPU architecture: 7 CPU variant : 0x2 CPU part : 0x06f CPU revision : 0 Hardware : Qualcomm MSM 8974 HAMMERHEAD (Flattened Device Tree) Revision : 000b Serial : 0000000000000000

1234567891011121314151617181920212223

Processor       : ARMv7 Processor rev 0 (v7l)processor       : 0BogoMIPS        : 38.40 processor       : 1BogoMIPS        : 38.40 processor       : 2BogoMIPS        : 38.40 processor       : 3BogoMIPS        : 38.40 Features        : swp half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivtCPU implementer : 0x51CPU architecture: 7CPU variant     : 0x2CPU part        : 0x06fCPU revision    : 0 Hardware        : Qualcomm MSM 8974 HAMMERHEAD (Flattened Device Tree)Revision        : 000bSerial          : 0000000000000000

这是 Nexus 5 的 CPU 信息,我们从输出里可以看到使用的硬件是 Qualcomm MSM 8974,processor 的编号是 0 到 3,所以它是四核的,采用的架构是 ARMv7 Processor rev 0 (v71)

内存信息

Python

adb shell cat /proc/meminfo

1

adb shell cat /proc/meminfo

输出示例:

Python

MemTotal: 1027424 kB MemFree: 486564 kB Buffers: 15224 kB Cached: 72464 kB SwapCached: 24152 kB …

123456

MemTotal:        1027424 kBMemFree:          486564 kBBuffers:           15224 kBCached:            72464 kBSwapCached:        24152 kB…

其中,MemTotal 就是设备的总内存,MemFree 是当前空闲内存。

更多硬件与系统属性

设备的更多硬件与系统属性可以通过如下命令查看:

Python

adb shell cat /system/build.prop

1

adb shell cat /system/build.prop

这会输出很多信息,包括前面几个小节提到的“型号”和“Android 系统版本”等。

输出里还包括一些其它有用的信息,它们也可通过 adb shell getprop <属性名> 命令单独查看,列举一部分属性如下:

属性名

含义

ro.build.version.sdk

SDK 版本

ro.build.version.release

Android 系统版本

ro.build.version.security_patch

Android 安全补丁程序级别

ro.product.model

型号

ro.product.brand

品牌

ro.product.name

设备名

ro.product.board

处理器型号

ro.product.cpu.abilist

CPU 支持的 abi 列表[节注一]

persist.sys.isUsbOtgEnabled

是否支持 OTG

dalvik.vm.heapsize

每个应用程序的内存上限

ro.sf.lcd_density

屏幕密度

节注一:

一些小厂定制的 ROM 可能修改过 CPU 支持的 abi 列表的属性名,如果用 ro.product.cpu.abilist 属性名查找不到,可以这样试试:

Python

adb shell cat /system/build.prop | grep ro.product.cpu.abi

1

adb shell cat /system/build.prop | grep ro.product.cpu.abi

示例输出:

Python

ro.product.cpu.abi=armeabi-v7a ro.product.cpu.abi2=armeabi

12

ro.product.cpu.abi=armeabi-v7aro.product.cpu.abi2=armeabi

Python

1

原创文章,转载请注明: 转载自URl-team

本文链接地址: Android自动化之-ADB与ADB shell常用命令