目录

​一、安装Android SDK​

​1.1  mac安装Android SDK​

​1.1.1  方式一:下载 Android SDK ​

​1.1.2  方式二:使用brew 安装 Android SDK ​

​1.2  win安装Android Android SDK​

​二、安装Android studio​

​2.1  mac安装Android studio​

​2.2  win电脑安装Android studio​

​三、adb​

​3.1 win 安装adb​

​3.2 mac使用homebrew安装adb​

​3.3 手机连接​

​3.4 adb常用命令​

​四、查看应用的包名papackage与页面的Activity​

​4.1 mac 查看 包名papackage与页面的Activity​

​4.2 win 查看 包名papackage与页面的Activity​

​五、monkey​

​3.1 monkey命令模版​

​3.2 seed值,标记​

​3.3 设置monkey事件的百分比​

​3.4 monkey注意事项:​

​六、monkey实战​

​6. 1 项目实战​

​七.  指定页面进行压测​

​八、monkey bugreport 测试报告分析​

​8.1 Android adb bugreport工具分析和使用​

​8.2  battery-historian解析数据​

​8.3 使用jar包解析数据​

​九、Monkey日志分析​

​7.1  ANR 应用程序无响应对话框​

​7.1.1 ANR分析:​

​7.1.2   traces.txt 文件​

​7.2  Monitor&DDMS​

​7.3  Exception & Crash​

​7.4 monkey日志分析步骤​

​十、MonkeyScript脚本​

​10.1  MonkeyScript 常用命令​

​10.2   MonkeyScript 脚本编写​

​10.3 执行脚本​

​十一、MonkeyRunner介绍​

​11.1 环境搭建&启动:​

​编辑​

​11.2 MonkeyRunner API介绍&常用命令​

​11.2.1 MonkeyRunner类​

​11.2.2 MonkeyDevice类​

​11.2.3 MonkeyImage类​

​十二、MonkeyRunner脚本实战​

​12.1、测试场景​

​12.2、思路分析​

​12.3、代码(考研帮app)​

​十三、python GUI编程(tkinter)基于adb 编写安卓助手​


一、安装Android SDK

1.1  mac安装Android SDK

1.1.1  方式一:下载 Android SDK 

可以去官网下载,官网要是不方便下载的话,用下面这个下载地址:

​Android SDK 百度网盘下载地址链接​

安卓应用测试&Monkey&MonkeyScript&MonkeyRunner&pyhton性能工具脚本_android

下载完成后配置环境变量,(自行百度吧)

1.1.2  方式二:使用brew 安装 Android SDK 


1、安装好brew后,通过以下命令进行sdk的安装。没有安装brew,需要先安装brew。

brew install android-sdk

2、查看是否已安装成功,在终端执行:android

安卓应用测试&Monkey&MonkeyScript&MonkeyRunner&pyhton性能工具脚本_monkey_02

 安装成功。

3、配置SDK的环境变量

查看sdk安装路径:

brew list android-sdk

安卓应用测试&Monkey&MonkeyScript&MonkeyRunner&pyhton性能工具脚本_android_03

 我电脑android sdk 安装路径为:

/opt/homebrew/Caskroom/android-sdk

编辑环境变量文件.bash_profile文件

vim ~/.bash_profile

配置环境变量

export ANDROID_HOME=/opt/homebrew/Caskroom/android-sdk
export PATH=$PATH:$ANDROID_HOME/tools
export PATH=$PATH:$ANDROID_HOME/platform-tools

安卓应用测试&Monkey&MonkeyScript&MonkeyRunner&pyhton性能工具脚本_monkey_04

使配置立即生效:

source ~/.bash_profile

注意

mac电脑,一定要搞清楚自己要修改

~/.bash_profile 还是要修改 vim ~/.zshrc 文件


验证环境变量是否配置成功:

adb version

安卓应用测试&Monkey&MonkeyScript&MonkeyRunner&pyhton性能工具脚本_应用程序_05

安装成功。

1.2  win安装Android Android SDK

 可以去官网下载,官网要是不方便下载的话,用下面这个下载地址:

​http://tools.android-studio.org/index.php/sdk​

安卓应用测试&Monkey&MonkeyScript&MonkeyRunner&pyhton性能工具脚本_monkey_06

下载完成后,配置环境变量。(自行百度吧)

二、安装Android studio

为啥要安装Android studio呢?

我们有一些场景用到Android studio,比如内存分析,以及在测试过程中,log的查看,开发可能打了很多日志,我们通过Android studio 可以查看到开发的日志,方便我们定位问题。

Android studio 不着急下载安装,啥时候用到再去下载安装,前期这一章节可以跳过去。

2.1  mac安装Android studio


 Android studio 官网:

​Download Android Studio & App Tools - Android Developers​

 

安卓应用测试&Monkey&MonkeyScript&MonkeyRunner&pyhton性能工具脚本_monkeyrunner_07

下载之前查一下电脑的芯片,用的是apple的还是intel,我用的apple芯片,点击

Mac with Apple chip

安卓应用测试&Monkey&MonkeyScript&MonkeyRunner&pyhton性能工具脚本_android_08

下载完成后,点击dmg安装,

安卓应用测试&Monkey&MonkeyScript&MonkeyRunner&pyhton性能工具脚本_android_09

选择do not impot

 

安卓应用测试&Monkey&MonkeyScript&MonkeyRunner&pyhton性能工具脚本_应用程序_10

2.2  win电脑安装Android studio

  Android studio 官网:

​Download Android Studio & App Tools - Android Developers​

下载完成后,剩下的自行百度吧,太杂了,也没啥技术含量。 

