感谢团队同事的辛勤劳动和付出。
------此处献上我的膝盖
----------------------------------------------华丽分割线-------------------------------------------
原理:

ADB是一个C/S架构的应用程序,由三部分组成:
- adb client --运行在pc端 运行adb命令:尝试定位ADB服务器,找不到则启动一个服务器;
adb client向ADB servcer发送服务请求。
- adb server--运行在pc端的后台进程
作用: (1)检测USB端口感知设备的连接/拔除和模拟器实例的启动或停止; (2)监听adb client的请求并发送到对应的adbd上。
- adb demon (adbd) --运行在设备端、常驻进程
作用: 连接ADB服务器,并且为运行在主机上的客户端提供一些服务。 基本用法 1.设备连接 USB连接:
- Android设备正常开机,通过USB线与电脑连接
- 开启开发者选项和USB调试模式
- 设备驱动状态正常
无线连接(需借助usb): 1.将 Android 设备通过USB与电脑相连,且两者连到同一个局域网 2. 让设备在 5555 端口监听 TCP/IP 连接:adb tcpip 5555 4. 断开 USB 连接。 5. 通过设备IP地址连接设备。adb connect <device-ip-address> (断开无线连接adb disconnect <device-ip-address>) 2.基本命令
| 命令 |
含义 |
| adb verion |
查看adb版本 |
| adb start-server |
启动adb server(一般无需手动启动) |
| adb kill-server |
停止adb server |
| adb root |
以 root 权限运行 adbd |
| adb unroot |
以 普通权限运行 adbd |
| adb remount |
已读写方式挂载系分区/system |
| adb devices |
查询已经链接的设备 |
| adb get-serialno |
打印设备序列号(和adb devices中的序列号一致) |
| adb wait-for-device |
阻塞直到设备在线 |
| adb get-state |
查看设备状态: device:设备正常连接 offline:连接出现异常,设备无响应 unknown:没有连接设备 |
| adb status-window |
连续输出设备状态 |
| adb bugreport |
返回设备bug report相关的所有信息 |
| adb [-d|-e|-s ] |
adb -e shell //进入到模拟器中 adb –d shell //进入到真机中 adb –s <设备id> shell //进入到指定设备中 |
| adb shell svc wifi enable/disable |
开/关wifi |
| adb reboot |
重启设备 |
| adb reboot-bootloader |
设备重启到bootloader模式 |
| adb reboot [bootloader|recovery] |
设备重启到bootloader或recovery模式 |
| adb tcpip <port> |
重启adbd在指定的tcp端口上进行监听 |
| adb usb |
重启adbd在usb上进行监听 |
实用功能:
- 截图
adb shell screencap –h查看参数 adb exec-out screencap -p > sc.png //直接保存到本地电脑 或 adb shell screencap -p /sdcard/sc.png //保存到手机 adb pull /sdcard/sc.png
- 录制屏幕
adb shell screenrecord --help看详细参数 adb shell screenrecord /sdcard/filename.mp4 需要停止时按Ctr+C,默认录制时间和最长录制时间为180s。
- 获取当前界面的控件信息
adb shell uiautomator dump [--compressed] [file] dump出当前窗口的UI布局简化信息到指定文件,默认文件是在/sdcard/window_dump.xml
- 应用管理
1.应用查看/安装/卸载
| 查看应用列表 |
adb shell pm list packages [-f] [-d] [-e] [-s] [-3] [-i] [-u] [--user USER_ID] [FILTER] |
| 参数 |
显示列表 |
| 无 |
所有应用 |
| -f |
显示应用关联的 apk 文件 |
| -d |
只显示 disabled 的应用 |
| -e |
只显示 enabled 的应用 |
| -s |
只显示系统应用 |
| -3 |
只显示第三方应用 |
| -i |
显示应用的 installer |
| -u |
包含已卸载应用 |
| <FILTER> |
包名包含 <FILTER> 字符串 |
| 查看应用详细信息 |
adb shell dumpsys package <packagename> |
| 安装apk |
adb install [-lrtsdg] <path_to_apk> |
| -l |
将应用安装到保护目录 /mnt/asec |
| -r |
允许覆盖安装 |
| -t |
允许安装 AndroidManifest.xml 里 application 指定 android:testOnly="true" 的应用 |
| -s |
将应用安装到 sdcard |
| -d |
允许降级覆盖安装 |
| -g |
授予所有运行时权限 |
| 卸载应用 |
adb uninstall [-k] <packagename> -k 卸载应用但保留数据和缓存目录 |
| 查看安装路径 |
adb shell pm path <packagename> |
| 清除应用数据及缓存 |
adb shell pm clear <packagename> |
| 查看前台activity |
adb shell dumpsys activity activities | findstr mFocusedActivity 或adb shell dumpsys activity | grep -i run 或adb shell dumpsys activity activities | sed -En -e ‘/Running activities/,/Run #0/p‘ |
| 查看正在运行的Services |
adb shell dumpsys activity services [<packagename>] |
2.与应用的交互
adb shell am <command>
| 命令 |
用途 |
| am start [options] <INTENT> |
启动 <INTENT> 指定的 Activity |
| am startservice [options] <INTENT> |
启动 <INTENT> 指定的 Service |
| am broadcast [options] <INTENT> |
发送 <INTENT> 指定的广播 |
| am force-stop <packagename> |
停止 <packagename> 相关的进程 |
[options]选项如下:
| 参数 |
含义 |
| -a <ACTION> |
指定 action,比如 android.intent.action.VIEW |
| -c <CATEGORY> |
指定 category,比如 android.intent.category.APP_CONTACTS |
| -n <COMPONENT> |
指定完整 component 名,用于明确指定启动哪个 Activity,如 com.example.app/.ExampleActivity |
例如: 1)adb shell am start -n com.
tencent.mm/.ui.LauncherUI //表示调起微信主界面 2)adb shell am startservice -n
com.tencent.mm/.plugin.account.model.AccountAuthenticatorService //表示调起微信的某个 Service. 3)adb shell am broadcast -a android.intent.action.BOOT_COMPLETED -n org.mazhuang.boottimemeasure/.BootCompletedReceiver //只向BootCompletedReceiver发送广播BOOT_COMPLETED 4)adb shell am force-stop com.qihoo360.mobilesafe //停止 360 安全卫士
| 部分系统预定义广播及正常触发时机 |
| action |
触发时机 |
| android.net.conn.CONNECTIVITY_CHANGE |
网络连接发生变化 |
| android.intent.action.SCREEN_ON |
屏幕点亮 |
| android.intent.action.SCREEN_OFF |
屏幕熄灭 |
| android.intent.action.BATTERY_LOW |
电量低,会弹出电量低提示框 |
| android.intent.action.BATTERY_OKAY |
电量恢复了 |
| android.intent.action.BOOT_COMPLETED |
设备启动完毕 |
| android.intent.action.DEVICE_STORAGE_LOW |
存储空间过低 |
| android.intent.action.DEVICE_STORAGE_OK |
存储空间恢复 |
| android.intent.action.PACKAGE_ADDED |
安装了新的应用 |
| android.net.wifi.STATE_CHANGE |
WiFi连接到一个ssid后的广播 |
| android.net.wifi.WIFI_STATE_CHANGED |
WiFi 状态变为启用/关闭/正在启动/正在关闭/未知 |
| android.intent.action.BATTERY_CHANGED |
电池电量发生变化 |
| android.intent.action.INPUT_METHOD_CHANGED |
系统输入法发生变化 |
| android.intent.action.ACTION_POWER_CONNECTED |
外部电源连接 |
| android.intent.action.ACTION_POWER_DISCONNECTED |
外部电源断开连接 |
| android.intent.action.DREAMING_STARTED |
系统开始休眠 |
| android.intent.action.DREAMING_STOPPED |
系统停止休眠 |
| android.intent.action.WALLPAPER_CHANGED |
壁纸发生变化 |
| android.intent.action.HEADSET_PLUG |
插入耳机 |
| android.intent.action.MEDIA_UNMOUNTED |
卸载外部介质 |
| android.intent.action.MEDIA_MOUNTED |
挂载外部介质 |
| android.os.action.POWER_SAVE_MODE_CHANGED |
省电模式开启 |
3.如何启动被测程序?
启动的方法:adb shell am start -n包名/启动页的Activity
- 确定包名:adb shell pm list package -f
- 查看app启动页Activity:
adb shell dumpsys package <包名> 找到包含“category.LAUNCHER”的Activity即为启动页Activity
- 文件管理
adb pull <设备里的文件路径> [电脑上的目录] //复制设备里的文件到电脑 adb push <电脑上的文件路径> <设备里的目录> //复制电脑里的文件到设备
- 模拟按键/输入
input [<source>] <command> [<arg>...] (详情见adb shell input --help) 屏幕点击:adb shell input tap <x> <y> //在屏幕上点击坐标点(x,y)的位置 屏幕滑动:adb shell input swipe <x1> <y1> <x2> <y2> //从(x1,y1)滑动到(x2,y2) 文本输入:adb shell input text <string> //将<string>输入到文本框中 模拟按键: adb shell input keyevent <keycode>
| keycode |
含义 |
keycode |
含义 |
| 3 |
HOME 键 |
126 |
恢复播放 |
| 4 |
返回键 |
127 |
暂停播放 |
| 5 |
打开拨号应用 |
164 |
静音 |
| 6 |
挂断电话 |
176 |
打开系统设置 |
| 24 |
增加音量 |
187 |
切换应用 |
| 25 |
降低音量 |
207 |
打开联系人 |
| 26 |
电源键 |
208 |
打开日历 |
| 27 |
拍照(需要在相机应用里) |
209 |
打开音乐 |
| 64 |
打开浏览器 |
210 |
打开计算器 |
| 82 |
菜单键 |
220 |
降低屏幕亮度 |
| 85 |
播放/暂停 |
221 |
提高屏幕亮度 |
| 86 |
停止播放 |
223 |
系统休眠 |
| 87 |
播放下一首 |
224 |
点亮屏幕 |
| 88 |
播放上一首 |
231 |
打开语音助手 |
| 122 |
移动光标到行首或列表顶部 |
276 |
如果没有 wakelock 则让系统休眠 |
| 123 |
移动光标到行末或列表底部 |
|
|
- 日志
Android 系统的日志分为两部分,底层的 Linux 内核日志输出到/proc/kmsg,Android 的日志输出到 /dev/log。 Android 日志命令格式: [adb] logcat [<option>] ... [<filter-spec>] ... 其中<filter-spec> 可以由多个 <tag>[:priority] 组成。
1.日志过滤
Android 的日志分为如下几个优先级(priority): V —— Verbose(最低,输出得最多) D —— Debug I —— Info W —— Warning E —— Error F —— Fatal S —— Silent(最高,啥也不输出) 按某级别过滤日志则会将该级别及以上的日志输出。 比如: adb logcat ActivityManager:I MyApp:D *:S //输出 tag ActivityManager 的 Info 以上级别日志,输出 tag MyApp 的 Debug 以上级别日志,及其它 tag 的 Silent 级别日志(即屏蔽其它 tag 日志)。
2.日志格式:
可以用 adb logcat -v <format> 选项指定日志输出格式。
| <format>格式名称 |
输出格式 |
输出举例 |
| brief(默认格式) |
<priority>/<tag>(<pid>): <message> |
D/HeadsetStateMachine( 1785): Disconnected process message: 10, size: 0 |
| process |
<priority>(<pid>) <message> |
D( 1785) Disconnected process message: 10, size: 0 (HeadsetStateMachine) |
| tag |
<priority>/<tag>: <message> |
D/HeadsetStateMachine: Disconnected process message: 10, size: 0 |
| raw |
<message> |
Disconnected process message: 10, size: 0 |
| time |
<datetime> <priority>/<tag>(<pid>): <message> |
08-28 22:39:39.974 D/HeadsetStateMachine( 1785): Disconnected process message: 10, size: 0 |
| threadtime |
<datetime> <pid> <tid> <priority> <tag>: <message> |
08-28 22:39:39.974 1785 1832 D HeadsetStateMachine: Disconnected process message: 10, size: 0 |
| long |
[ <datetime> <pid>:<tid> <priority>/<tag> ] <message> |
[ 08-28 22:39:39.974 1785: 1832 D/HeadsetStateMachine ] Disconnected process message: 10, size: 0 |
adb logcat -v <format> > <文件名> //将log重定向到文件中
3. 清空日志:adb logcat -c
4. 内核日志命令:adb shell dmesg
- 查看/修改设备信息
1.查看设备信息
| 查看设备型号信息 |
adb shell getprop ro.product.model |
| 查看电池状况 |
adb shell dumpsys battery |
| 屏幕分辨率 |
adb shell wm size |
| 设备屏幕密度 |
adb shell wm density |
| 显示屏参数命令 |
adb shell dumpsys window displays |
| android_id |
adb shell settings get secure android_id |
| IMEI |
Android 4.4 及以下版本:adb shell dumpsys iphonesubinfo 在 Android 5.0 及以上版本(要root权限): #adb shell su service call iphonesubinfo 1 |
| Android 系统版本 |
adb shell getprop ro.build.version.release |
| IP地址 |
adb shell ifconfig | grep Mask 或 adb shell netcfg (部分系统版本可以) 或 设备连着 WiFi时可尝试:adb shell ifconfig wlan0 |
| Mac 地址 |
adb shell cat /sys/class/net/wlan0/address(局域网 Mac 地址) 移动网络或其它连接的信息可用adb shell netcfg 命令来查看 |
| CPU 信息 |
adb shell cat /proc/cpuinfo |
| 内存信息 |
adb shell cat /proc/meminfo |
| 更多硬件与系统属性 |
adb shell cat /system/build.prop |
2.修改设备信息
注: 修改设置之后,运行恢复命令有可能显示仍然不太正常,可以运行 #adb reboot 重启设备,或手动重启。 修改设置的原理主要是通过settings 命令修改/data/data/com.android.providers.settings/databases/settings.db(Android6.0后为/data/system/users/userid/下面的xml文件) 里存放的设置值。
| 修改/恢复分辨率 |
adb shell wm size 480x1024 adb shell wm size reset |
| 修改/恢复屏幕密度 |
adb shell wm density 160 adb shell wm density reset |
| 修改/恢复显示区域命令: |
adb shell wm overscan 0,0,0,200(四个数字分别表示距离左、上、右、下边缘的留白像素,以上命令表示将屏幕底部 200px 留白。) adb shell wm overscan reset |
| 关闭 USB 调试模式 |
adb shell settings put global adb_enabled 0 |
| 状态栏和导航栏的显示隐藏 |
adb shell settings put global policy_control <key1>=<value1>:<key2>=<value2>… |
| 状态栏和导航栏的显示隐藏: adb shell settings put global policy_control <key1>=<value1>:<key2>=<value2>… |
| Key |
Value |
| immersive.full同时隐藏 |
apps所有应用 |
| immersive.status 隐藏状态栏 |
* 所有界面 |
| immersive.navigaion 隐藏导航栏 |
packagename指定应用 |
| immersive.precomfirms ? |
-packagename排除指定应用 |
例如: #adb shell settings put global policy_control immersive.full=* 表示设置在所有界面下都同时隐藏状态栏和导航栏。 # adb shell settings put global policy_control immersive.full=-* //取消上面的隐藏 #adb shell settings put global policy_control immersive.status=com.package1,com.package2:immersive.navigation=apps,-com.package3 表示设置在包名为com.package1 和com.package2 的应用里隐藏状态栏,在除了包名为com.package3 的所有应用里隐藏导航栏。
- 备份与还原
备份:adb backup [-f <file>] [-apk|-noapk] [-obb|-noobb] [-shared|-noshared] [-all] [-system|-nosystem] [<packages...>] 还原:adb restore <file>
| 备份选项 |
含义 |
| adb backup -all |
使用默认方式备份应用和设备的数据(不包含apk)到当前目录下并保存为文件backup.ab |
| -f |
指定备份文件 |
| -obb|-noobb |
备份是否包含程序连带的扩展数据,默认是-noobb |
| -apk|-noapk |
备份中是否包含apk |
| -shared|-noshared |
是否备份设备共享的SD card内容 |
| -system|-nosystem |
决定-all是否包含系统应用,默认的是-system |
| [<packages...>] |
带包名表示只备份此包的相关信息 |
例如:adb backup -apk -shared -system -all -f backup_apk.ab
- 转发
adb forward [--no--rebind] <local> <remote> adb forward --remove <local> adb forward --remove-all adb forward --list 例如:adb forward tcp:11111 tcp:22222 建立一个转发将PC端的11111端口收到的数据,转发给到手机中22222端口。但是只执行这个命令还不能转发数据,还需要完成两个步骤才能传数据。这两个步骤是: (a)在手机端,建立一个端口为22222的server,并打开server到监听状态。 (b)在PC端,建立一个socket client端,连接到端口为11111的server上。 PC端的应用与手机端应用之间传输数据的过程: (1)PC端应用将数据发送给端口为11111的server(adb创建的) (2)adb将数据转发给手机端adbd进程(通过USB传输) (3)adbd进程将数据发送给端口为22222的server(手机端应用创建的) 传递是双向的,第(1)和第(3)步是通过socket实现的,所以通过socket的读和写就完成了PC端应用和手机端应用的数据传递。
- Mokey测试
Monkey程序由Android系统自带,使用Java语言写成,在Android文件系统中的存放路径是:/system/framework/monkey.jar; Monkey.jar程序是由一个名为“monkey”的Shell脚本来启动执行,shell脚本在Android文件系统中的存放路径是:/system/bin/monkey; 帮助文档:adb shell monkey --help 参数介绍:
| Monkey命令参数 |
含义 |
| -p |
参数指定一个或多个包。 adb shell monkey -p com.htc.Weather –p com.htc.pdfreader 100 |
| -v |
指定日志的详细程度,总共分3个级别: Level 0:缺省值,提供启动提示、测试完成和最终结果等少量信息。 adb shell monkey -p com.htc.Weather –v 100 Level 1:详细的日志,包括每个发送到Activity的事件信息 adb shell monkey -p com.htc.Weather -v -v 100 Level 2:最详细的日志,包括了测试中选中/未选中的Activity信息 adb shell monkey -p com.htc.Weather -v -v -v 100 |
| -s |
指定伪随机数生成器的seed值 adb shell monkey -p com.htc.Weather -s 10 100 |
| --throttle <毫秒> |
指定用户操作(即事件)间的时延。 adb shell monkey -p com.htc.Weather –throttle 3000 100 |
| --ignore-crashes |
程序崩溃仍发送事件,直到事件计数完成。 adb shellmonkey -p com.htc.Weather --ignore-crashes 100 |
| --ignore-timeouts |
程序发生ANR时,仍然发送事件,直到事件计数完成。 |
| --ignore-security-exceptions |
当应用程序发生许可错误时(如证书许可,网络许可等),仍然发送事件,直到事件计数完成。 |
| --kill-process-after-error |
当应用程序发生错误时,停止运行并保持在当前状态,(应用程序仅是静止在发生错误时的状态,系统并不会结束该应用程序的进程) |
| --monitor-native-crashes |
用于指定是否监视并报告应用程序发生崩溃的本地代码。 |
| --pct-{+事件类别}{+事件类别百分比} |
用于指定每种类别事件的数目百分比(在Monkey事件序列中,该类事件数目占总事件数目的百分比) adb shell monkey –p <pkg> --pct-touch 10 1000 |
| 事件类别 |
含义 |
| --pct-touch |
触摸事件:是一个down-up事件,它发生在屏幕上的某单一位置 |
| --pct-motion |
动作事件:由屏幕上某处的一个down事件、一系列的伪随机事件和一个up事件组成 |
| --pct-trackball |
轨迹事件:由一个或几个随机的移动组成,有时还伴随有点击 |
| --pct-nav |
基本导航事件:由来自方向输入设备的up/down/left/right组成 |
| --pct-majornav |
主要导航事件:此类事件通常引发图形界面中的动作,如:5-way键盘的中间按键、回退按键、菜单按键 |
| --pct-syskeys |
系统按键:Home、Back、Start Call、End Call及音量控制键等 |
| --pct-appswitch |
调整启动Activity的百分比。在随机间隔里,Monkey将执行一个startActivity()调用,作为最大程度覆盖包中全部Activity的一种方法 |
| --pct-anyevent |
调整其它类型事件的百分比。它包罗了所有其它类型的事件,如:按键、其它不常用的设备按钮、等等 |
- 数据库操作
adb shell sqlite3 <数据库文件> //进入到数据库中 sqlite>.tables //列出各个表 sqlite>.schema <表名> //获得完整的数据库表字段信息 sqlite>.help //查看命令 sqlite> select * from <表名> //SQL语句 sqlite> .exit //退出数据库