面试常问的 adb 命令

霍格沃兹测试开发学社

ceshiren.com

扫码领取本节相关资料

About me

  • 某知名互联网公司资深测试开发工程师
  • 霍格沃兹测试学院讲师
  • 致力于通过技术手段提高测试团队工作效率并改善产品交付可靠性。

目录

  • adb 相关的知识体系
  • adb 的学习计划

adb 相关知识体系

传输文件

兼容性测试

云测平台

Appium 测试框架底层封装

学习规划

扫码领取本节相关资料

什么是 adb

霍格沃兹测试开发学社

ceshiren.com

扫码领取本节相关资料

adb 操作手机设备

  • 打开应用
    • adb shell am start -n com.tencent.wework/.launch.LaunchSplashActivity
  • 传输文件
  • 点击,输入,滑动等
  • 硬件操作 返回,回到首页
  • 性能指标

adb 工作原理

  • 采用了客户端-服务器(C/S)模型,包括三个部分:
  • 客户端 client
  • 服务端 server
  • 守护进程 daemon

提问

adb 由哪几部分组成?

  • A、客户端 adb client
  • B、服务端 adb server
  • C、手机端 adbd
  • D、用户端 user

扫码领取本节相关资料

adb 环境搭建

霍格沃兹测试开发学社

ceshiren.com

扫码领取本节相关资料

环境搭建

  • Java 1.8
  • Android SDK

JAVA 环境安装

JDK 环境安装

配置 JAVA 环境变量

  • JAVA_HOME:jdk 安装根目录
  • PATH:
    %JAVA_HOME%
    %JAVA_HOME%\bin
    %JAVA_HOME%\jre\bin
    
  • 验证环境: java -version

配置 JAVA 环境变量(文档)

SDK 环境安装

SDK 下载

SDK 环境配置

ANDROID_HOME   D:\adt-bundle-mac-x86_64-20140702\sdk   
PATH   %ANDROID_HOME%\tools;%ANDROID_HOME%\platform-tools

检查是否安装成功

  • adb 回车(或者 adb shell )

提问环节

  • 使用 adb 命令需要哪些环境
    • A、JAVA
    • B、python
    • C、SDK
    • D、Pycharm

扫码领取本节相关资料

连接设备/查看状态

霍格沃兹测试开发学社

ceshiren.com

扫码领取本节相关资料

测试机型选择

  • 模拟器
  • 真机

Android 模拟器种类

  • Android Studio emulator(官方)
  • genymotion(信赖网络)
  • mumu,雷电,夜神,逍遥等第三方模拟器(推荐)

连接模拟器(mumu 为例)

  • windows:
    • adb connect 127.0.0.1:7555
    • adb devices
  • mac:
    • adb kill-server
    • adb devices

连接真机(android 手机)设备

  • 1、手机端:让手机处于一个调试模式
  • 2、电脑端安装手机驱动

查看手机状态

查看手机状态

  • adb devices
  • adb get-state

设备状态种类

  • device 正常
  • offline 连接出现异常,设备无响应
  • unauthorized 未授权

提问

  • 问题 1:常用的模拟器有哪几种

    • A、第三方模拟器,比如 mumu ,夜神
    • B、android SDK 里自带的模拟器 emulator
    • C、genymotion
    • D、pycharm
  • 问题 2:如何查看设备的状态

    • A、执行 adb devices
    • B、执行 adb get-state
    • C、执行 adb shell

扫码领取本节相关资料

adb 命令格式/安装卸载

霍格沃兹测试开发学社

ceshiren.com

扫码领取本节相关资料

adb 命令格式

  • 格式 :

    • adb [-d|-e|-s <serialNumber>]<command>
  • -d 指定当前唯一通过 Usb 连接的 android 设备为命令目标(了解)

  • -e 指定当前唯一运行的模拟器为命令目标(了解)

  • -s 指定相应的设备为命令目标(重点)

安装/卸载包

安装

  • 普通安装 adb install <apk路径>

  • 覆盖安装/替代安装 adb install -r <apk路径>

卸载

卸载应用

adb uninstall 包名

卸载应用(不删除配置文件,保存数据缓存信息)

adb uninstall -k 包名

提问

  • 问题 1:使用哪个命令可以实现 覆盖安装应用

    • A、adb install 路径/xxx.apk
    • B、adb install -r 路径/xxx.apk
    • C、adb install -g 路径/xxx.apk
  • 问题 2:命令哪个命令可以实现卸载包并清空缓存:

    • A、adb uninstall 包名
    • B、adb uninstall -r 包名
    • C、adb uninstall -k 包名

扫码领取本节相关资料

adb 命令启动页面