2.3  win电脑安装Android studio 连接真机调试APP


 2.4  mac电脑安装Android studio 连接真机调试APP

只有 Windows 需要 Google USB 驱动程序, Mac OS X 或 Linux 上开发,则不需要 USB 驱动程序。

三、adb

adb全称是Android Debug Bridge,它是一个命令行工具,通过它可以与Android设备进行交互,可以进行常见的安装/卸载app、打开app、查看app的日志等操作。

官网:​​Android Debug Bridge (adb)​

3.1 win 安装adb

通过Android sdk安装。1.下载AndroidSDK 2.配置adb环境变量。

如果我们完成了第一章节  安装Android SDK ,就不用再安装adb了,可以直接用。

3.2 mac使用homebrew安装adb

如果我们完成了第一章节  安装Android SDK ,就不用再安装adb了,可以直接用。

也可以单独使用homebrew安装adb

如果已经安装了homebrew,就不用执行安装homebrew命令了

安装homebrew:

ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

安装adb:

使用以下命令,如果第一个命令报错,就使用第二个。

brew cask install android-platform-tools
brew install android-platform-tools --cask

安装成功:

再次输入adb devices 显示安装成功

3.3 手机连接

手机打开开发者模式,连接数据线,允许设备调试。

usb连接方式为数据传输模式

adb devices

查看连接设备

无线连接的方法:(大概就是以下方法,具体可以自行百度)

电脑与测试机处于同一局域网中,通过为测试机设置端口号做唯一映射

adb -s 设备号 tcpip 5556

adb connect 设备IP:5556

进入android设备关于手机页面,红框中标识即为设备IP

安卓应用测试&Monkey&MonkeyScript&MonkeyRunner&pyhton性能工具脚本_应用程序_11

此时cmd命令窗口中输入adb deveices回车,可正常返回该设备的连接信息即为连接成功

3.4 adb常用命令

1.adb常用命令

#连接手机

adb devices -l

#安装APP

adb install name.apk

#卸载APP

adb unnistall 包名

#解锁屏幕

adb shell input keyevent 26

#点击触屏

adb shell input tap 500 500

#输入字符

adb shell input text abc

#登录android

adb shell

#从Android拷贝资料到PC

adb pull /sdcard/DCIM/Camera/文件名 /Users/lenov

#从PC端拷贝资料到设备

adb push /Users/lenov/文件名 //sdcard/DCIM/Camera

四、查看应用的包名papackage与页面的Activity

为啥要查看应用的包名papackage与页面的Activity?

因为我们在写自动化的时候,很多参数都需要指定应用的包名papackage与页面的Activity。

win 与mac 查看应用的包名的命令好像不一致,我使用的是mac,所以用mac的命令,我也写了win的命令,不过win的命令,执行失败的话,只能自己百度一下了。

4.1 mac 查看 包名papackage与页面的Activity

注意:在win才有findstr这个命令,mac的命令是grep

方式一:

1、连接手机

2、打开需要查看的app

3、执行命令:

adb shell dumpsys window w |grep / |grep name=

     mSurface=Surface(name=com.Test/com)/@0

如上,包名为

com.xxx

主程序入口为:

com.xx.WebActivity

方式二:

在终端中输入命令:

adb shell am monitor

 然后打开应用

 这个命令只能获取包名。

4.2 win 查看 包名papackage与页面的Activity

如果以下命令不正确,就要自己百度去了。

1、aapt

将apk拖放到cmd中

aapt dump badging <apk文件路径>(将apk拖放到此处即可)

2、adb logcat 获取

adb shell "logcat | grep START"

输入这个命令,然后去启动app。

 3.dumpsys

(1)启动要查看的程序;

(2)命令行输入:adb shell dumpsys window w |findstr \/ |findstr name=

(3) 命令输入:adb shell dumpsys window | findstr mCurrentFocus  

命令查看当前运行的包名和Activity

安卓应用测试&Monkey&MonkeyScript&MonkeyRunner&pyhton性能工具脚本_应用程序_12

五、monkey

Monkey程序由Android系统自带,使用Java语言写成,在Android文件系统中的存放路径是:/system/framework/monkey.jar;

查看帮助:

adb shell monkey –help

3.1 monkey命令模版

一般在做monkey时,使用以下这个命令就可以了,日志尽量详细一点,将来好分析定位问题。

 adb shell monkey -p packagename --throttle 500 --ignore-crashes --ignore-timeouts --ignore-security-exceptions --ignore-native-crashes --monitor-native-crashes -v -v -v 1000000>c:\test.log

--throttle 500

每个时间间隔500毫秒。事件之间的固定延迟,若无该项monkey每个时间之间不会有时间间隔

--ignore-crashes

忽略crash,当指定的应用程序发生崩溃时(Force&Close错误),Monkey继续执行事件。

--ignore-timeouts

忽略超时,当指定的应用程序发生ANR 错误时,Monkey事件继续执行。

--ignore-security-exceptions

当应用程序发生许可错误时(如证书许可,网络许可等),Monkey继续执行事件。

--ignore-native-crashes

忽略本地的crashes

--monitor-native-crashes

监视并报告应用程序发生崩溃的本地代码

--kill-process-after-error 

当应用程序发生错误时,应用程序停止运行并保持在当前状态(注意:应用程序仅是静止在发生错误时的状态,系统并不会结束该应用程序的进行)

-v

打印log级别,-v越多日志信息越详细,最多支持3个。三个-v,是最详细的。

例如:adb shell monkey -p 包名 -v -v -v 事件总数

