App测试关注点:ANR、APM
ANR
一、ANR是什么 ANR(Application Not Responding)
具体说,在以下情况发生时,会发生ANR(可能在不同ROM 中时间有所更改):
• 用户的输入在5s内没被App响应;
• BroadcastReceiver的onReceiver()超过10s;
• Service中各生命周期函数执行超过20s。
一些典型的ANR 问题场景
1)最常见的错误,UI线程等待其它线程释放某个锁,导致UI线程无法处理用户输入;
2)游戏中每帧动画都进行了比较耗时的大量计算,导致CPU忙不过来;
3)Web应用中,网络状态不稳定,而界面在等待网络数据;
4)UI线程中进行了一些磁盘IO(包括数据库、SD卡等等)的操作,在个别设备上因为硬件损坏等原因阻塞住了;
5)手机被其他App占用着CPU,自己获取不到足够的CPU 时间片,纯属误伤。
通过ANR 日志定位问题 当ANR发生时,我们往往通过Logcat和traces文件(目录/data/anr/)的相关信息输出去定位问题。主要包含以下几方面: 1)基本信息,包括进程名、进程号、包名、系统build号、ANR 类型等等;
2)CPU使用信息,包括活跃进程的CPU 平均占用率、IO情况等等;
3)线程堆栈信息,所属进程包括发生ANR的进程、其父进程、最近有活动的3个进程等等。
二、测试过程发现ANR的现状
1、在平常测试中,ANR有基本测试不到,因为ANR基本发生在垃圾设备中,弱网络,频繁操作。
2、问题不必现,即使看到了问题,定位麻烦:要去data/anr.txt 文件里面查找。必须root,没有对应关系,分析复杂,导出文件就必须依赖手机零距离。
三、引入ANR检测工具 由于anr问题不必现,因此引入以下ANR检测工具,当anr问题出现时,自动dump手机中的日志信息如trace文件、堆栈信息等,基本原理如下:
3.1、基本原理 检测到UI主线程卡顿时间超过设定的时间,如4s,即dump trace文件以及堆栈信息,同时抛出异常,收集信息,根据这些文件信息即可定位到发生anr的原因
3.2.1如何在源代码中插入anr检测工具
步骤一:源代码libs中添加anr.jar
步骤二:在 Application 的onCreate中添加初始化sdk的代码 initSDK(Context context, String appKey, boolean watchdog, int time) 其中time表示检测判定线程是否超时(发生anr)的门限值,单位:ms
步骤三:正常编译打包apk
3.2.2如何测试发现并定位anr问题 安装步骤3.2.1编译打包插入anr检测的apk测试app,任意操作(monkey/case),当发生anr时,会自动杀掉进程,并在本地生成日志文件日志路径:/sdcard/lynq_anr下有两个文件夹
以Baidu Browser启动为例。Baidu Browser启动过程主线程过长,在低端机上容易导致发生anr;线程超时,app进程kill掉,查看手机本地trace日志, Crash信息包括trace文件以及堆栈信息
分析trace文件。Trace文件通过eclipse中的DDMS可以查看具体发生ANR卡顿的原因
通过real Time/Call从大到小排序,找到对应的与代码相关消耗时间最大的方法 可以看出书签数据库初始化消耗CPU时间最长。
查看耗时最长方法对应的源代码,找到对应的源代码如下: 主要是数据库的初始化在启动的主线程中进行,容易导致超时在低端机上发生anr问题。
APM
APM全称是Application Performance Management,是对应用的性能、可靠性进行线上的监控和预警的一种机制。
一、 内存
内存是影响用户直接交互体验的重要因素,它直接影响到App的使用流畅度。主要监控内存的四个指标,包括内存峰值,内存均值,内存抖动,内存泄露。可以通过以下两种方式获取内存信息:
1、 Runtime类中的方法freeMemory,totalMemory,maxMemory;
2、 adb shell dumpsys meminfo package_name or pid //使用程序的包名或者进程id显示内存信息
二、 CPU
CPU与内存一样,是APM监控的重点,它直接影响了用户使用APP的发热、卡顿等表现。主要监控CPU的两个性能指标,包括CPU峰值,CPU均值。可以通过以下两种方式获取CPU信息:
1、 adb shell dumpsys cpuinfo
2、 直接 adb shell cat进去proc/cpuinfo/下面
public String[] getCpuInfo() { String str1 = "/proc/cpuinfo"; String str2 = ""; String[] cpuInfo = {"", ""}; String[] arrayOfString; try { FileReader fr = new FileReader(str1); BufferedReader localBufferedReader = new BufferedReader(fr, 8192); str2 = localBufferedReader.readLine(); arrayOfString = str2.split("//s+"); for (int i = 2; i < arrayOfString.length; i++) { cpuInfo[0] = cpuInfo[0] + arrayOfString[i] + " "; } str2 = localBufferedReader.readLine(); arrayOfString = str2.split("//s+"); cpuInfo[1] += arrayOfString[2]; localBufferedReader.close(); } catch (IOException e) { } return cpuInfo; }
三、 启动时间
启动时间是用户对App的第一直接体验,启动时间的长短,在很大程度上决定着用户保留App的意愿。
主要监控三个性能指标,包括冷启动时间,热启动时间,页面渲染时间。
可以通过两种方式来获取启动时间:
1、 Am Start 指令监控与自动化 adb shell am start -W -n packagename/packageName.MainActivity
2、 AOP切入生命周期 采用开源框架AspectJ对代码进行打点,将启动时间打印出来
四、 UI性能
UI性能指的是用户在实际使用过程中,对App的页面操作时的直接体验,是用户评价一个App好与不好的一个重要部分。
主要监控三个性能指标,包括重绘性能,滚动帧率,ANR三个指标,可以通过三种方式来监控:
1、 Handler Log printer
2、 Choreographs监控
3、 要定制性能监控工具,可以通过FrameMetricsAggregator来收集App某个特定部分的帧渲染时间,然后通过Firebase Preformance Monitoring 来记录和分析数据。
五、 耗电量
耗电量是用户厌烦一个App的重要原因,App可以不好用,但是却不能被用户发现大量损耗电量。
主要监控两个性能指标,包括耗电量,发热量两个指标,可以通过三种方式来收集数据:
1、 WakeLock监控
2、 BatteryManager获取电池信息状态
3、 BatteryHistorian监控耗电
六、 网络性能
国内的网络环境错综复杂,而大多数App又是对网络强依赖,所以良好的网络监控和检测,有助于提高App的网络性能。
主要监控五个性能指标,包括复杂网络环境,请求流量,接口往返时间和首包时间,接口数据异常,CDN及服务器异常等五个指标。可以通过三种方式来收集数据:
1、 AOP监控网络请求接口
2、 错误状态监控
3、 服务端日志分析
七、 用户行为路径
收集用户行为路径,是了解用户App使用习惯以及提高用户所需要信息的重要途径。
主要监控两个性能指标,包括页面停留时长,操作路径,可以通过AOP监控用户点击路径。
Androind系统Android适配测试策略项目实战
项目分成四个阶段:需求/交互/视觉阶段、开发阶段、测试阶段、发布阶段,每个阶段都需要各负责人对适配做出明确处理。
需求/交互/视觉阶段,需要需求方在BRD中做简要说明,需要交互设计师和视觉设计师在各自的交互稿和视觉稿中明确指出,哪些页面需要横竖屏适配,哪些页面需要适配手机和平板,手机和平板各自适配的样式怎样调整;
开发阶段,需要开发同学对需要适配的需求点做好技术设计和coding,包括手机平板横竖屏、第三方组件新增和升级以及新Android SDK/API使用;
测试阶段,需要测试通过分别通过白盒适配方式和机型适配方式进行有针对性的适配测试;白盒适配主要针对于开发过程中适配的代码进行测试。机型适配的基础需要一个适配的机器列表,这个机器列表按照经验通过四部分组成,包括TOP机型、OS机型、国外机型和SOC/ROM机型。机型列表总结好后,就可以通过手工适配、平台Monkey、云测平台等多种手段进行适配测试。
发布阶段,通过众测及时发现Beta阶段的适配问题;通过灰度及时处理真实用户遇到的适配问题。
对于测试同学而言,需要在项目的各个阶段都关注适配问题,并给出合理的适配测试用例,并在项目过程中通过各种适配测试手段,尽可能多的发现适配问题,尽可能将适配问题出现的概率降低。
开发者选项
第一项:提交错误报告。
这个不需多说,提交当前设备状态的信息以邮件形式发送。
第二项:桌面备份密码。
在这里可以设置或更改桌面完整备份的密码,据估计是谷歌在线备份的相关应用功能。就不要动了。
第三项:不锁定屏幕
底下的描述很清楚,充电的时候屏幕不会自动关闭。不建议开启。
第四项:对SD卡进行读写保护
这一项千万别动,写保护之后,你无法更改,删除存储卡里的文件。需要用电脑解除权限保护才可以!
第五项:USB调试
USB调试是安卓系统对外部程序开放权限,有一些程序如果要接管或者参与系统控制的话,就必须要把USB调试模式给打开,否则外部程序无法实现功能,所以平时一直开着就可以啦!
第六项:电源键菜单错误报告
在电源键菜单中添加提交错误报告的选项。
第七项: USB调试通知
开启后,连接USB,如果USB调试处于打开状态,则通知栏会出现一个”小鬼头“,如图,拉下通知,会告诉你USB调试已经打开。
第八项:允许模拟位置
是允许模仿位置是软件开发人员对开发的某些定位软件(一般为地图软件),做测试的时候使用的,功能是模拟手机目前所处的位置(比如手机当前实际位置在中国,但测试软件时要求测试条件为美国,就可以使用该功能进行测试软件模拟定位)。
第九项:选择调试应用
这个选项是允许开发者在电脑上调试手机应用。一般情况下无用。
第十项:等待调试器:
这个没有就没有用,无法操作。
第十一项:通过USB验证应用:
通过检查安装的应用是否存在有害行为,默认是选择的。不需设置。
第十二项:显示触控操作
为触摸操作提供视觉提示(一个小圆点,挺好玩的),最多试过十点都可以显示。
第十三项:指针位置
屏幕叠加层显示当前触摸数据,在屏幕上层叠加一层与当前进程不冲突的显示平面,以横坐标纵坐标交叉的定位方式,定位你的手指在屏幕上划过的轨迹,支持多点的坐标位置显示。
第十四项:显示布局边界
把屏幕里的视觉元素切割成无数个部分,这个普通用户无用。
第十五项:显示GPU视图更新
屏幕上的区域更新时闪烁响应的屏幕区域各种闪烁
第十六项:
和十五项雷同,只不过这个是整个屏幕都跟着闪烁……对此功能比较无语
第十七,十八,十九项
这个是更改窗口动画速度的,就是我们常说的特效动画的速度。
第二十项:通用HW叠加层
这个选项比较有争议, 如果没有这个,所有应用将共享视频内存,将不会经常检查碰撞与裁剪以显示一个合适的图像(什么玩意?),这会耗费大量处理能力。而HW叠加层允许应用有单独的视频内存,性能自然要好些。综上所述,“停用HW叠加层”还是不要勾选的好
第二十一项:强制GPU渲染
在应用程序中使用2d程序加速,以前版本的图形界面的渲染工作只有部分由GPU来完成,其他的还是由CPU来做,选上这个就是强制由GPU来渲染,减轻CPU的压力,就是俗称的硬件加速,会增加界面的流畅程度。但是有一些程序是不兼容的,很容易闪退。大部分程序,QQ,UC,微信之类的都没事 。建议打开这一项。
第二十二项:强制启用4x MSAA:
抗锯齿,让游戏人物等东西的边缘看着更柔和,更平滑,开启后,画质有大幅的提升。
第二十三项:启动严格模式
应用程序在主线程上执行长时间操作时,屏幕闪烁!在你打开某个应用后,点返回退出但在进程中仍然运行,长时间后屏幕会闪烁提示你在主线程上还是正在运行的应用程序。
第二十四项:显示CPU使用情况
在屏幕上层叠加一层与当前进程不冲突的显示平面,右上角显示当前CPU正在处理的进程。
第二十五项:GPU呈现模式分析
这个暂时有什么作用,我也不太清楚……抱歉了
第二十六项:启用openGL跟踪
图形视角效果器,是手机制作图片软件的辅助工具,比如ps三d立体图,需要启用这个工具才能实现再编辑过程中的图片旋转,放大缩小复位等。
第二十七项:启用跟踪
貌似这个功能是程序开发者追踪函数用的。勿动
第二十八项:不保留活动
用户离开后即销毁每个活动,这个选项有利也有弊啊!它可以使你的系统运行更加流畅,但是在某些情况下,比如:我们从第一个文件夹复制东西到第2个文件夹 在回到第一个文件夹复制的地方时 ,又要重新寻找刚刚复制的那个地方 这点比较麻烦。还有地方特别是字数条目比较多的地方。我们在子菜单不操作时按返回键推出的话没有必要在使用它。
第二十九项:后台程序限制
自定义允许后台的程序个数
第三十项:显示所有“无响应”
为后台应用程序显示应用“程序无响应”对话框,就是很多在后台运行的你并看不到的进程,如果它无响应了,系统会显示该无响应进程的无响应对话框。
Adb常用命令
基本命令
adb devices
adb kill-server , adb start-server
adb install/uninstall
adb pull sdcard/pull.txt ./
adb push ./1.txt sdcard/
adb connect deviceName
进阶命令
adb shell pm list package :-s/-3/-f/-i
adb shell am start -n com.alibaba.aliexpresshd
adb shell am start -a android.intent.action.CALL -d tel:10086
adb shell am start -a android.intent.action.VIEW -d http://aliexpress.com
adb shell input text test
adb shell input keyevent KEYCODE_HOME
adb shell input tap 500 500
adb shell input swipe 900 500 100 500
adb shell input swipe 500 500 501 501 2000
adb shell screencap -p /sdcard/screen.png
adb shell screenrecord sdcard/record.mp4
adb shell dumpsys display
adb shell dumpsys battery
adb shell dumpsys cpuinfo
adb shell dumpsys meminfo
adb shell dumpsys activity
adb shell dumpsys package
adb shell dumpsys notification
adb shell dumpsys wifi
adb shell dumpsys power
adb tcpip 5555
adb shell dumpsys gfxinfo
APK打包过程