霍格沃兹测试开发学社

ceshiren.com

About me

  • 某知名互联网公司资深测试开发工程师
  • 霍格沃兹测试学院讲师
  • 致力于通过技术手段提高测试团队工作效率并改善产品交付可靠性。

扫码领取本节相关资料

包和 Activity(活动页)的概念

  • package 包:是 Android 应用的唯一标志
  • Activity 活动页: Android 应用页面,一个页面就是一个 Activity

获取当前的页面名

  • 1、打开手机 app 应用的某个页面
  • 2、打开命令行工具
    • 执行命令:adb shell "dumpsys window | grep mCurrentFocus"

获取启动页面的 activity

  • 命令:
    • mac:adb logcat ActivityManager:I | grep "cmp"
    • win: adb logcat ActivityManager:I | findstr "cmp"

启动页面

命令: adb shell am start -n <包名>/<avticity名>

提问 1

  • 什么是 activity?
    • A、一个页面
    • B、一个包
    • C、一个 app

提问 2

  • 如何获取 包名和当前页面 activity 名
    • A、adb shell dumpsys windows
    • B、adb shell dumpsys windows |grep mCurrentFocus
    • C、adb devices

提问 3

  • 如何获启动某个一个 activity 活动页
    • A、adb shell dumpsys windows
    • B、adb shell am start -n <包名>/<avticity 名>
    • C、adb shell

扫码领取本节相关资料

使用 adb shell 命令清缓存

霍格沃兹测试开发学社

ceshiren.com

About me

  • 某知名互联网公司资深测试开发工程师
  • 霍格沃兹测试学院讲师
  • 致力于通过技术手段提高测试团队工作效率并改善产品交付可靠性。

理解 Android 系统

adb shell 应用 1

  • 查看目录结构 :adb shell ls
  • 查看系统当前日期 :adb shell date
  • 查看系统 CPU 使用情况 :adb shell cat /proc/cpuinfo
  • 查看系统内存使用情况 :adb shell cat /proc/meminfo

adb shell 应用 2 - 查看应用列表

  • 显示所有应用 :adb shell pm list packages
  • 显示系统自带应用 :adb shell pm list packages -s
  • 显示第 3 方应用 :adb shell pm list packages -3

adb shell 应用 3 - 查看当前的页面名

  • adb shell "dumpsys window |grep mCurrentFocus"

清除应用数据及缓存

  • adb shell pm clear <包名>

提问 1

  • 如何在不卸载包的情况下,清理缓存数据
    • A、adb shell  pm install 包名
    • B、adb shell  pm uninstall 包名
    • C、adb shell  pm clear 包名

扫码领取本节相关资料

Android 设备与电脑传输文件

霍格沃兹测试开发学社

ceshiren.com

About me

  • 某知名互联网公司资深测试开发工程师
  • 霍格沃兹测试学院讲师
  • 致力于通过技术手段提高测试团队工作效率并改善产品交付可靠性。

传输文件

  • adb push 电脑路径 设备路径
  • adb pull 设备路径 电脑路径

提问

  • 如何将手机的文件传输到电脑上?
    • A、adb pull
    • B、adb push
    • C、adb shell

扫码领取本节相关资料

使用 adb 查看日志

霍格沃兹测试开发学社

ceshiren.com

About me

  • 某知名互联网公司资深测试开发工程师
  • 霍格沃兹测试学院讲师
  • 致力于通过技术手段提高测试团队工作效率并改善产品交付可靠性。

目录

  • 日志的级别
  • adb 命令查看日志
  • 查看日志常用的参数
  • 根据条件过滤日志

日志的级别

  • V — 明细 verbose(最低优先级)
  • D — 调试 debug
  • I — 信息 info
  • W — 警告 warn
  • E — 错误 error
  • F — 严重错误 fatal
  • S — 无记载 silent(最高优先级,绝不会输出任何内容)

adb 命令查看日志

adb logcat

查看日志常用的参数1

格式:

adb logcat --help
adb logcat [TAG:LEVEL ] [TAG:LEVEL ] ...

查看日志常用的参数2

adb logcat 打印默认日志数据
adb logcat -v time  打印时间
adb logcat -v color  使用不同的颜色来显示每个优先级
adb logcat -f <filename> 将日志输出到文件
adb logcat > log.log 保存日志到PC上
adb logcat -c 清理已存在的日志

根据条件过滤日志

adb logcat -v time "*:W" 打印 Warning 及以上级别的日志
adb logcat ActivityManager:D '*:S'     过滤tag 为ActivityManager,level为Debug及以上级别的日志

常见问题

https://developer.android.com/topic/performance/vitals/crash