我们在执行monkey时,这个-v 日志详细度要设置最大,这样会方便我们定位问题。

monkey执行时长:

monkey没有执行时长的命令,如jmeter,压测十分钟。monkey没有这种功能,这里只能通过换算。

事件总数计算方式=预计运行时长(换算成秒)/间隔时长(换算成秒)

为什么要加忽略:

如果不忽略crash,出现crash,monkey就停了。

3.2 seed值,标记

如果seed值相同,则两次执行monkey的事件顺序是相同的。

应用场景:

我们在执行monkey时,给一个seed标记。等我们下次需要复现上一次的执行过程时,我们执行monkey命令,带上这个标记,则这一次执行的事件顺序与上一次事件顺序是一致的,就可以复现上一次的步骤。

注意:

两次执行命令,使用相同的seed值,执行过程并不是严格意义上一致的,可能会有不一致的地方,不过这个不重要,我们可以忽略这个。

示例:

第一次执行,1000次。seed值为666

 adb shell monkey -p packagename -s 666 1000

第二次执行,为了与上一次执行的逻辑一样,同样适用666为seed值。

 adb shell monkey -p packagename -s 666 1000

seed值,如果执行的命令里不指定,在monkey执行时,会生成一个seed值。

安卓应用测试&Monkey&MonkeyScript&MonkeyRunner&pyhton性能工具脚本_包名_13

3.3 设置monkey事件的百分比

monkey的事件都是随机事件,我们这里可以设置每个事件类型发生的百分比。

0:触摸事件百分比,即参数--pct-touch
1:滑动事件百分比,即参数--pct-motion
2:缩放事件百分比,即参数--pct-pinchzoom
3:轨迹球事件百分比,即参数--pct-trackball
4:屏幕旋转事件百分比,
5:基本导航事件百分比,即参数--pct-nav
6:主要导航事件百分比,即参数--pct-majornav
7:系统事件百分比,即参数--pct-syskeys
8:Activity启动事件百分比,即参数--pct-appswitch
9:键盘翻转事件百分比,即参数--pct-flip
10:其他事件百分比,即参数--pct-anyevent

例如:

adb shell monkey -v -p XXX --pct-touch 1 --pct-motion 2 --pct-trackball 3 --pct-nav 4 --pct-majornav 5 --pct-syskeys 6 --pct-appswitch 7 --pct-anyevent 8

3.4 monkey注意事项:

1、. 开启安全设置下的未知来源

2. 手机连接电源充电

3. 若有有关于音频的模块,请插入耳机避免影响其他同事

六、monkey实战

在执行monkey事件中,手机不会自己熄屏

6. 1 项目实战

先执行monkey,获取日志。1000次,每次时间间隔500ms。

adb shell monkey -p comxxx.test --throttle 500 --ignore-crashes --ignore-timeouts --ignore-security-exceptions --ignore-native-crashes --monitor-native-crashes -v -v -v 1000>/Users/zhaohui/Desktop/monkeylog.txt

zhaohui@zhaohuideMacBook-Pro ~ % adb shell monkey -p com.xxx.Test --throttle 500 --ignore-crashes --ignore-timeouts --ignore-security-exceptions --ignore-native-crashes --monitor-native-crashes -v -v -v 1000>/Users/zhaohui/Desktop/app.log
args: [-p, com.szking.kyjj.custTest, --throttle, 500, --ignore-crashes, --ignore-timeouts, --ignore-security-exceptions, --ignore-native-crashes, --monitor-native-crashes, -v, -v, -v, 1000]
arg: "-p"
arg: "com.szking.kyjj.custTest"
arg: "--throttle"
arg: "500"
arg: "--ignore-crashes"
arg: "--ignore-timeouts"
arg: "--ignore-security-exceptions"
arg: "--ignore-native-crashes"
arg: "--monitor-native-crashes"
arg: "-v"
arg: "-v"
arg: "-v"
arg: "1000"
data="com.szking.kyjj.custTest"
arg="--throttle" mCurArgData="null" mNextArg=3 argwas="--throttle" nextarg="500"
data="500"
arg="--ignore-crashes" mCurArgData="null" mNextArg=5 argwas="--ignore-crashes" nextarg="--ignore-timeouts"
arg="--ignore-timeouts" mCurArgData="null" mNextArg=6 argwas="--ignore-timeouts" nextarg="--ignore-security-exceptions"
arg="--ignore-security-exceptions" mCurArgData="null" mNextArg=7 argwas="--ignore-security-exceptions" nextarg="--ignore-native-crashes"
arg="--ignore-native-crashes" mCurArgData="null" mNextArg=8 argwas="--ignore-native-crashes" nextarg="--monitor-native-crashes"
arg="--monitor-native-crashes" mCurArgData="null" mNextArg=9 argwas="--monitor-native-crashes" nextarg="-v"

七.  指定页面进行压测


前言:

目前大部分的Monkey测试的方式大都无法对独立的模块进行稳定性测试,而每个业务线的入口在测试阶段很难通过原生的Monkey测试(随机性较强)来发现自己模块内crash的问题,针对这个问题,这个工具设计开发的初衷就是为了能够缩小测试范围,在测试阶段指定业务模块内发现和暴露更多的稳定性相关的问题。

解决问题:

当App业务变多的时候之后我们需要对App内的业务模块进行针对性稳定性测试。由于原生的Monkey随机性较强,很难 对指定的Activity进行针对性的monkey测试,Demons的出现就为了解决了这个问题。

原理:

原理其实就是有一个后台任务可用定时巡检PC上所连的每个设备当前运行在哪个页面,如果发现设备已经crash或者当前页面不在我们指定的白名单页面,那么该程序会自动处理当前进程的数据并初始化回到主入口。

