ADB+Monkey

文章目录

    • ADB
      • 用途
      • 介绍
      • 工作原理
      • 常见adb命令
        • 安装应用
        • 卸载应用
        • 将文件复制到设备/从设备复制文件
        • 设置端口转发
        • adb logcat
        • adb shell
    • Monkey
      • Monkey介绍
      • Monkey路径
      • Monkey启动
      • Monkey基本参数与事件参数
        • Monkey基本参数设置
        • Monkey测试的约束条件
        • Monkey发送的事件类型和频率
      • Monkey调试参数
        • Android常见错误类型
      • Monkey黑白名单
      • Monkey结果解读
        • Monkey结果分类
      • Monkey异常结果
        • Java常见错误类型
      • Monkey测试策略介绍
      • Monkey的综合应用
        • 应用选取策略:
        • 随机种子策略:
        • 事件策略:
        • 异常策略:
        • 延时策略:
        • 事件数量:
        • 依据软件处于不同的阶段,软件的成熟度,选用不同的策略
      • Monkey使用步骤
      • Monkey结果分析
      • 常见问题
      • Monkey脚本

ADB

用途

  • adb(Android Debug Bridge)是Android的主要调试工具,是连接android手机与pc的桥梁,主要用于Android。
  • 借助adb工具,可以管理设备或手机模拟器的状态。还可以进行很多手机操作,如安装软件、系统升级、运行shell命令等待。
  • 注意:adb.exe位于sdk开发platform-tools目录下

介绍

它是一个客户端/服务器架构的命令行工具,其中客户端是用来操作的电脑, 服务器端是android设备。由三部分组成

  • adb客户端:运行于PC的客户端,通过命令行的方式启动
  • adb服务器:用于开发的机器上作为后台进程运行的服务器,该服务器负责管理客户端与运行于模拟器或设备上的守护进程之间的通信
  • adb daemon(守护进程):一个以后台进程的形式运行于模拟器或手机设备上的守护进程
    在这里插入图片描述

工作原理

  • 当用户启动一个adb客户端,客户端先检查是否已有一个adb服务进程在运行。如果没有,则启动服务器进程。服务器在启动后会与本地 TCP 端口 5037 绑定,并监听 adb 客户端发出的命令 所有 adb 客户端均通过端口 5037 与 adb 服务器通信。
  • 然后,服务器将所有运行中的模拟器或设备实例建立连接。它通过扫描所有5555到5585范围内的奇数端口来定位所有的模拟器或设备。服务器一旦发现 adb 守护进程 (adbd),便会与相应的端口建立连接。
  • 服务器与所有设备均建立连接后,用户可以使用 adb 命令访问这些设备。由于服务器管理与设备的连接,并处理来自多个 adb 客户端的命令,因此用户可以从任意客户端(或从某个脚本)控制任意设备。

常见adb命令

  • 查看adb的版本序列号:adb version
  • 显示当前运行的Android设备:adb devices
  • 查看adb所支持的所有命令:adb -help
  • 启动adb服务进程:adb start-server
  • 终止adb服务进程:adb kill-server
  • adb devices可能包含三种状态
    • device:表示设备或模拟器已经连接到服务器上
    • offline:表示设备没有连接到服务器上或者没有响应
    • no device:表示没有设备连接
  • 获得模拟器的列表emulator -list -avds
  • 启动模拟器
    emulator -avd Nexus_6_API_25 -port 5555
安装应用

adb install –r *.apk

  • 只连接一个设备
    • adb  install  安装包路径
  • 连接多个设备,需要指定一个设备
    • adb –s 设备序列号 install 安装包路径
  • 覆盖安装,保留数据
    • adb –s 设备序列号 install -r 安装包路径
      例:adb -s 192.168.56.101:5555 install - r E:/test.apk
卸载应用
  • 方法1:
    • adb –s 设备名称 uninstall  应用的包名
    • -k 移除软件包后保留数据和缓存目录
  • 方法2:
    • adb –s 设备名称 shell pm uninstall -k 应用的包名
    • adb -s 192.168.56.101:5555 uninstall com.example.think.today
  • 或者使用两条命令完成:
    • adb  shell
    • pm uninstall -k 应用的包名
    • adb -s 192.168.56.101:5555 uninstall com.example.think.today
将文件复制到设备/从设备复制文件
  • adb push PC源文件  设备的路径
  • adb pull 设备文件  PC的路径
    例:
    adb push d:/demo/a.bat /data/
    adb -s 192.168.56.101:5555 pull /data/a.bat d:/demo
设置端口转发