FATAL EXCEPTION: main
12-09 09:20:14.689: E/AndroidRuntime(31223): java.lang.IllegalStateException: Activity has been destroyed
12-09 09:20:14.689: E/AndroidRuntime(31223): at android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1365)
12-09 09:20:14.689: E/AndroidRuntime(31223): at android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:595)
12-09 09:20:14.689: E/AndroidRuntime(31223): at android.support.v4.app.BackStackRecord.commit(BackStackRecord.java:574)
12-09 09:20:14.689: E/AndroidRuntime(31223): at cn.com.topsky.community.tfd.DongTaiFragment.init(DongTaiFragment.java:209)
12-09 09:20:14.689: E/AndroidRuntime(31223): at cn.com.topsky.community.tfd.DongTaiFragment.onCreateView(DongTaiFragment.java:68)
12-09 09:20:14.689: E/AndroidRuntime(31223): at android.support.v4.app.Fragment.performCreateView(Fragment.java:1500)
12-09 09:20:14.689: E/AndroidRuntime(31223): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:927)
12-09 09:20:14.689: E/AndroidRuntime(31223): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1104)
12-09 09:20:14.689: E/AndroidRuntime(31223): at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682)
12-09 09:20:14.689: E/AndroidRuntime(31223): at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1467)
12-09 09:20:14.689: E/AndroidRuntime(31223): at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:440)
12-09 09:20:14.689: E/AndroidRuntime(31223): at android.os.Handler.handleCallback(Handler.java:605)
12-09 09:20:14.689: E/AndroidRuntime(31223): at android.os.Handler.dispatchMessage(Handler.java:92)
12-09 09:20:14.689: E/AndroidRuntime(31223): at android.os.Looper.loop(Looper.java:154)
12-09 09:20:14.689: E/AndroidRuntime(31223): at android.app.ActivityThread.main(ActivityThread.java:4624)
12-09 09:20:14.689: E/AndroidRuntime(31223): at java.lang.reflect.Method.invokeNative(Native Method)
12-09 09:20:14.689: E/AndroidRuntime(31223): at java.lang.reflect.Method.invoke(Method.java:511)
12-09 09:20:14.689: E/AndroidRuntime(31223): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:809)
12-09 09:20:14.689: E/AndroidRuntime(31223): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:576)
12-09 09:20:14.689: E/AndroidRuntime(31223): at dalvik.system.NativeStart.main(Native Method)

提问 1

  • 如何查看 Error 级别的日志
    • A、adb logcat -v color
    • B、adb logcat -c
    • C、adb logcat “*:E”

扫码领取本节相关资料

adb 模拟按键格式

霍格沃兹测试开发学社

ceshiren.com

About me

  • 某知名互联网公司资深测试开发工程师
  • 霍格沃兹测试学院讲师
  • 致力于通过技术手段提高测试团队工作效率并改善产品交付可靠性。

adb 模拟手机按键

  • 1、打开【指针位置】设置
  • 2、执行adb shell input 命令

模拟点击事件

adb shell tap x坐标 y坐标

模拟输入事件

adb shell input text <输入内容>

模拟滑动事件

adb shell swipe <起点x> <起点y> <终点x> <终点y> <滑动时长>

模拟手机按键

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

提问 1

  • 如何模拟 返回操作
    • A、adb shell input keyevent 3
    • B、adb shell input keyevent 23
    • C、adb shell input keyevent 4

扫码领取本节相关资料

adb 查看性能指标

霍格沃兹测试开发学社

ceshiren.com

About me

  • 某知名互联网公司资深测试开发工程师
  • 霍格沃兹测试学院讲师
  • 致力于通过技术手段提高测试团队工作效率并改善产品交付可靠性。

扫码领取本节相关资料

CPU 使用情况

  • 查看当前系统 CPU 使用情况:adb shell dumpsys cpuinfo

内存使用情况

  • 查看当前系统的内存:adb shell dumpsys meminfo
  • 查看某个应用的内存:adb shell dumpsys meminfo <应用名>

top 命令

  • 1、adb shell top
  • 2、adb shell top |grep ”包名“ 查看某个包的一些性能指标
  • 3、adb shell top -d 1 |grep  “包名"

电池电量

命令

adb shell dumpsys battery
Hogwarts $ adb shell dumpsys battery

Current Battery Service state:
  AC powered: true
  USB powered: false
  Wireless powered: false
  Max charging current: 2000000   # 最大充电电流; mA
  status: 2    #电池状态:2:充电状态 ,其他数字为非充电状态 
  health: 2    #电池健康状态:只有数字2表示good
  present: true   #电池是否安装在机身
  level: 81    #电量: 百分比
  scale: 100
  voltage: 4108    #电池电压
  temperature: 353   #电池温度,单位是0.1摄氏度
  technology: Li-poly   #电池种类