工具特点:

  • 只要手机连上就可以进行监听,无设备数量限制。
  • 可以在每次越界之后随机分配回到一个主入口 进行初始化。
  • 工具与Monkey执行模块是分离的,这样可以防止相互影响。

jar包git下载地址:

​GitHub - 18713341733/MonkeyJava​

安卓应用测试&Monkey&MonkeyScript&MonkeyRunner&pyhton性能工具脚本_android_14

 里面就一个配置文件config.xml 和jar包。

使用方式:

1、将工具下载下来放到本地目录下
2、配置工作目录config.xml文件

安卓应用测试&Monkey&MonkeyScript&MonkeyRunner&pyhton性能工具脚本_包名_15

安卓应用测试&Monkey&MonkeyScript&MonkeyRunner&pyhton性能工具脚本_android_16

第一步,获取app的package,并填写配置文件xml

第二步,获app程序的入口activity,并填写配置文件xml

①:adb shell dumpsys window windows | findstr "mCurrent"

②:adb shell dumpsys activity | findstr "mFocusedActivity"

第三步,获取并输入activity白名单:

①.也可以使用adb logcat -v time -s ActivityManager,点击app功能跳转想要测试的页面,cmd页面就可以刷新获取到跳转页面的activity,然后把activity输入到白名单内

【注:当白名单内的activity的数量大于1的时候,每个activity后面都需要添加英文逗号 “,” ,最后一个不需要添加,否则多个白名单的activity的value就会链接在一起,导致程序检测到与当前页的activity不一致,就一直返回到主页面activity上,影响测试】

需要对指定模块设置白名单,在设置白名单前需要知道当前功能页面的Activity。

在win系统中:

adb shell dumpsys activity | findstr "mFocusedActivity"

注意:在win才有findstr这个命令,mac的命令是grep

验证主入口是否有跳转权限

adb shell am start -n 包名/Activity名

主入口如果配的有问题会出现以下错误,原因是Activity 没有调用权限

安卓应用测试&Monkey&MonkeyScript&MonkeyRunner&pyhton性能工具脚本_包名_17

根据以上名称查看当前功能的Activity,将该页面配置至白名单,如下图所示。

3、monkey执行

将单个或多个设备连接电脑

打开cmd命令窗口,进入当前jar包所在目录,执行

java -jar monkeyTest.jar

等待初始化完成

再启一个cmd命令窗口,执行monkey命令即可。

缺陷:

每个页面都会有个activity,而且,会出现多个页面共有同一个activity的现象,这样的话,就有个缺陷,如果有个A页面下的B页面,他们的共用同一个activity,我只是想在A页面跑monkey,B页面不跑monkey,这个需求是无法通过这个方法达到的,所以,A、B页面都会测试到,原因就是,他这个是针对activity的测试,只要是白名单里的activity,都是可以测试到的,除非A页面、B页面不共用一个activity。这个技术只是比基本的monkey更细化一点,还无法真正达到指定A页面moneky测试

八、monkey bugreport 测试报告分析

当我们使用monkey命令执行时:

adb shell monkey -p com.xxx.Test --throttle 500 --ignore-crashes --ignore-timeouts --ignore-security-exceptions --ignore-native-crashes --monitor-native-crashes -v -v -v 1000>/Users/zhaohui/Desktop/monkeylog.txt

会在Desktop/生成一个monkeylog.txt文档,这个文档就是monkey记录的日志,包括monkey执行的步骤,app的日志等。

我们在执行monkey后,其实会生成2个日志文件,一个是monkey记录的,一个是adb bugreport记录的。

在我们电脑终端,执行命令。

adb bugreport > bugreport.txt

就可以在当前位置生成一个bugreport.txt文件。

8.1 Android adb bugreport工具分析和使用


Android系统想要成为一个功能完备,生态繁荣的操作系统,那就必须提供完整的应用开发环境。而在应用开发中,app程序的调试分析是日常生产中进程会进行的工作。Android为了方便开发人员分析整个系统平台和某个app在运行一段时间之内的所有信息,专门开发了bugreport工具。这个工具使用起来十分简单,只要在终端执行(linux或者win):

1.Android系统版本>=8.0,直接使用指令adb bugreport,例如:

adb bugreport > bugreport.txt
或者:
adb bugreport > C:\Users\ymlu\Desktop\bugreport.txt

2.针对Android系统版本<8.0,终端切至路径C:\Users\ymlu\Desktop\adt-bundle-windows-x86_64-20140702\adt-bundle-windows-x86_64-20140702\sdk\platform-tools下面,运行adb.exe;然后运行adb bugreport即可

​即可生成bugreport文件。​

​bugreport​​文件有的时候异常庞大,能够达到15M+,如果我们用文本工具打开一个几十m的txt文件,是一件很痛苦的事情。

实践中发现bugreport只能导出近2小时的日志,所以需要在monkey测试中设置定时任务来定时导出bugreport日志,以便全面分析被测APP在monkey压测过程中出现的问题。

因此google针对android 5.0(api 21)以上的系统开发了一个叫做battery historian的分析工具,这个工具就是用来解析这个txt文本文件,然后使用web图形的形式展现出来,这样出来的效果更加人性化,更加可读。

8.2  battery-historian解析数据

从bugreport导出手机数据,通过battery-historian解析原始数据进行多维度分析功耗异常

 下载地址:​​GitHub - google/battery-historian: Battery Historian is a tool to analyze battery consumers using Android "bugreport" files.​

