Android常⽤adb命令总结
针对移动端 Android 的测试, adb 命令是很重要的⼀个点,必须将常⽤的 adb 命令熟记于⼼,将会为 Android 测试带来很⼤的⽅便,其中很多命令将会⽤于⾃动化测试的脚本当中。
Android Debug Bridge
adb 其实就是Android Debug Bridge, Android 调试桥的缩写,adb 是⼀个C/S架构的命令⾏⼯具,主要由 3 部分组成:运⾏在 PC 端的 Client : 可以通过它对 Android 应⽤进⾏安装、卸载及调试
Eclipse 中的 ADT、SDK Tools ⽬录下的 DDMS、Monitor 等⼯具,都是同样地⽤到了 adb 的功能来与 Android 设备进⾏
交互。
PC 端的⼿机助⼿,诸如 360 ⼿机助⼿、豌⾖荚、应⽤宝等,其除了安装第三⽅应⽤⽅便,其他的功能,基本上都可以通
过 adb 命令去完成,这⾥建议测试⼈员尽量不要在电脑上安装这类⼿机助⼿,因为其⾃带的 adb 程序可能会与 Android SDK
下的 adb 程序产⽣冲突,5037端⼝被占⽤,导致使⽤ adb 命令时⽆法连接到设备
运⾏在 PC 端的 Service : 其管理客户端到 Android 设备上 adb 后台进程的连接
adb 服务启动后,Windows 可以在任务管理器中到 这个进程
运⾏在 Android 设备上的 adb 后台进程
执⾏adb shell ps | grep adbd,可以到该后台进程,windows 请使⽤findstr替代 grep
[xuxu:~]$ adb shell ps | grep adbd
root 23227 1 6672 832 ffffffff 00019bb4 S /sbin/adbd
这⾥注意⼀个地⽅,就是 adb 使⽤的端⼝号,5037,有必要记⼀下
接下来我将 adb 命令分为三部分进⾏介绍,adb 命令、adb shell 命令、linux 命令
adb 命令
在开发或者测试的过程中,我们可以通过 adb 来管理多台设备,其⼀般的格式为:
adb [-e | -d | -s <;设备序列号>] <⼦命令>
在配好环境变量的前提下,在命令窗⼝当中输⼊ adb help 或者直接输⼊ adb ,将会列出所有的选项说明及⼦命令。
这⾥介绍⼀些⾥⾯常⽤的命令:
adb devices , 获取设备列表及设备状态
[xuxu:~]$ adb devices
List of devices attached
44c826a0 device
adb get-state , 获取设备的状态
[xuxu:~]$ adb get-state
device
设备的状态有 3 钟,device , offline , unknown
device:设备正常连接
offline:连接出现异常,设备⽆响应
unknown:没有连接设备
adb kill-server , adb start-server , 结束 adb 服务,启动 adb 服务,通常两个命令⼀起⽤
⼀般在连接出现异常,使⽤ adb devices 未正常列出设备,设备状态异常时使⽤ kill-server,然后运⾏ start-server 进⾏重
启服务
adb logcat , 打印 Android 的系统⽇志,这个可以单独拿出来讲
adb bugreport , 打印dumpsys、dumpstate、logcat的输出,也是⽤于分析错误
输出⽐较多,建议重定向到⼀个⽂件中
adb bugreport > d:\bugreport.log
adb install , 安装应⽤,覆盖安装是使⽤ -r 选项
windows 下如果需要安装含有中⽂名的 apk ,需要对 adb 进⾏修改,百度可以到做出修改的adb , ⽀持中⽂命令的
apk,请⾃⾏搜索
adb uninstall , 卸载应⽤,后⾯跟的参数是应⽤的包名,请区别于apk ⽂件名
'-k' means keep the data and cache directories , -k 选项,卸载时保存数据和缓存⽬录
adb pull , 将 Android 设备上的⽂件或者⽂件夹复制到本地
例如复制 Sdcard 下的 ⽂件到 D 盘:
adb pull d:\
如果需要重命名为 :
adb pull d:\
注意权限,复制系统权限的⽬录下的⽂件,需要 root ,并且⼀般的 Android 机 root 之后并不能使⽤命令去复制,⽽需要在
⼿机上使⽤类似于 RE 的⽂件浏览器,先对系统的⽂件系统进⾏挂载为可读写后,才能在⼿机上复制移动系统⽂件,这⾥
推荐使⽤⼩⽶⼿机的开发版本,IUNI 也是不错滴~~
adb push , 推送本地⽂件⾄ Android 设备
例如推送 D 盘下的 ⾄ Sdcard:
adb push d:\ sdcard/
sdcard 后⾯的斜杠不能少,否则会出现下⾯的错误:
[xuxu:~]$ adb sdcard
failed to copy '' to 'sdcard': Is a directory
权限问题同 pull 命令
adb root , adb remount, 只针对类似⼩⽶开发版的⼿机有⽤,可以直接已这两个命令获取 root 权限,并挂载系统⽂件系统为可读写状态adb reboot , 重启 Android 设备
bootloader , 重启设备,进⼊ fastboot 模式,同 adb reboot-bootloader 命令
recovery , 重启设备,进⼊ recovery 模式,经常刷机的同学⽐较熟悉这个模式
adb forward , 将宿主机上的某个端⼝重定向到设备的某个端⼝
adb forward tcp:1314 tcp :8888
执⾏该命令后所有发往宿主机 1314 端⼝的消息、数据都会转发到 Android 设备的 8888 端⼝上,因此可以通过远程的⽅式控制Android 设备。
adb connect 远程连接 Android 设备
⼿机、PC处于相同的⽹络下,⼿机 root ,安装应⽤ adbWireless ,启动应⽤后点击界⾯中间的按钮:
接着运⾏adb connect 192.168.1.102 , 即可通过⽆线的⽅式连接⼿机,缺点是速度⽐较慢
adb shell 命令
有⼈问过我,为什么会知道这么多的命令,答案就是我⽐较爱折腾,这⾥⼤家先要了解我为什么要区
分 adb 命令和 adb shell 命令。
简单点讲,adb 命令是 adb 这个程序⾃带的⼀些命令,⽽ adb shell 则是调⽤的 Android 系统中的命令,这些 Android 特有的命令都放在了Android 设备的 system/bin ⽬录下,例如我再命令⾏中敲这样⼀个命令:
[xuxu:~]$ adb shell hehe
/system/bin/sh: hehe: not found
很明显,在 bin ⽬录下并不存在这个命令。
⾃⼰爱折腾,想看看有哪些命令,也不想去⽂档,于是就启动模拟器,将整个system/bin⽬录复制了出来,然后⼀个⼀个的去试。。囧~~
打开这些⽂件就可以发现,⾥⾯有些命令其实是⼀个 shell 脚本,例如打开 monkey ⽂件:
# Script to start "monkey" on the device, which has a very rudimentary
# shell.
#
base=/system
export CLASSPATH=$base/framework/monkey.jar
trap "" HUP
exec app_process $base/bin key.Monkey $*
再⽐如打开 am:
#!/system/bin/sh
#
# Script to start "am" on the device, which has a very rudimentary
# shell.
#
base=/system
export CLASSPATH=$base/framework/am.jar
exec app_process $base/bin com.androidmands.am.Am "$@"
还有 SDK sources/android-20/com/android/commands ⽬录下:
[xuxu:...oid-20/com/android/commands]$ pwd
/Users/xuxu/utils/android/android-sdk-macosx/sources/android-20/com/android/commands
[xuxu:...oid-20/com/android/commands]$ ll
total 0
drwxr-xr-x 3 xuxu staff 102B 4 2 10:57 am
drwxr-xr-x 3 xuxu staff 102B 4 2 10:57 bmgr
drwxr-xr-x 3 xuxu staff 102B 4 2 10:57 bu
drwxr-xr-x 3 xuxu staff 102B 4 2 10:57 content
drwxr-xr-x 3 xuxu staff 102B 4 2 10:57 ime
drwxr-xr-x 3 xuxu staff 102B 4 2 10:57 input
drwxr-xr-x 3 xuxu staff 102B 4 2 10:57 media
drwxr-xr-x 3 xuxu staff 102B 4 2 10:57 pm
drwxr-xr-x 3 xuxu staff 102B 4 2 10:57 requestsync
drwxr-xr-x 3 xuxu staff 102B 4 2 10:57 settings
drwxr-xr-x 7 xuxu staff 238B 4 2 10:57 svc
drwxr-xr-x 6 xuxu staff 204B 4 2 10:57 uiautomator
drwxr-xr-x 3 xuxu staff 102B 4 2 10:57 wm
有没有熟悉的命令? am 、pm、uiautomator ...
下⾯介绍⼀些常⽤的 adb shell 命令(其中pm、am 命令⽐较庞⼤,使⽤四级标题)
pm
Package Manager , 可以⽤获取到⼀些安装在 Android 设备上得应⽤信息
pm 的源码 , 直接运⾏ adb shell pm 可以获取到该命令的帮助信息
pm list package 列出安装在设备上的应⽤
不带任何选项:列出所有的应⽤的包名(不知道怎么应⽤的包名的同学看这⾥)adb shell pm list package
-s:列出系统应⽤
adb shell pm list package -s
-3:列出第三⽅应⽤
adb shell pm list package -3
-f:列出应⽤包名及对应的apk名及存放位置
adb shell pm list package -f
-i:列出应⽤包名及其安装来源,结果显⽰例⼦:
package:com.zhihu.android installer=com.xiaomi.market
adb shell pm list package -i
命令最后增加 FILTER:过滤关键字,可以很⽅便地查⾃⼰想要的应⽤参数组合使⽤,例如,查三⽅应⽤中知乎的包名、apk存放位置、安装来源:
[xuxu:~]$ adb shell pm list package -f -3 -i zhihu
package:/data/app/com.zhihu.android-1.apk=com.zhihu.android installer=com.xiaomi.market
pm path 列出对应包名的 .apk 位置
[xuxu:~]$ adb shell pm t.mobileqq
package:/data/t.mobileqq-1.apk
pm list instrumentation , 列出含有单元测试 case 的应⽤,后⾯可跟参数 -f (与 pm list package 中⼀样),以及 [TARGET-PACKAGE]
pm dump , 后跟包名,列出指定应⽤的 dump 信息,⾥⾯有各种信息,⾃⾏查看
adb shell pm t.mobileqq
Packages:
Package [bileqq] (4397f810):
userId=10091 gids=[3003, 3002, 3001, 1028, 1015]
pkg=Package{t.mobileqq}
codePath=/data/t.mobileqq-1.apk
resourcePath=/data/t.mobileqq-1.apk
nativeLibraryPath=/data/t.mobileqq-1
versionCode=242 targetSdk=9
versionName=5.6.0
applicationInfo=ApplicationInfo{t.mobileqq}
flags=[ HAS_CODE ALLOW_CLEAR_USER_DATA ]
dataDir=/data/t.mobileqq
supportsScreens=[small, medium, large, xlarge, resizeable, anyDensity]
usesOptionalLibraries:
timeStamp=2015-05-13 14:04:24
手机unknown是什么意思firstInstallTime=2015-04-03 20:50:07
lastUpdateTime=2015-05-13 14:05:02
installerPackageName=com.xiaomi.market
signatures=PackageSignatures{4397f8d8 [43980488]}
permissionsFixed=true haveGids=true installStatus=1
pkgFlags=[ HAS_CODE ALLOW_CLEAR_USER_DATA ]
User 0: installed=true blocked=false stopped=false notLaunched=false enabled=0
grantedPermissions:
android.permission.CHANGE_WIFI_MULTICAST_STATE
pm install , 安装应⽤
⽬标 apk 存放于 PC 端,请⽤ adb install 安装
⽬标 apk 存放于 Android 设备上,请⽤ pm install 安装
pm uninstall , 卸载应⽤,同 adb uninstall , 后⾯跟的参数都是应⽤的包名
pm clear , 清除应⽤数据
pm set-install-location , pm get-install-location , 设置应⽤安装位置,获取应⽤安装位置
[0/auto]:默认为⾃动
[1/internal]:默认为安装在⼿机内部
[2/external]:默认安装在外部存储
am
⼜是⼀个庞⼤的命令。。。
am 源码
am start , 启动⼀个 Activity,已启动系统相机应⽤为例
启动相机
[xuxu:~]$ adb shell am start -n com.android.camera/.Camera
Starting: Intent { cmp=com.android.camera/.Camera }
先停⽌⽬标应⽤,再启动
[xuxu:~]$ adb shell am start -S com.android.camera/.Camera
Stopping: com.android.camera
Starting: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=com.android.camera/.Camera }等待应⽤完成启动
[xuxu:~]$ adb shell am start -W com.android.camera/.Camera
Starting: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=com.android.camera/.Camera } Status: ok
Activity: com.android.camera/.Camera
ThisTime: 500
TotalTime: 500
Complete
启动默认浏览器打开⼀个⽹页
[xuxu:~]$ adb shell am start -a android.intent.action.VIEW -d testerhome
Starting: Intent { act=android.intent.action.VIEW dat=testerhome }
启动拨号器拨打 10086
[xuxu:~]$ adb shell am start -a android.intent.action.CALL -d tel:10086
Starting: Intent { act=android.intent.action.CALL dat=tel:xxxxx }
am instrument , 启动⼀个 instrumentation , 单元测试或者 Robotium 会⽤到
am monitor , 监控 crash 与 ANR
[xuxu:~]$ adb shell am monitor
Monitoring available commands:
(q)uit: finish monitoring
** Activity starting: com.android.camera
am force-stop , 后跟包名,结束应⽤
am startservice , 启动⼀个服务
am broadcast , 发送⼀个⼴播
还有很多的选项,⾃⼰多多发掘~~
input
这个命令可以向 Android 设备发送按键事件,其源码
input text , 发送⽂本内容,不能发送中⽂
adb shell input text test123456
前提先将键盘设置为英⽂键盘
input keyevent , 发送按键事件,
adb shell input keyevent KEYCODE_HOME
模拟按下 Home 键,源码⾥⾯有定义:
public static final int KEYCODE_HOME = 3;
因此可以将命令中的KEYCODE_HOME替换为3
input tap , 对屏幕发送⼀个触摸事件
adb shell input tap 500 500
点击屏幕上坐标为 500 500 的位置
input swipe , 滑动事件
adb shell input swipe 900 500 100 500
从右往左滑动屏幕
如果版本不低于 4.4 , 可以模拟长按事件
adb shell input swipe 500 500 501 501 2000
其实就是在⼩的距离内,在较长的持续时间内进⾏滑动,最后表现出来的结果就是长按动作
到这⾥会发现,MonkeyRunner 能做到的事情,通过 adb 命令都可以做得到,如果进⾏封装,会⽐ MR 做得更好。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论