性能相关的具体用法

官网: https://developer.android.com/docs

提问 1

  • 如何查看手机的内存信息
    • A、adb shell dumpsys cpuinfo
    • B、adb shell dumpsys meminfo
    • C、adb shell dumpsys activity

扫码领取本节相关资料

monkey 测试

霍格沃兹测试开发学社

ceshiren.com

About me

  • 某知名互联网公司资深测试开发工程师
  • 霍格沃兹测试学院讲师
  • 致力于通过技术手段提高测试团队工作效率并改善产品交付可靠性。

扫码领取本节相关资料

大纲

  • 什么是monkey
  • 为什么要对app做压力测试
  • monkey 命令格式
  • monkey 基本用法
  • monkey 参数解析

什么是monkey

Monkey 是 Google 提供的一个用于 稳定性与压力测试 的命令行工具

为什么要做压力测试

  • 随机性
  • 完整性
  • 持续性

monkey 命令格式

adb shell --help
adb shell monkey [参数] {随机发送事件数} 

基本用法

    1. 在命令提示符中输入adb devices 查看有无连接的设备
    1. 确认有设备连接
    1. 获取 app 的包名
  • 4. 执行命令:adb shell monkey [参数] {随机发送事件数}

Monkey 命令1 - 添加事件数

adb shell monkey <事件数>

monkey 打印详细日志

adb shell monkey -v <事件数>
adb shell monkey -vv <事件数>
adb shell monkey -vvv <事件数>

monkey 测试停止条件

  • 1、指令执行完成
  • 2、遇到崩溃,或者异常
  • 3、杀掉进程

monkey 运行某个包

  • 指定一个包 adb shell monkey -p 包名 [数件数]

  • 指定多个包 adb shell monkey -p 包名 -p 包名 [事件数]

指定事件时间间隔

--throttle <milliseconds>:每个事件结束后的间隔时间

adb shell monkey -p 包名 --throttle 时长(秒) 

设置种子数

-s  <seednumber>:用于指定伪随机数生成器的seed(种子)值

设置事件比例

--pct-touch:触摸事件 (  设定点击事件百分比)
--pct-motion :滑动事件(设定动作事件百分比  )
--pct-trackball :轨迹球事件(  设定轨迹球事件百分比 )
--pct-nav :导航事件( 设定基本导航事件百分比,比如输入设备上、下、左、右键 )
--pct-majornav:主要导航事件( 设定主要导航事件百分比,比如中间键、返回键、菜单键 )
--pct-syskeys:系统按键事件( 设定系统导航事件百分比,比如HOME键、BACK建、拨号键及音量键 )
--pct-appswitch:activity之间的切换(  设定启动Activity事件百分比)
--pct-pinchzoom:缩放事件
--pct-rotation:屏幕旋转事件
--pct-flip:键盘事件
--pct-anyevent :任意事件 (设定不常用事件百分比)

忽略异常

--ignore-crashes:忽略崩溃
--ignore-timeouts:忽略超时
--ignore-security-exceptions:忽略安全异常
--kill-process-after-error:发生错误后直接杀掉进程
--dbg-no-events:初始化启动的activity,但是不产生任何事件
--hprof:指定该项后在事件序列发送前后会立即生成分析报告 
--monitor-native-crashes:跟踪本地方法的崩溃问题
--wait-dbg:直到连接了调试器才执行monkey测试
–bugreport:当ANR,系统无响应,Crash的时候获得bugreport

保存日志

方式一: adb shell monkey 1000> 文件路径/文件名

方式二: adb logcat -v time '*E' > monkey.log

实战

  • 对雪球进行自动遍历测试
    • 确定测试app的包名:com.xueqiu.android
    • 执行8小时:86060*1000/300 = 96000
    • 日志级别:-v -v -v
    • 确定雪球中常用的操作类型和比例 点击
    • (点击 70% 滑动 10% 系统按键 10% 其它10%)
    • 确定seed值:1234567
    • 确定调试选项:忽略崩溃、忽略超时、忽略安全异常
    • 重定向日志到文件中 > monkey.log

日志分析

    1. crash 闪退
    1. exception 异常
    1. force closed 强制退出
    1. anr(application no response) 程序无响应

提问

  • 如何通过monkey 测试 包名为com.xueqiu.android 发送 1000个事件

    • A、adb shell monkey 1000
    • B、adb shell monkey -p com.xueqiu.android 1000
    • C、adb shell monkey --ignore-crashes 1000

扫码领取本节相关资料