安卓应用测试&Monkey&MonkeyScript&MonkeyRunner&pyhton性能工具脚本_monkey_18

 具体使用方式,百度一下吧。

8.3 使用jar包解析数据

我们通过jar包,也是解析的adb bugreport 产生的数据。

jar包地址:

​GitHub - 18713341733/bugreport​

命令:

adb bugreport > bugreport.txt

在当前目录生成了一个压缩文件bugreport.zip

解压bugreport.zip。解压之后,有一个文件名称带有日期的txt文件。

类似于bugreport-TAS-AN00-HUAWEITAS-AN00-2022-08-19-11-24-15.txt

我们使用jar包,就是具体解析的这个文件。

将这个文件重命名为 bugreport.txt,然后将jar包与txt文件放在同一目录下,执行

java -jar chkbugreport.jar bugreport.txt

即可在当前目录生成报告。

安卓应用测试&Monkey&MonkeyScript&MonkeyRunner&pyhton性能工具脚本_包名_19

 打开index.html,就是报告

九、Monkey日志分析

当我们使用monkey命令执行时:

adb shell monkey -p com.xxx.Test --throttle 500 --ignore-crashes --ignore-timeouts --ignore-security-exceptions --ignore-native-crashes --monitor-native-crashes -v -v -v 1000>/Users/zhaohui/Desktop/monkeylog.txt

对monkeylog.txt文件的分析

7.1  ANR 应用程序无响应对话框

ANR(Application Not Response)是指在Android上,应用程序响应不够灵敏时,系统会向用户显示的一个对话框。 用户可以选择“等待”而让程序继续运行,也可以选择“强制关闭”。

安卓应用测试&Monkey&MonkeyScript&MonkeyRunner&pyhton性能工具脚本_应用程序_20

7.1.1 ANR分析:

​教你如何 分析 Android ANR 问题 - 走看看​

1、查看monkey的log

2、/data/anr/traces.txt

3、查看logcat日志ANR

在monkey log文件中,搜索ANR,如下图

安卓应用测试&Monkey&MonkeyScript&MonkeyRunner&pyhton性能工具脚本_android_21

1、anr发生的页面

2、每个进程的CPU 利用率

7.1.2   traces.txt 文件

adb shell

进入linux 系统

在/data/anr/目录下,有个traces.txt文件

取出这个文件,在电脑终端执行命令

adb pull /data/anr/traces.txt .

 分析这个文件。

系统发生ANR,一定会记录在这个文件里。在每次执行稳定性测试时,可以手动清理这个文件。

7.2  Monitor&DDMS

Monitor 集成了DDMS,也可以单独使用DDMS

在终端输入Monitor ,启动Monitor

看log cat日志

安卓应用测试&Monkey&MonkeyScript&MonkeyRunner&pyhton性能工具脚本_应用程序_22

安卓应用测试&Monkey&MonkeyScript&MonkeyRunner&pyhton性能工具脚本_包名_23

 集成了DDMS

安卓应用测试&Monkey&MonkeyScript&MonkeyRunner&pyhton性能工具脚本_应用程序_24

 1、1点击,出现logcat

2、双击logcat放大

7.3  Exception & Crash

异常Exception 通常伴随着Crash。

1、查看monkey的log日志

2、查看logcat日志Crash

7.4 monkey日志分析步骤

1、按关键字进行搜索,ANR、Exception、Crash

a、无响应问题可以在日志中搜索 “ANR” 。

b、崩溃问题搜索 “CRASH” 。

c、内存泄露问题搜索"GC"(需进一步分析)。

d、异常问题搜索 “Exception”(如果出现空指针, NullPointerException,需格外重视)。

2、找到有问题的地方,查看上下文信息

3、重点查看log中第一个switch,Monkey执行的是那一个Activity 上下文信息,有没有报错之类的。一般错误都会显示在这个后面

安卓应用测试&Monkey&MonkeyScript&MonkeyRunner&pyhton性能工具脚本_monkeyrunner_25

4、查看monkey里面出错钱的一些事件动作,可以手动执行该动作

5、进行问题复现,可以使之前执行的monkey命令再执行一遍,注意seed值要一致 

搜ANR,如果搜索出来的量 很大,那么搜索的时候,ANR后加一个空格,这样结果就会减少。

在log的最开始都会显示Monkey执行的seed值、执行次数和测试的包名。

报错信息能分析就分析,不能分析就把关键词搜索到的错误信息截图发给开发。

十、MonkeyScript脚本


MonkeyScript 是官方提供的,除了像Monkey一样随机乱点之外,还可以通过编写脚本的形式,完成一系列固定的操作。

MonkeyScript 提供一整套完善的 API 来进行支持,主要还是基于坐标点的操作,包含常用的:点击、长按、输入、等待等操作。

MS脚本只要是文本即可,不关心后缀是什么,所以编写时不要添加后缀,保存文本格式即可。

MonkeyScript 执行命令:

adb shell monkey -f <scriptfile> <event-count>

<scriptfile>MonkeyScript 脚本

<event-count> 执行次数

10.1  MonkeyScript 常用命令

一、DispatchTrackball 轨迹球事件

DispatchTrackball(long downtime,long eventtide,int action,float x,float y,float pressure,float size,int metastate,float xprecision,float yprecision,int device,int edgeflags)

注意:按一个键需要两个轨迹球事件 。

轨迹球常用命令:

1、int action

指具体操作的动作。action: 0代表按下,1代表谈起,一个点击事件,需要执行0和1两个。

2、float x,float y

x 与y 的坐标

以上2个是轨迹球常用命令,需要根据具体情况进行修改。

