一、adb 是什么?
- Android Debug Bridge (adb) 是一种多功能命令行工具,可以和设备通信, 是一个客户端 - 服务器程序 . 简单来说就是 不仅可以操作手机 设备, 还可以用于 app 自动化测试. (操作安卓手机!!!)
二、adb 工作原理
- 是一个客户端-服务器 (C/S) 程序,包括三个组件:
- 一个客户端,它发送命令。可以通过发出 adb 命令从命令行终端调用客户端
- 一个守护进程 ( adb daemon adbd),它在设备上运行命令。守护程序在每个设备上作为后台进程运行。
- 一个服务端,它管理客户端和守护进程之间的通信,就是接受客户端的指令,把指令转发给移动设备,然后设备识别指令,做出响应, 把结果返回给客户端.
两条通道:客户端 向 服务端 发送指令、 服务端 和 手机端 (服务端会扫描当前所有设备,某一端口进行通信. 它通过扫描 5555 到 5585 范围内的奇数端口来定位模拟器,这是前 16 个模拟器使用的范围。当服务器找到一个 adb 守护进程 (adbd) 时,它会建立到该端口的连接。请注意,每个模拟器使用一对顺序端口——一个用于控制台连接的偶数端口和一个用于 adb 连接的奇数端口。例如:模拟器 1,控制台:5554、模拟器 1,adb:5555。 模拟器 2,控制台:5556、模拟器 2,adb:5557. 就是 连接到 adb 端口 5555 的模拟器与控制台监听端口 5554 的模拟器相同 总结 : 就是客服端 发送给 服务端 指令, 服务端去操作手机设备,执行结果返回给 服务端 , 服务端在返回给客户端.
三、连接手机设备、查看设备状态
模拟机、真机 真机: 选择开发者模式 —》usb 调试 机型不同, 设置不一样 开源模拟器: 模拟真机操作(某一真机的特定版本上开发的)、回归测试/功能测试验证等使用
四、 adb命令
命令组成: adb [-d | -e | -s 设备号 ] 具体命令 -d 当前唯一通过 usb 连接的 android 设备为命令目标 -e 指定当前唯一运行的模拟器为命令目标 -s 指定相应的设备为命令目标!!! 安装/卸载包. 只有一个设备,没有添加其他的 -e 等 .apk文件。 应用宝中下载 普通安装 : adb install <apk路径>. mac 直接找到文件拖拽到终端页面就是显示出路径
覆盖安装/代替安装 : adb install -r <apk路径>
卸载应用.彻底卸载: adb uninstall 包名
卸载应用 . 不删除应用文件,保留缓存数据 : adb uninstall -k 包名 通过 adb shall 进入到手机命令环境
出现问题: 没有权限Android adb shell进入data目录,Permission denied 权限被拒绝. !!!未解决:
五、启动页面
包 : 是安卓应用的唯一标识 活动页 : Android 应用页面,一个页面就是一个Activity. (生命周期:创建 —— 》恢复——》暂停——》停止——》销毁)
获取当前页面名:打开手机微信的页面: (先打开页面) adb shell “dumpsys window | grep mCurrentFocus” 拿到命令以后,可以知道 [ 包名 / 页面名] 然后要打开这个页面就是:
adb shell am start -n [包名 / 页面名]
用户角度: 使用时先点击图标,在进入启动页,在进入广告页 ,容易错失信息.所以要获取 启动页的信息: (后打开页面) adb logcat ActivityManager:I | grep “cmp” 获取空白下面的第一条 cmp 后面的信息.验证是否抓取成功:adb shell am start -n [包名 / 页面名] 错误思想:是从启动页面开始,不是停留在启动页面!!!
六、清理应用缓存
查看系统
- 查看目录结构 : adb shall ls
- 退出: exit
- 查看系统当前日期 : adb shell date
- 查看系统 cpu 使用情况: adb shell cat /proc/cpuinfo
- 查看系统内存使用情况: adb shell cat /proc/meminfo
查看应用列表
-
显示所有应用 : adb shell pm list packages -
显示系统自带应用 : adb shell pm list packages -s -
自己安装的 : adb shell pm list packages -3 -
清除应用缓存数据 : adb shell pm clear <包名>
七、 设备与电脑传输文件
电脑到手机上传输(电脑往外推) :
adb push 电脑路径 设备路径 adb shell 进入到手机环境, 操作到 sdcard (相当于外部外接的一个 sd 卡).
查看: adb shell ls /sdcard/
手机文件拉取下来 :
adb pull 设备路径 电脑路径 例如手机有错误截图 日志需要在电脑上查看, 先模拟在手机 scared 上创建一个日志,如下图:
八、 查看系统日志
日志级别:
V 明细 verbose 最低优先级 会打印所有的日志 D 调试 debug I 信息 info W 警告 warn 代码可能会有问题,抛出 warn 级别日志 E 错误 error F 严重错误 fatal S 无记载 silent 最高优先级,不输出任何内容
查看日志:
打印默认日志数据 : adb logcat
格式: 时间。 进程号。 线程号。级别。tag。 massage 安卓手机有日志缓存,会保存最近一段时间(多久?)的日志,当日志量超过缓存数就会被覆盖 (打开手机开发者选项,可以看到有个选项叫做“日志记录器缓冲区大小”,默认是256K。由上文所述,日志是循环写入环形缓冲区的。在通常情况下,写满时最旧的日志会被删除以给新输出的日志留内存空间。设置的越大就可以保存离当前时间越久远的日志。但相对地,设置的越大对内存的占用也越大,内存的可用空间也越少,请酌情修改)
使用不同颜色来打印每个优先级 : adb logcat -v color 将日志输出到文件中 : adb logcat -f <文件地址。手机端的>。 可以通过 pull 上传到电脑查看. 保存日志到电脑文件上 : adb logcat > ~/Downloads/android.log. > 表示重定向 清理已缓存的日志 : adb logcat -c
根据条件过滤日志 :
打印 warn 及以上级别的日志 : adb logcat ":w" 打印标签 ActivityManager (管理所有页面的标签)日志 : adb logcat ActivityManager:D ':S’ 打印所有 标签为 ActivityManager 的文件, 并只有 debug 级别以上的日志。’:S’ 表示把所有标签设置成为 silent 静默模式, 就可以只展示想要输出的一些日志。 加颜色 : adb logcat -v color ActivityManager:D ':S’
常见 Crashes/ANRs 日志分析 链接 : https://developer.android.com/topic/performance/vitals/crash
九、 adb 模拟按键 (音量键 、放大、缩小、手机返回、home键、点击、滑动、返回键)
1、打开 指针位置设置: 手机开发者模式 —》输入—》指针位置。打开
2、执行 adb shell input 模拟点击事件 : adb shell input tap x坐标 y坐标 (注意手机屏幕上方会有坐标显示 左上角 0,0点 右下角 最大点) 模拟输入事件: adb shell input text 输入内容英文 ,但是需要先把光标放到输入框 模拟滑动事件: adb shell input swipe 起点x 起点y 终点x 终点y 2000 滑动很快 (2000ms 时间 要想准确,时间要慢)
模拟手机按键。查看所有按键 : https://developer.android.com/reference/android/view/KeyEvent 返回键 : adb shell input keyevent 4 home键 : adb shell input keyevent 3 应用在后台运行 音量放大 : adb shell input keyevent 24 音量放小 : adb shell input keyevent 25
十、 查看应用的性能指标 (cpu、内存、电量、流量)
查看当前系统 CPU 使用情况 : adb shell dumpsys cpuinfo 是某一时间之内的占有情况
内存使用情况
查看当前系统的内存 : adb shell dumpsys meminfo 通过这个情况查看当前应用内存占用率。可以分析 物理内存、虚拟内存的占用量。 查看某个应用的内存 : adb shell dumpsys meminfo 应用名。 通过定期采集数据 来分析代码当中是否会有内存问题 例如内存泄漏 ( 内存长期占有量较高,没有及时回收 )
top 命令 : linux 使用 top 命令来获取性能指标的 ,安卓也可用 adb shell top 来获取各个系统进程占有情况(实时) 过滤 某个包的性能指标 : adb shell top | grep 包名 固定时间 每隔 1 s : adb shell top -d 1 | grep 包名
总结 : 都能获取 cpu 使用情况 ,二者区别 : adb shell dumpsys cpuinfo 可以获取一个时间段内的 ,一个平均值,可能不太准确, top 是实时的,更加精确.
查看电池电量 : adb shell dumpsys battery
十一、 adb 实现 monkey 压力测试。
1、什么是 monkey 是 google 提供的一个用于 稳定性与压力测试的命令行工具
2、为什么要对 app 进行压力测试 当大量用户同时访问网站服务器时,能够保证接口在大流量保持稳定, 随机性 : 随机去点击, 完整性 : 尽可能多的去点击多页面,实现一个更完整的测试 持续性 : 设置很大的事件数,就可以持续性的操作设备,只需收集日志去分析
3、monkey 命令格式 查看 : adb shell monkey
4、monkey 基本用法 首先确定手机设备连接,获取 app 包名. 执行命令 : adb shell monkey 参数 { 随机发送事件数}
添加事件数 : adb shell monkey 事件数 打印详细日志 : adb shell monkey -v 事件数。 -vv 更加详细的日志 -vvv 最全面的日志 停止条件 : 指令执行完成。 遇到崩溃/异常 杀掉进程 ctrl + c 只是在电脑上关掉了,杀掉进程:adb shell。 ps | grep monkey。 kill -9 进程号(第一个数) 运行某个包(对某软件测试) : adb shell monkey -p 包名 事件数 运行多个包 : adb shell monkey -p 包名 -p 包名 … - vvv 事件数 制定事件间隔时间 : --throttle 时间/ms monkey不管是否页面加载出来就开始操作,所以需要等待响应,更贴用户使用 设置种子数 : -s 种子数 指令是随机的,如有崩溃 复现较难.如果种子数一致,下一次会按照复现(相当于random理解)。 查看种子数就找执行后的结果中第一行 seed=… 包括 11 种事件:
设置事件比例 : --pct-touch 80 会默认分配 ,但是 比如某 app 点击事件较多,就可以设置点击比例大一点 80% 不超100% 忽略异常 : monkey就是想长时间运行, 可以在有异常的时候继续执行,如果遇到异常就可以保存到日志中
保存日志 : 法一 : adb shell monkey 100 后面加 > 文件名字.log。查看: cat 文件名.log 有大量无用日志,占用空间 法二 : adb logcat -v time ‘*:E’ > monkey.log 获取 error 级别日志
练习:
|