当前位置: 首页 > 科技观察

详细讲解Android应用性能测试方法和AndroidSDK中的辅助测试工具使用

时间:2023-03-19 20:10:08 科技观察

Android应用测试要点Android前端APP的性能测试一般针对以下几个方面:应用启动时间;CPU使用率;内存使用情况;流量消耗使用;能量消耗;流畅度等。一般来说,App的性能测试需要借助不同的工具来完成。本章将重点向读者介绍针对不同的性能测试指标选择何种工具以及如何使用这些工具。因为Android手机是Linux内核,最简单的命令就是使用top命令查看手机的CPU和内存使用情况。具体操作:PC端成功安装AndroidSDK,手机成功连接PC安卓手机->设置->开发者选项->USB调试(勾选)在cmd窗口输入adbshell进入adbshell命令模式方法一:输入top,显示如下:具体参数含义如下:CPU占用率:User用户进程System系统进程IOWIO等待时间IRQ硬中断时间CPU使用率(指占用时间最小时间片内,单位jiffies。或指占用的进程数):User用户态运行时间,不包括负优先级进程NiceCPU时间被负优先级进程占用Sys内核态运行时间Idle等待时间other比IO等待时间IOWIO等待时间IRQ硬中断时间SIRQ软中断时间进程属性:PID进程在系统中的IDCPU%当前瞬时CPU占用率S进程状态,其中S表示休眠,R表示运行,Z表示死态,N表示进程的优先级值为负数。#THR程序当前使用的线程数Memory:VSSVirtualSetSize虚拟内存消耗(包括共享库占用的内存)RSSResidentSetSize实际使用的物理内存(包括共享库占用的内存)UIDUserid运行程序的名称当前进程程序名system_server备注:内存使用的大小有以下规则:VSS>=RSS>=PSS>=USSPSSProportionalSetSize实际使用的物理内存(按共享库占用内存的比例分配)USSUniqueSetSize进程单独占用的物理内存(不包括共享库占用的内存)应用启动时间测试adbshellamstart-W–n/am命令详细用法请参考章节am和pm命令注意:启动时间需要区分首次启动和非首次启动功耗测试请参考文章AndroidApp功耗测试方法Fluency和网络消耗测试请参考《移动应用测试神器PerfDog详解》一文接下来给大家介绍几款AndroidSDK内置的工具,可以帮助我们解决性能问题!Dumps命令Dumpsys命令默认打印出当前系统的所有服务信息。使用命令dumpsys|grep"DUMPOFSERVICE"查看以下内容:DUMPOFSERVICEDockObserver:DUMPOFSERVICESurfaceFlinger:DUMPOFSERVICEaccessibility:DUMPOFSERVICEaccount:DUMPOFSERVICEactivity:DUMPOFSERVICEalarm:DUMPOFSERVICEandroid.security.keystore:服务转储android.service.gatekeeper.IGateKeeperService:服务转储appops:服务转储appwidget:服务转储assetatlas:服务转储音频:服务转储备份:服务转储电池:服务转储batteryproperties:服务转储batterystats:服务转储bluetooth_manager:服务转储carrier_config:服务转储剪贴板:服务转储commontime_management:服务转储连通性:服务转储consumer_ir:服务转储内容:服务转储country_detector:服务转储cpuinfo:服务转储dbinfo:服务转储device_policy:服务转储deviceidle:服务转储devicestoragemonitor:服务转储diskstats:服务转储显示:服务转储display.qservice:服务转储梦想:服务转储drm.drmManager:服务转储保管箱:服务转储以太网:服务转储指纹:服务转储gfxinfo:服务转储graphicsstats:服务转储imms:服务转储输入:服务转储input_method:服务转储iphonesubinfo:服务转储isms:服务转储isub:服务转储jobscheduler:服务转储launcherapps:服务转储位置:服务转储lock_settings:服务转储media.audio_flinger:服务转储media.audio_policy:服务转储media.camera:服务转储media.camera.proxy:服务转储media.player:服务转储media.radio:服务转储media.resource_manager:服务转储media.sound_trigger_hw:转储服务media_projection:服务转储media_router:转储服务media_session:转储服务meminfo:转储服务midi:转储服务mount:转储服务netpolicy:转储服务netstats:转储服务network_management:转储服务network_score:转储SERVICEnfc:DUMPOFSERVICE通知:DUMPOFSERVICE包:DUMPOFSERVICE权限:服务转储persistent_data_block:服务转储电话:转储服务电源:转储服务打印:转储服务processinfo:转储服务procstats:转储服务限制:转储服务rttmanager:转储服务samplingprofiler:转储服务scheduling_policy:服务转储搜索:服务转储传感器服务:服务转储串行:服务转储服务发现:服务转储simphonebook:服务转储sip:服务转储状态栏:服务转储电信:服务转储telephony.registry:服务转储文本服务:服务转储信任:服务转储uimode:服务转储更新锁:服务转储usagestats:服务转储usb:服务转储用户:服务转储振动器:服务转储语音交互:服务转储墙纸:服务转储webviewupdate:服务转储CEwifi:DUMPOFSERVICEwifip2p:DUMPOFSERVICEwifiscanner:DUMPOFSERVICEwindow:关键信息display:activity:显示所有活动信息cpuinfo:显示CPU信息window:显示键盘、窗口及其关系wifi:显示wifi信息batteryinfo$package_name:电量信息和CPU使用时间packagepackagename:获取安装包信息usagestats:各界面启动时间statusbar:显示状态栏相关信息meminfo:内存信息(meminfo$package_name或$pid使用程序的包名或processid显示内存信息)diskstats:磁盘相关信息battery:电池信息alarm:显示告警信息比如输出一个应用的cpu信息,可以使用命令dumpsyscpuinfo|你的apppackageam命令am全称activitymanager,使用am模拟各种A系统行为,比如启动一个activity,强制停止进程,发送一个广播进程,修改设备屏幕属性等。pm命令pm全称packagemanager,可以使用pm命令模拟android行为或者查询设备上的应用等。GPU渲染模式分析GPU:图形处理单元(GraphicsProcessor),主要反映应用的卡顿现象。IOS和Android的对比主要是以下三个原因:速度曲线当滑动界面再松手时,界面会继续滑动,然后速度会下降,直到速度为0后停止。iOS下的减速过程比较慢,尤其是快要停下来的时候,慢慢停下来,视觉上有一种流畅的感觉;在安卓下,从放手到停下来的速度要快很多,比起一种突然停下来的感觉。从数据/技术的角度来看这件事,我们滑动界面的最终目的不是“动”,而是“停”,所以只要顺利到达目的地,似乎过程越快完成越好,所以Android的选择是水到渠成的事情。但事实是,人们通常更喜欢iOS方式,它更流畅、更优雅。Framerate帧率:FPS是图像领域的定义,指的是每秒传输的帧数,一般来说,指的是动画或视频中的帧数。30FPS是一般视频录制常用的帧率,30FPS在快速动作时会感觉不流畅。60FPS是一般游戏常见的帧率。大多数时候,两者(Android和IOS)都可以保持60FPS左右的全帧率。但是偶尔会掉帧。而且在安卓上比在IOS上严重得多。掉帧导致卡顿,用户难免会在掉帧的一瞬间感觉到不够流畅。触摸响应速度从手指触摸触摸屏到处理触摸生成的图像显示在屏幕上需要时间。时间越短,感觉越舒服。在软件系统层面,Android的显示机制是app-->SurfaceFlinger-->Display,比传统的app-->Display多了一步。主要是这个原因,屏幕最终输出到屏幕的速度比传统方法要慢。帧(16.7毫秒)。综合分析:第1点影响最大,但与技术/设备无关。如果需要更改安卓APP或安卓系统,可以轻松调整到与IOS完全一致。但也正因为这是产品形态的差异而非单纯的技术优劣,这也成为了Android最不可能改变的事情。第二点的影响是其次的,当然是指目前大部分时间都能满帧的情况。这方面是Android从早期到现在进步最明显的方面,用了很多方法来优化帧率。但是即使现在安卓进化了很多,硬件性能也进化了很多,还是不可能完全杜绝丢帧。通俗地说,第三点就是手性。手性的重要性是不言而喻的,但现在差异比较微妙。调试是否掉帧前提条件:android系统4.0+“开发者选项”->“GPU渲染模式分析”->“在屏幕上显示为柱状图”,如下图:screen(基线)大约是16ms,如果超过这条线,很有可能会掉帧。蓝色代表测量和绘制显示列表的时间。红色表示OpenGL渲染显示列表所需的时间。黄色代表CPU等待GPU处理的时间。Transitiondrawingoverdrawingindicator在屏幕的一个像素上多次绘制,我们对UI性能的优化也可以通过开发者选项中的GPU透支工具进行分析。在Settings->DeveloperOptions->DebugGPUOverdraw中开启调试后(不同的设备可能位置或名称不同),可以看到下图2(分析设置当前界面的overdraw):颜色:DeviceMonitorDeviceMonitor是一个用来调试和分析Android程序的工具,包括:DDMSTracerforOpenGLESHierarchyViewerTraceview启动方法在Cmd窗口进入sdk目录下的\tools,输入:monitor前提条件:手机必须root,否则许多功能将不会被使用Uiautomatorvieweruiautomatorviewer是一个GUI工具,用于扫描和分析应用程序UI控件。uiautomatorviewer通过ADB向设备端发送dump命令,下载一个包含当前界面控件布局信息的xml文件。dumpviewhierarchyforuiautomatorTraceviewTraceview是android平台上搭载的一款非常优秀的性能分析工具,媲美Java的性能调优工具visualvm线程视图,可以方便的查看线程的执行情况,某个方法的执行时间,调用次数,in在整体中??的比例等,从而定位表现点。Start:点击下图中的StartmethodProfiling,如下图:a.Incl表示所有子函数消耗的时间也包含在计算中,Excl表示子函数的调用时间为不包含。通过比较可以判断耗时操作是发生在自身还是发生在子函数中。b.CpuTime表示cpu执行所占用的时间。RealTime包括CpuTime和等待切换时间等,所以一般大于CpuTime。通过比较可以判断耗时操作是否在CPU执行段内。C。以上四个指标对应的%表示该函数占总时间的比例。检查功能的时间比例很方便。d.Calls+RecurCalls/Total表示外部调用次数+递归次数/总次数。您可以查看来电次数是否符合您的预期。e.CpuTime/Call、RealTime/Call表示CPUTime和RealTime的总和占总调用次数的比值。看每次调用的耗时,一般可以通过一个简单的项目来判断每个函数的性能。单击Devices选项卡中的StartMethodProfiling按钮,需要停止时再次单击该按钮。DDMS概念:DDMS的全称是DalvikDebugMonitorService,为我们提供例如:测试设备截图,查看运行线程和堆信息,Logcat,广播状态信息,模拟电话,接收短信,虚拟地理坐标等等。DDMS会在IDE和测试终端(Emulator或connecteddevice)之间建立链接,它们使用各自独立的端口来监控调试器的信息,DDMS可以实时监控测试终端的连接状态。当有新的测试终端连接时,DDMS会抓取终端ID,通过adb构建调试器,从而实现向测试终端发送指令的目的。在monitor中启动DDMS,打开\Sdk\tools\monitor.bat,如下图所示:LogCatlogcat是Android中的一个命令行工具,可以用来获取程序的日志信息。Android日志信息有一个标签和它的优先级.log标签是对系统组件原始信息的简要说明。(例如:“View”是查看系统的标签)以下优先级按降序排列:V—Verbose(最低优先级)D—DebugI—InfoW—WarningE—ErrorF—FatalS—Silent(highestpriority,whichwereeverprinted)Thread查看进程包含的线程信息Heap查看进程使用的堆点击GC进行对象回收;判断内存泄漏:一般情况下,数据对象行中“TotalSize”值的大小决定是否会发生内存泄漏。a)持续运行当前应用,注意观察dataobject的TotalSize值;b)一般情况下,TotalSize的值会稳定在一个有限的范围内,也就是说,因为程序中的代码写的好,对象不会被阻塞。垃圾回收的情况,所以虽然我们的持续运行会不断产生很多对象,而在虚拟机不断GC的过程中,这些对象会被回收,内存占用会回落到一个稳定的水平;c)反之,如果代码中存在对象引用没有释放的情况,则每次GC后dataobject的TotalSize值不会明显下降。随着操作次数的增加,TotalSize值会越来越大,直到达到一个上限后导致进程被杀死。参数含义:1)DataObject:java对象。2)ClassObject:Class类型的对象,例如你将从java.lang.String.class或myObject.getClass()中得到什么。3)1,2,4,8字节数组:每个条目的字节数。1字节数组:byte、boolean2字节数组:char、short4字节数组:float、int8字节数组:double、long4)非-Java对象:非Java对象是一块内存,实际上不能从用Java编写的代码中访问。本质上,它是一团东西,卡在虚拟堆上,但对解释代码没有任何意义。不应该那么多。打开com.android.browser.hprof,分析内存。在使用mat之前,必须转换\tools\hprof-convinput.hprofoutput.hprofFileExplorer才能查看Android系统的目录文件。常用目录和文件说明如下:1、/mnt挂载点目录2、/etc系统主配置文件3、/systemAndroid系统文件4、/sysLinux内核文件5、/proc运行时文件6、/init.rc启动脚本7、/default.prop系统属性配置文件8、/data用户程序目录9、/dev存放与设备(包括外设)相关的文件(unix和linux系统都将设备视为文件)AllocationTracker检查分配给对象的内存inthreadsSystraceSystrace是Android4.1新加入的性能数据采样和分析工具。可以帮助开发者收集Android关键子系统(如surfaceflinger、WindowManagerService等Framework关键模块和服务)的运行信息,帮助开发者更直观的分析系统瓶颈,提升性能。注意:手机内核必须支持trace(可以查看/sys/kernel/debug/tracing目录是否存在)。运行状态等。在Android平台,主要由三部分组成:Kernel部分:Systrace利用了LinuxKernel中的ftrace功能。因此,如果要使用Systrace,就必须在内核中开启ftrace相关的模块。数据采集??部分:Android定义了一个Trace类。应用程序可以使用此类将统计信息输出到ftrace。同时,Android还有一个atrace程序,可以从ftrace中读取统计信息,交给数据分析工具进行处理。数据分析工具:Android提供了一个systrace.py(python脚本文件,位于AndroidSDK目录/tools/platform-tools/systrace)来配置数据采集方式(如采集数据标签、输出文件名等)和收集ftrace统计数据并生成结果web文件供用户查看。本质上,Systrace是对LinuxKernel中的ftrace的封装(ftrace的作用是帮助开发者了解Linux内核的运行时行为,以进行故障排除或性能分析。)。应用进程需要使用Android提供的Trace类来使用Systrace。点击下图中的CaptureSystemWidetrace,设置捕获的系统参数如下:注:trace.html需要使用googlechrome浏览器打开分析