轨迹球非常用命令:

以下几个命令,在实际使用时,直接复制用就可以了,不用进行修改,所以也不用关注这几个命令是啥意思。

long downtime指键最初被按下的时间

long eventtide 指事件发生的时间

float pressure 压力事件的大小(0-1)

float size 触摸的记事值(0-1)

int metastate 当前按下mate键的标识

二、DispatchPointer 点击事件

按一个键需要2个点击事件

三、DispatchString 输入字符串命令

DispatchString(String text)

四、LaunchActivity 启动应用

LaunchActivity(package,Activity)

 五、UserWait 等待事件

UserWait(1000)

单位毫秒

六、DispatchPress 按下键值

DispatchPress(int keycode)

如按下回车键:

DispatchPress(66) 

 DispatchPress 与 DispatchPointer 区别:

DispatchPointer 点击的是屏幕(坐标)

 DispatchPress 点击的是键盘,如点击回车键、点击a键、f键等。

Android KeyCode 列表:


遇到不知道的键,需要自己去百度一下,以下是部分键的int值。

KEYCODE_CALL

拨号键

5

KEYCODE_ENDCALL

挂机键

6

KEYCODE_HOME

按键Home

3

KEYCODE_MENU

​菜单​​键

82

KEYCODE_BACK

返回键

4

KEYCODE_S​​EA​​RCH

​搜索​​键

84

KEYCODE_CAMERA

拍照键

27

KEYCODE_FOCUS

拍照对焦键

80

KEYCODE_POWER

电源键

26

KEYCODE_NOTIFICATION

通知键

83

KEYCODE_MUTE

话筒静音键

91

KEYCODE_VOLUME_MUTE

扬声器静音键

164

KEYCODE_VOLUME_UP

音量增加键

24

KEYCODE_VOLUME_DOWN

音量减小键

25

10.2   MonkeyScript 脚本编写

手机设置,打开开发者模式,打开 指针位置,这样我们就可以看到点击的坐标。

下面以测试登录功能为例:

模板:

type=user
count = 1
speed = 1.0
start data >>
LaunchActivity(Activity)
UserWait(1000)
DispatchPointer(0,0,0,303,312,0,0,0,0,0,0,0)
DispatchPointer(0,0,1,303,312,0,0,0,0,0,0,0)
UserWait(1000)
DispatchString(1234566)
UserWait(100)
DispatchPointer(0,0,0,345,393,0,0,0,0,0,0,0)
DispatchPointer(0,0,1,345,393,0,0,0,0,0,0,0)
UserWait(100)
DispatchString(1234567)
UserWait(1000)
DispatchPointer(0,0,0,100,100,0,0,0,0,0,0,0)
DispatchPointer(0,0,1,100,100,0,0,0,0,0,0,0)
UserWait(1000)
DispatchPointer(0,0,0,361,507,0,0,0,0,0,0,0)
DispatchPointer(0,0,1,361,507,0,0,0,0,0,0,0)
UserWait(3000)

注意:

顶部4行命令,是MonkeyScript 固定的脚本头,需要写在脚本的最前面。

type=user
count = 1
speed = 1.0
start data >>

在脚本中,脚本头是一直不变动的,为了避免写错,可以直接复制粘贴最保险。

在 start data>> 之后就可以正式开始编写 monkey 脚本了。

在脚本中,使用 ​​#​​ 号,对单行进行注释。

例子二:

type=user
count = 1
speed = 1.0
start data >>
LaunchActivity(com..xxx.tTest,com.xxx)
UserWait(1000)
DispatchPointer(0,0,0,956,2283,0,0,0,0,0,0,0)
DispatchPointer(0,0,1,956,2283,0,0,0,0,0,0,0)
UserWait(1000)

DispatchPointer(0,0,0,402,440,0,0,0,0,0,0,0)
DispatchPointer(0,0,1,402,440,0,0,0,0,0,0,0)

UserWait(1000)

DispatchPointer(0,0,0,342,974,0,0,0,0,0,0,0)
DispatchPointer(0,0,1,342,974,0,0,0,0,0,0,0)

DispatchString(1234566)

UserWait(1000)

DispatchPointer(0,0,0,628,2028,0,0,0,0,0,0,0)
DispatchPointer(0,0,1,628,2028,0,0,0,0,0,0,0)

UserWait(3000)

保存文件,名称为mytset。将脚本从电脑push到手机里。

安卓应用测试&Monkey&MonkeyScript&MonkeyRunner&pyhton性能工具脚本_android_26

  adb push mytest /sdcard/

我将mytset脚本放到/sdcard/目录下,之后在电脑的终端上执行以下命令:

 MonkeyScript 执行命令:

adb shell monkey -f /sdcard/mytest -v 10 > /Users/zhaohui/Desktop/monkey.txt

1、adb shell mkdir /sdcard/script 在设备上创建script文件夹用于存放脚本

2、将本地脚本文件push到设备中上面创建的文件夹中。例如adb push /Users/userName/Desktop/testLogin空格/sdcard/script,/Users/userName/Desktop/testLogin就是你脚本在本地的存放路径。

3、执行

adb shell monkey -f /sdcard/script/你的脚本名称 –v –v 10 >C:\monkey.txt

>C:\monkey.txt为日志输出路径。

例子三:

1、启动APP

2、点击地址栏

3、删除原有地址

4、输入www.baidu.com

5、点击回车

6、点击回车

7、点击搜索框

8、输入字符串test

9、点击回车

10、点击搜索按钮

11、等待搜索结果

type=user
count = 1
speed = 1.0
start data >>

