Android自动化之-ADB与ADB shell常用命令
- 2019 年 11 月 23 日
- 筆記
针对移动端 Android 的测试, adb 命令是很重要的一个点,必须将常用的 adb 命令熟记于心, 将会为 Android 测试带来很大的方便,其中很多命令将会用于自动化测试的脚本当中。
目录:
- ADB原理
- ADB常用命令
- 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常用命令