forward 命令设置任意端口转发,将特定主机端口上的请求转发到设备上的其他端口。
例:设置了主机端口 6100 到设备端口 7100 的转发
adb forward tcp:6100 tcp:7100
例:查看设置的设置端口转发
adb forward --list

adb logcat
  • adb logcat 将日志数据输出到屏幕上
  • adb logcat > E:/demo/test.log(查找包名)
  • 优先级按照从低到高顺利排列
    • V Verbose
    • D Debug
    • I Info
    • W Warning
    • E Error
    • F Fatal
    • S Silent
      例:下面的过滤语句指显示优先级为waring或更高的日志信息
      adb logcat *:W
      adb logcat *:W |findstr PackageManager
adb shell
  • adb shell本身就是一个Linux的Shell,可以调用Android内置命令
  • adb shell
  • adb shell ls
  • pm:调用软件包管理器
  • adb shell pm list packages 打印所有包信息
  • adb shell pm list packages -f keyword (查看它们的关联文件)
  • adb shell pm list packages -3 keyword (进行过滤以仅显示第三方软件包)
  • adb shell pm list packages -i keyword(查看软件包的安装程序)
  • adb shell pm uninstall com.example.MyApp 卸载
  • adb shell pm clear com.example.MyApp 删除与软件包关联的所有数据(例如获取位置权限)
  • 使用adb启动停止一个app
    • -W 等待启动完成
    • –S强制停止再次启动
    • adb shell am start –W –S package/activity
    • adb shell am force-stop package
    • 查看包名aapt dump badging d:\meituan.apk | findstr launchable-activity
    • 启动程序:adb shell am start –W –S com.sankuai.meituan/.acvity.Welcome
  • 获取CPU、内存状态
    • adb shell dumpsys meminfo
    • adb shell dumpsys cpuinfo
  • 获取当前界面元素
    • adb shell dumpsys activity top
  • 获取任务列表
    • adb shell dumpsys activity activities
  • 获取当前 activity
    • adb shell dumpsys activity top
  • 获取特定包基本信息
    • adb shell dumpsys package
      com.example.myapplication0922
    • 截屏
      • adb shell screencap /data/local/test1.png
    • 录屏
      • adb shell screenrecord /data/local/test2.mp4

Monkey

Monkey介绍

  • Monkey是Android系统自带的一个命令行工具,可以运行在Android模拟器里或真实设备中。它可以向被测应用发送伪随机(pseudo-random)的用户事件(如点击、触摸、手势等),对软件进行稳定性与压力测试。

Monkey路径

  • Monkey程序由Android系统自带,使用Java语言写成,在Android文件系统中的存放路径是:/system/framework/Monkey.jar。
  • Monkey.jar程序是由一个名为“Monkey”的Shell脚本来启动执行,shell脚本在Android文件系统中的存放路径是:/system/bin/Monkey;由adb shell命令启动:
  • adb shell Monkey {+命令参数}来进行Monkey测试。

Monkey启动

  • 命令格式:
    • 1)直接PC启动
      • adb shell monkey [options]
    • 2)Shell端启动
      • adb shell
      • monkey [options]
  • 保存Monkey运行log
    • 保存在PC adb shell monkey [options] > d:\monkey.txt
    • 保存在手机 monkey [options] > /mnt/sdcard/monkey.txt
    • 标准流与错误流分开保存
      monkey [options] 1> /mnt/sdcard/monkey.txt 2>
      /mnt/sdcard/error.txt

Monkey基本参数与事件参数

Monkey基本参数设置

在这里插入图片描述

Monkey测试的约束条件

在这里插入图片描述

Monkey发送的事件类型和频率

在这里插入图片描述
在这里插入图片描述

Monkey调试参数

在这里插入图片描述

Android常见错误类型
  • ANR:
    • 在5秒内没有响应输入的事件(例如,按键按下,屏幕触摸)
    • BroadcastReceiver在10秒内没有执行完毕
  • Crash:
    • 异常停止
    • 异常退出

Monkey黑白名单

  • 黑名单:不测试的应用
  • 白名单:只测试这部分应用
  • 注意不能同时设置黑名单和白名单
    在这里插入图片描述

Monkey结果解读

Monkey结果分类
  • Monkey运行log输出,按以下顺序输出
    在这里插入图片描述
  • 各事件截取一个事件
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

在这里插入图片描述