LaunchActivity(com,android.browser,com.android.browser.BrowserActivity)
UserWait(1000)
DispatchPointer(10,10,0,200,100,1,1,-1,1,1,0,0)
DispatchPointer(10,10,1,200,100,1,1,-1,1,1,0,0)
DispatchPress(112)
DispatchString(www.baidu.com)
DispatchPress(66)
UserWait(1000)
DispatchPointer(10,10,0,300,400,1,1,-1,1,1,0,0)
DispatchPointer(10,10,1,300,400,1,1,-1,1,1,0,0)
UserWait(1000)
DispatchString(test)
UserWait(1000)
DispatchPress(66)
UserWait(1000)

10.3 执行脚本

1、adb shell mkdir /sdcard/script 在设备上创建script文件夹用于存放脚本

2、将本地脚本文件push到设备中上面创建的文件夹中。例如adb push /Users/userName/Desktop/testLogin空格/sdcard/script,/Users/userName/Desktop/testLogin就是你脚本在本地的存放路径。

3、执行

adb shell monkey -f /sdcard/script/你的脚本名称 –v –v 10 >C:\monkey.txt

>C:\monkey.txt为日志输出路径。

十一、MonkeyRunner介绍

​https://www.jianshu.com/p/30532d06306b​

MonkeyRunner工具使用Jpython(使用Java编程语言实现的Python)写出来的。MonkeyRunner是安卓SDK提供的功能。MonkeyRunner在Android_sdk中的位置:tools目录下。

MonkeyRunner 跟monkey没有任何关系。Monkey通过在设备直接运行adb shell命令来生成随机事件进行测试。MonkeyRunner通过API发送特定的命令和事件来控制设备。

MonkeyRunner提供了多个API,通过MonkeyRunner API可以编写一个Python程序来模拟操作控制Android设备App,测试其稳定性并通过截屏记录出现的问题。

MonkeyRunner工具主要设计用于在功能/框架级测试应用程序和设备。支持java脚本和python脚本。

11.1 环境搭建&启动:

安装好Android SDK后,配置MonkeyRunner环境变量(将MonkeyRunner的路径放入Path)。在cmd中输入MonkeyRunner出现如下显示内容说明安装成功,使用Ctrl+D退出。

11.2 MonkeyRunner API介绍&常用命令

MonkeyRunner主要分为三个类:

1、MonkeyRunner:它是一个MonkeyRunner程序提供工具方法的类,这个类提供了用于连接MonkeyRunner到设备或模拟器的方法,同时还提供了用于创建一个MonkeyRunner程序的用户界面以及显示内置帮助的方法。

2、MonkeyDevice:它是一个设备或模拟器的类,这个类提供了安装和卸载程序包、启动一个活动以及发送键盘或触摸事件到应用程序的方法,同时提供也可以用这个类来运行测试包。

3、MonkeyImage:它是一个截图对象的类,这个类提供了截图、将位图转换成各种格式、比较两个MonkeyImage对象以及写图像到文件的方法。

 官方文档:​​http://www.android-doc.com/tools/help/monkeyrunner_concepts.html#​​  

11.2.1 MonkeyRunner类

提供连接真机和模拟器、输入、暂停、警告框等方法

API

功能

alert()

警告框

choice()

选项列表框

help()

API帮助文档

input()

输入

sleep()

暂停

waitFor Connection()

等待设备连接

常用方法:

from com.android.monkeyrunner import Monkeyrunner as mr

print("connect devices...")

device=mr.waitForConnection(5,'127.0.0.1:62001')

1、alert 警告框

MonkeyRunner.alert(String message,String title,String okTitle)

message: 弹出对话框内容

title:对话框的标题栏显示内容,默认值为“Alert”

okTitle: 对话框的按钮,默认值为“OK"

 2、waitForConnection

等待设备连接,多个设备,需要指明哪个设备。

MonkeyRunner.waitForConnection(float timeout,string deviceId)

timeout: 等待超时时间,默认值为永久等待

deviceId:通过设备ID识别手机,如果只有一台手机,不需要输入。

11.2.2 MonkeyDevice类

提供安装和卸载程序包、开启activity、发送按键和点击事件、运行测试包等

API

功能

broadcastIntent()

发送广播

drag()

拖动

getProperty()

获取当前设备属性

getSystemProperty()

获取当前设备属性

installPackage()

安装应用

instrument

执行测试用例

press()

按键

reboot()

重启

removePackage()

删除指定Package

startActivity()

启动应用

touch()

点击

常用方法:

installPackage(string path)

removePackage(string package)

startActivity(string uri, string action, string data, string mimetype, iterable categories dictionary extras, component component, flags)
touch(integer x, integer y, integer type)

touch参数说明:

  • integer x:x坐标值
  • integer y:y坐标值
  • integer type:key event类型(如: DOWN:按下事件 UP:弹起事件 DOWN_AND_UP:按下弹起事件 )
drag(tuple start, tuple end, float duration, integer steps)

drag参数说明: 

  • tuple start:拖拽起始位置,为tuple类型的(x,y)坐标点。
  • tuple end,拖拽终点位置,为tuple类型的(x,y)坐标点。
  • float duration,拖拽手势持续时间,默认为1.0s。
  • integer steps,插值点的步数,默认值为10。

11.2.3 MonkeyImage类

用来保存各种格式的测试截图,并可以进行图像对比

API

功能

convertToBytes()

转换图像格式

getRawPixel()

获取当前坐标像素元组

getRawPixellnt()

获取当前坐标像素值

sameAs()

图像对比

writeToFile()

保存图像文件到指定的文件路径

getSubImage()

