Android Debug Bridge
adb其实就是Android Debug Bridge,Android调试桥的缩写,adb是一个C/S架构的命令行工具,主要由3部分组成:
(1)运行在PC端的Client:可以通过它对Android应用进行安装、卸载及调试。
1.Eclipse中的ADT、SDK Tools目录下的DDMS、Monitor等工具,都是同样地用到了adb的功能来与Android设备进行交互。
2.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 adb ,可以找到该后台进程,windows请使用findstr替代grep
这里注意,adb使用的端口号,5037。
adb命令
在开发者测试的过程中,我们可以通过adb来管理多台设备,其一般的格式为:
adb[-e|-d|-s<设备序列号>]<子命令>
在配好环境变量的前提下,在命令窗口当中输入adb help或者直接输入adb,将会列出所有的选项说明及子命令。
一些常用的命令:
adb devices:获取设备列表及设备状态
adb get-state:获取设备的状态。设备的状态有三种,分别为device,office,unknown
-
device:设备正常连接
-
offline:连接出现异常,设备无响应
unknown:没有连接设备
adb kill-server,adb start-server,结束adb服务和启动adb服务,通常两个命令一起用。一般在连接出现异常,使用adb devices来正常列出设备,设备状态异常时使用kill-server,ranhou yunxing start-server进行重启服务
adb logcat,打印Android的系统日志,以后单独讲。------------------(1)
adb bugreport,打印 dumpsys、dumpstate、logcat的输出,也是用于分析错误,输出比较多,建议重定向到一个文件中。
adb bugreport >d:\bugreport.log
adb install,安装应用,覆盖安装是使用-r选项。windows下乳沟需要安装含有中文名的apk,需要对adb进行修改,百度可以找到做出修改的adb,支持中文命令的apk。-------------------------(2)
adb uninstall,卸载应用,后面跟的参数是应用的包名,区别于apk文件名
adb uninstall -k ,卸载时保存数据和缓存目录
adb pull,将Android 设备上的文件或者文件夹复制到本,例如复制sdcard下的pull.txt文件到D盘:
adb pull sdcard/pull.txt d:\
如果需要重命名为rename.txt,则为:
adb pull sdcard/pull.txt d:\rename.txt
注意权限,复制系统权限的目录下的文件需要root,并且一般的Android机root后并不能使用命令去复制,而需要在手机上使用类似于RE的文件浏览器,先对系统的文件系统进行挂载为可读写后,才能在手机上复制移动系统文件,这里推荐使用小米手机的开发版本,IUNI也不错。
adb push,推送本地文件至Android设备,例如推送D盘下的push.txt至SDcard:
adb push d:\push.txt sdcard/
sdcard后面的斜杠不能少,否则会出现下面的错误:
failed to copy 'push.txt' 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 top:1314 top: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目录下。
pm
Package Manager,可以用来获取到一些安装在Android设备上的应用信息
pm的源码pm.java-------(3),直接运行adb shell pm 可以获取到该命令的帮助信息
pm list package列出安装再设备上的应用:
1)不带任何选项:列出所有的应用的包名:
adb shell pm list package
2)-s:列出系统应用
adb shell pm list package -s
3)-3:列出第三方应用
adb shell pm list package -3
4)-f:列出应用包名及对应的apk名及存放位置
adb shell pm list package -f
5)-i:列出应用包名及其安装来源
adb shell pm list package -i
例如:package:com.zhihu.android installer=com.xiaomi.market
6)参数组合使用,例如查找三方应用中知乎的包名、apk存放位置、安装来源:
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位置:
adb shell pm path com.tencent.mobileqq
package:/data/app/com.tencent.mobileqq-1.apk
pm list instrumentation,列出含有单元测试case的应用,后面可跟参数-f(与pm list package中的一样),以及[TARGET-PACKAGE]
pm dump,后跟包名,列出指定应用的dump信息,里面有各种信息:
adb shell pm dump com.tencent.mobileqq
Packages: Package [com.tencent.mobileqq] (4397f810): userId=10091 gids=[3003, 3002, 3001, 1028, 1015] pkg=Package{43851660 com.tencent.mobileqq} codePath=/data/app/com.tencent.mobileqq-1.apk resourcePath=/data/app/com.tencent.mobileqq-1.apk nativeLibraryPath=/data/app-lib/com.tencent.mobileqq-1 versionCode=242 targetSdk=9 versionName=5.6.0 applicationInfo=ApplicationInfo{43842cc8 com.tencent.mobileqq} flags=[ HAS_CODE ALLOW_CLEAR_USER_DATA ] dataDir=/data/data/com.tencent.mobileqq supportsScreens=[small, medium, large, xlarge, resizeable, anyDensity] usesOptionalLibraries: com.google.android.media.effects com.motorola.hardware.frontcamera timeStamp=2015-05-13 14:04:24 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 com.tencent.qav.permission.broadcast com.tencent.photos.permission.DATA com.tencent.wifisdk.permission.disconnect
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.java----------(4)
am start,启动一个Activity,以启动系统相机应用为例:
1)启动相机:
adb shell am start -n com.android.camera/.Camera
Starting: Intent { cmp=com.android.camera/.Camera }
2)先停止目标应用,再启动:
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 }
3)等待应用完成启动:
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
4)启动默认C页:
adb shell am start -a android.intent.action.VIEW -d http://testerhome.com
Starting: Intent { act=android.intent.action.VIEW dat=http://testerhome.com
5)启动拨号器拨打10086
adb shell am start -a android.intent.action.CALL -d tel:10086
Starting: Intent { act=android.intent.action.CALL dat=tel:xxxxx }
am instrument,启动一个instrumention,单元测试或者Robotium会用到
am monitor,监控crash与ANR
adb shell am monitor
Monitoring activity manager... available commands: (q)uit: finish monitoring ** Activity starting: com.android.camera
am force-stop,后跟包名,结束应用
am startsevice,启动一个服务
am broadcast,发送一个广播
input
这个命令可以向Android设备发送按键事件,源码为Input.java------(6)
input text,发送文本内容,不能发送中文,前提先将键盘设置为英文键盘:
adb shell input text test123456
input keyevent,发送按键事件,KeyEvent.java ------------(7)
adb shell input keyevent KEYCODE_HOME
以上为模拟按下Home键,源码里面有定义:
public static final int KEYCODE_HOME=3
因此可以将命令中的KEYCODE_HOME 替换为3
adb shell input keyvent 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 做得更好。
screencap
截图命令,截屏,保存至sdcard目录:
adb shell screencap -p /sdcard/screen.png
screenrecord
4.4新增的录制命令:
adb shell screenrecord sdcard/record.mp4
执行命令后操作手机,crtl+c结束录制,录制结果保存至sdcard
uiautomator
执行UI automation tests,获取当前界面的控件信息。
runtest:executes UI automation tests,RunTestCommand.java --------------(8)
dump:获取控件信息:DumpCommand.java -------------------(9)
adb shell uiautomator dump
UI hierchary dumped to: /storage/emulated/legacy/window_dump.xml
不加[file]选项时,默认存放在sdcard下
ime
输入法,Ime.java-------------------(10)
列出设备上的输入法:
adb shell ime list -s
com.google.android.inputmethod.pinyin/.PinyinIME com.baidu.input_mi/.ImeService
选择输入法:
adb shell ime set com.baidu.input_mi/.ImeService
Input method com.baidu.input_mi/.ImeService selected
wm
wm.java---------(11)
获取设备分辨率:
adb shell wm size
Physical size: 1080x1920
monkey、settings、dumpsys------------(12)
log
这个命令可以在logcat里面打印你设定的信息。
adb shell log -p d -t xuxu "test adb shell log"
-p:优先级,-t:tag:标签,后面加上message
adb logcat -v time -s xuxu
--------- beginning of /dev/log/system --------- beginning of /dev/log/main 05-15 13:57:10.286 D/xuxu (12646): test adb shell log
getprop
查看Android设备的参数信息,只运行 adb shell getprop,结果以key:value键值对的形式显示,如果获取某个key的值:
adb shell getprop ro.buld.version.sdk
以上为获取sdk的版本。