Monkey异常结果

  • ANR输出异常格式:
    • System.err.println("// NOT RESPONDING: " + processName + " (pid " + pid + “)”);
  • Crash输出异常格式:
    • System.err.println("// CRASH: " + processName + " (pid " + pid + “)”);
    • System.err.println("// Short Msg: " + shortMsg);
    • System.err.println("// Long Msg: " + longMsg);
    • System.err.println("// Build Label: " + Build.FINGERPRINT);
    • System.err.println("// Build Changelist:“+Build.VERSION.INCREMENTAL);
    • System.err.println("// Build Time: " + Build.TIME);
    • System.err.println(“// " + stackTrace.replace(”\n", "\n// "));
      在这里插入图片描述
      在这里插入图片描述
Java常见错误类型

在这里插入图片描述

Monkey测试策略介绍

  • 策略例子1:整机测试,而不测试拨号应用,忽略所有错误,次数100万次
    • adb shell monkey --ignore-crashes --ignore-timeouts --pkg-blacklist-file /data/local/tmp/blacklist.txt -v -v 1000000
  • 策略例子2:测试计算器30万次,随机种子为100,随机延迟0-1秒,忽略所有错误
    • adb shell monkey -p com.android.calculator2 -s 100 --throttle 1000 --randomize-throttle --ignore-crashes --ignore-timeouts -v -v 300000
  • 策略例子3:测试计算器,触摸事件30%,其他按键50%,错误停止,延时200
    • adb shell monkey -p com.android.calculator2 --throttle 200 --pct-touch 30 --pct-anyevent 50 -v -v 100000
  • 策略例子4:对计算器进行旋转压力测试,事件延时2秒,10万次
    • adb shell monkey -p com.android.calculator2 --pct-rotation 100 --throttle 2000 100000
  • 策略例子5:仅对整机的应用开启测试,事件延时5秒,10万次
    • adb shell monkey --pct-appswitch 100 --throttle 5000 100000

Monkey的综合应用

命令的组合:
应用选取策略+随机种子策略+事件策略+异常策略+延时策略+事件数量

应用选取策略:

1、单应用
2、多应用组合
3、黑白名单组合
4、整机测试

随机种子策略:

1、固定种子,从小到极大的种子
2、随机种子

事件策略:

1、用户故事策略:依据常见的用户场景划分各事件百分比
2、应用特性策略:依据应用策略对Monkey各事件进行划分百分比
3、专项测试策略:对某个事件提高到很高的百分比,对应用进行专项测试

异常策略:

1、跑完:全部异常忽略
2、专门测试某个异常出现:不忽略某个异常,出现某个异常即停止测试
3、人在时候:上班过程中跑不忽略异常,出现异常马上停止,可以马上分析
4、验收策略:去除全部异常,出现错误则停止,则验收不通过

延时策略:

1、低延时
2、高延时
3、随机延时
4、用户操作延时

事件数量:

1、常规测试:10万
2、压力型测试:30万
3、稳定性测试:50万
4、长时间执行:100万

依据软件处于不同的阶段,软件的成熟度,选用不同的策略

在这里插入图片描述

Monkey使用步骤

  • 启动模拟器或者连接真机,adb devices验证
  • 确定被测应用的包名
    • 方式一:问开发
    • 方式二:uiautomatorviewer.bat 查看AppData\Local\Android\sdk\tools
    • 方式三:aapt dump badging d:\group-612_0-meituan.apk | findstr launchable-activity
    • 方式四: adb logcat |findstr "Displayed "
  • 使用Monkey发一条测试命令,分析结果
    • adb shell monkey -p 包名 --throttle 500 --ignore-crashes --ignore-timeouts --ignore-security-exceptions --ignore-native-crashes --monitor-native-crashes -v -v -v 1000000 > D:\demo\Monkey1.log向系统发送1000000 次随机事件,各个随机事件的时间间隔为500 毫秒,测试过程忽略安全、超时、崩溃等异常。

Monkey结果分析

  • ANR问题:在日志中搜索“ANR”
    • Application Not Responding,在Android上,如果应用有一段时间不够灵敏,系统会向用户显示一个对话框。“强制关闭或等待”。
  • 崩溃问题:在日志中搜索“Exception/Error”
    在这里插入图片描述

常见问题

  • 连接真机,不稳定
  • 一般是usb本身连接不够稳定,可以提升usb的供电量,不要使用一般的连接线。检查是否是接触不良。
  • Monkey执行过程中有时候会触碰到通知栏等其他地方,如何避免?
  • 官网下载Monkey源代码,进行二次开发。
  • Monkey命令的使用需要组合多种参数方式来实现覆盖

Monkey脚本

  • Monkey脚本简单、快捷、不需要借助任何工具,就可以实现简单自动化
  • 脚本优势:简单、快捷、不需要借助任何工具,只要一个记事本文件
  • 脚本缺点:实现坐标、按键等基本操作的相应步骤,顺序脚本无逻辑性
  • 脚本源码:\development\cmds\monkey\src\com\android\commands\monkey\MonkeySourceScript.java
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  • 脚本实例
    • 打开浏览器,输入www.baidu.com, 测试10次
    • 步骤分解:
      • 1.打开浏览器
      • 2.清空网址
      • 3.输入网址
      • 4.确认,载入网址
      • 5.完成退出浏览器
      • adb push d:\demo\browser.ms /data/tmp/
      • 目的:有针对性的进行稳定性测试
  • 参考资料
    monkeyscript - 定制化monkey流程
    https://www.cnblogs.com/YatHo/p/7205162.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/447811.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

YOLOv8改进芒果首发:24年最新论文Shift-ConvNets:稀疏/移位操作让小卷积核也能达到大卷积核效果,来打造新颖YOLOv8检测器

💡本篇内容:YOLOv8改进芒果首发:24年最新论文Shift-ConvNets:稀疏/移位操作让小卷积核也能达到大卷积核效果,来打造新颖YOLOv8检测器 💡附改进源代码及教程,用来改进作为 🚀改进Shift-ConvNets 24年最新论文 Shift-ConvNets地址:https://arxiv.org/abs/2401.1273…

图片热区功能

一、需求描述及效果图 1.需求描述: 根据后端返回的坐标及人员信息,在图片上的相应位置添加图片热区功能,点击可展示出对应的人员信息。 图片可进行缩放 2.示例: (定位是随便写的,仅做示例) …

Nginx 多项目部署,vue刷新404 解决方案

网上找的资料大多都解决不了,废话不多说直接告诉你解决方法。 环境是 TP6 VUE前端官网 VUE 后台管理 部署 两个项目 刷新 404 解决方案 Nginx 配置 直接贴图 如果解决了,给我顶起来,让更多人 快速的解决。

SpringBoot security 安全认证(一)——登录验证

本节内容:使用springboot自动security模块实现用户登录验证功能; 登录过程如下图: AuthenticationManager内容实现用户账号密码验证,还可以对用户状态(启用/禁用),逻辑删除,账号是否…

Vue3_基础使用_1

这节主要介绍: vue2与vue3的区别,创建响应式的数据,setup语法糖的使用,watch监听,及vue3创建项目。 vue2的选项式与vue3的组合式区别: 选项式:vue2中数据与方法计算属性等等,针对…

单元测试框架深入(一):单元测试框架深入

一、一个简单的例子 1、引入Maven依赖:JUnit框架和Surefire插件 2.在src/test/java目录下新建名字以“Test”结尾的测试类,并用Test注释测试方法 3.运行单元测试用例 或用mvn命令运行单元测试: 二、单元测试基础之单元测试框架:J…

PKG系统安装包及IPSW固件:MacOS 11-14 Sonoma 正式版

MacOS 14 Sonoma,为提高生产力和创造力带来了全新的功能,有了更多使用小部件和令人惊叹的新屏幕保护程序进行个性化设置的方法,对Safari浏览器和视频会议进行了重大更新,以及优化的游戏体验——Mac体验比以往任何时候都更好。 mac…

Docker进阶篇-DockerFile

一、简介 Dockerfile是用来构建Docker镜像的文本文件,是由一条条构建镜像所需的指令和参数构成的脚 本。 构建步骤: 1、编写Dockerfile文件 2、docker build命令构建镜像 3、docker run依镜像运行容器实例 二、Docker构建过程解析 1、Dockerfile…

Spring-mvc、Spring-boot中如何在调用同类方法时触发AOP

1. 问题描述 Spring-mvc和Spring-boot中aop可以实现代理的功能,我们可以借此实现事务和日志记录或者限流等多种操作。但是,如果你在一个方法中调用其同类下的其他方法的时候不会触发AOP。本文主要说明其原因及解决办法和实现原理。 2. 原因 AIOP的本质是…

【百度Apollo】自动驾驶的领航者

🎬 鸽芷咕:个人主页 🔥 个人专栏: 《linux深造日志》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! ⛳️ 推荐 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下…

【leetcode题解C++】654.最大二叉树 and 617.合并二叉树

654. 最大二叉树 给定一个不重复的整数数组 nums 。 最大二叉树 可以用下面的算法从 nums 递归地构建: 创建一个根节点,其值为 nums 中的最大值。递归地在最大值 左边 的 子数组前缀上 构建左子树。递归地在最大值 右边 的 子数组后缀上 构建右子树。 返回 nums …

三子棋游戏小课堂

🪐🪐🪐欢迎来到程序员餐厅💫💫💫 今天的主菜是,C语言实现的三子棋小游戏, 所属专栏: C语言知识点 主厨的主页:Chef‘s blog 前言&…