截取子图像

takeSnapshot()

屏幕截图

常用方法:

  • takeSnapshot():屏幕截图
  • writeToFile():保存图像文件到指定的文件路径

 编写Python测试代码:

# coding=utf-8 

# 引入本程序所用到的模块
from com.android.monkeyrunner import MonkeyRunner, MonkeyDevice, MonkeyImage

# 连接手机设备
device = MonkeyRunner.waitForConnection()

# 截图
result = device.takeSnapshot()
# 将截图保存到文件
result.writeToFile('E:\\manage\\Test1_001.png', 'png')

# 卸载APP
device.removePackage('com.baidu.searchbox')
print('Uninstall Success!')

# 暂停5秒
MonkeyRunner.sleep(5)

# 截图
result = device.takeSnapshot()
result.writeToFile('E:\\manage\\Test1_002.png', 'png')

# 安装新的APP
device.installPackage(r'E:\Android_apk\baidusearch1006979t.apk')
print('Install Success!')

# 暂停5秒
MonkeyRunner.sleep(5)

# 截图
result = device.takeSnapshot()
# 将截图保存到文件
result.writeToFile('E:\\manage\\Test1_003.png', 'png')

十二、MonkeyRunner脚本实战

作者:Cyzhouke
链接:https://www.jianshu.com/p/30532d06306b

 

12.1、测试场景

使用MonkeyRunner连接设备,进行自动安装并启动APP,完成登录功能,并截图保存到指定目录下

12.2、思路分析

步骤:
1、连接设备
2、安装App
3、启动App
4、点击用户名,密码输入框,完成输入
5、点击登录
6、截图

12.3、代码(考研帮app)

下载考研帮apk

from com.android.monkeyrunner import MonkeyRunner as mr

from com.android.monkeyrunner import MonkeyDevice as md

from com.android.monkeyrunner import MonkeyImage as mi

#启动服务
print("-----connect devices-----")
device=mr.waitForConnection()
print("-----succeed start-----")

print("-----install app-----")
device.installPackage(r"F:\kaoyan3.1.0.apk")
print("-----succeed install-----")

print("-----start App-----")
package="com.tal.kaoyan"
activity="com.tal.kaoyan.ui.activity.SplashActivity"
runComponent=package+"/"+activity
device.startActivity(component=runComponent)

mr.sleep(3) #等待

#点击取消更新按键
print("-----click cancel update-----")
device.touch(726.2,1096.4,"DOWN_AND_UP") #对取消更新按钮执行点击弹起操作
mr.sleep(3)

#点击跳过
print("---click skip button---")
device.touch(982,69,"DOWN_AND_UP") #对跳过按钮执行点击弹起操作
mr.sleep(3)

#输入账号
print("input username and password")
device.touch(194,381,"DOWN_AND_UP") #对用户名输入框执行点击弹起操作
mr.sleep(1)
device.type("zxw1234") #输入登录账号
device.touch(194,472,"DOWN_AND_UP") #对密码输入框执行点击弹起操作
mr.sleep(1)
device.type("zxw123456")

#点击登录
device.touch(550,628,"DOWN_AND_UP")
mr.sleep(3)

print("-----screen shot-----")
screenshot=device.takeSnapshot() #截屏
screenshot.writeToFile(r"C:\Users\k.zhou\Pictures\Saved Pictures\kyb.png","png") #保存图片

 

十三、python GUI编程(tkinter)基于adb 编写安卓助手

工具exe资源下载地址:


源码地址:

​https://github.com/18713341733/PhoneAssistant​

基于python+adb 编写的安卓助手工具。支持录屏、截图、日志抓取、性能数据查看等功能。目前的功能不是很完善,只是单纯的打个样儿。

大概就是这么一个页面

安卓应用测试&Monkey&MonkeyScript&MonkeyRunner&pyhton性能工具脚本_应用程序_27

 这个工具是很久之前用python2写的,虽然有点老,但是可以自己手动改改成python3

十四、内存泄漏分析

一、什么是内存泄露、内存溢出,与两者的区别联系

    内存泄露 memory leak,是指程序在申请内存后无法释放已申请的内存空间,一次内存泄露危害可以忽略,但是内存泄露堆积后果很严重,无论多少内存迟早会被占光。

    内存溢出 out of memory,是指程序在申请内存时没有足够的内存空间供其使用,出现内存溢出;比如申请了一个integer,但给他存了long才能存下的数,这就是内存溢出。

(MAX_VALUE = 0x7FFFFFFFFFFFFFFFL long的最大值/ MAX_VALUE = 0x7FFFFFFF integer的最大值)

memory leak会最终导致out of leak

二:内存泄露的检测工具的种类

    1、开发工具Android studio

       优点:a:可以很直观的看到应用占用内存波状图与实时内存数据;

              b:可以实时查看应用的CPU使用情况;

              c:实时查看APP运行日志;

              d:截屏功能。

       缺点:需要使用debug包连接使用

    2、DDMS中VM Heap功能

       优点:a:可以分析看到内存泄露出处;

              b:可以实时查看应用的CPU使用情况;

              c:实时查看APP运行日志;

              d:截屏功能。

       缺点:a:需要使用debug包连接使用

             b:手机端APP性能变差,高概率导致app无响应

三:内存检测工具的使用方法:

    Android studio的连接和使用:

    1、打开android-studio-bundle-141.2288178-windows.exe安装包安装;

     2、手机连接电脑,使用adb devices命令,打开devices视图,确认手机成功连接;

     3、启动android studio,Tools->Android->勾选enable ADB integration;

     步骤3详见如下附图一: