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

苏宁水测基于Instruments检测iOS性能技术

时间:2023-03-20 21:40:15 科技观察

【.com原创稿件】1.背景在苏宁智慧零售战略中,移动应用占据重要地位,在线应用的用户体验直接影响产品推广.对于移动两大重要阵营之一的iOS系统来说,应用发布前的性能指标尤为重要。在不嵌入代码的前提下,Frogtest平台需要获取应用运行时的内存、CPU、FPS、冷启动时间、热启动时间等数据,提供给开发部门进行上线前的优化。苏宁现有的iOS应用性能测试数据,基本上是开发者在Mac环境下使用Xcode工具,根据被测应用源码或特定签名下的原生Instruments工具,获取应用冷启动时间、热启动时间、内存消耗等数据。、帧率等性能指标。对于测试人员来说,首先没有足够的Mac电脑提供,其次因为代码的保密性,无法为测试人员开发代码权限。同时,技术门槛也很高。为了让测试人员能够进行iOS应用性能测试,基于代码外的黑盒方法获取iOS应用性能数据,使用TraceUtility工具对数据进行分析,以图表的形式为测试人员提供iOS应用性能测试服务在前端页面上。2.技术选择及实现原理2.1Instruments工具组件介绍Instruments是Xcode的一个工具集,它为我们提供了强大的程序性能分析和测试能力。它作为一个独立的App存在,你可以在Xcode->OpenDeveloperTool->Instruments中打开它。打开后,功能组件页面如下图所示:1.TimeProfiler的使用简介:TimeProfiler顾名思义:一个时间分析工具,它会跟踪每一个的堆栈信息(stacktrace)线程根据设置的时间间隔(默认为1毫秒)。并且通过比较时间间隔之间的栈状态,计算出某个方法执行了多长时间,给出一个大概的值。2.CPUActivityLogCPU活动日志工具介绍;CPU活动仪器工具记录了设备正在做什么。3.CoreAnimation动画渲染使用介绍:CoreAnimation系统需要注意的一点是必须在真机上调试,用于调试离屏渲染、绘图、动画等操作,并检测FPS信息。4、ActivityMonitor的内存使用情况简介:1)Summary(数据汇总):Process(进程)内存使用、CPU使用时间等汇总信息:参数含义如下:processid-processid进程名-进程名用户名-用户名%CPU-cpu比例threads-线程realmem-实际使用内存virtualmem-虚拟内存architecture-architecturecputime-CPUtimesuddenterm-suddenterm(N/A:Notapplicable)2)Samples(样本列表)----一系列的采样(即不同时刻CPU使用时间和内存使用的样本值)参数含义如下:PhysicalMemoryWired——操作系统PhysicalMemoryActive的占用——操作系统以外进程占用的内存PhysicalMemoryInactive——最近释放的内存PhysicalMemoryUsed——profiling当前进程时使用的总内存PhysicalMemoryFree——当前可用内存TotalVMSize——Virtualmemoryusage五、EnergyUsageLevel介绍检查应用程序的功耗水平。电量使用级别为0-20,1/20:表示运行应用程序,电池寿命为20小时;20/20:表示运行app,续航时间只有1小时。2.2Instruments命令行调用方法instruments命令用法:instruments[-ttemplate][-Ddocument][-ltimeLimit][-i#][-wdevice][[-ppid]|[application[-evariablevalue][argument...]]]-t是指定模板;-D是指定生成的.trace文件;-l是指定运行时间,这里的单位是ms;-w是指定设备id(设备通过usb连接到电脑后,可以通过system_profilerSPUSBDataType查看设备id);application即待测试的App名称;如下所示示例:在fcbba9b83bf99c97e5d4d56d99a264d083d5e2cd设备上启动”TimeProfiler模板运行运行运行com.xx录制30000MS的profiler.trace文件,输出/user/monky/workinStruments-l30000-wfcbba9b83bf99c99c97e56ee56d99a26a26a264d083d083d5e2cd-v-v-v-time/time/timeproff-lime/timeproffiloff'-timeprofil'--多模板.tracetemplate文件有时需要同时监控多个模板,这时候可以导出一个自己需要的.tracetemplate文件。A。首先打开instruments,在主界面选择需要测试的模板,如下图,通过右上角的+添加。b.选择好所有需要的模板后,点击Instruments->file->SaveAsTemplate进行保存,并记录保存位置。C。然后就可以使用自己的模板测试下面的例子:Instruments-wfcbba9b83bf99c97e5d4d56d99a264d083d5e2cd-v-t"CustomTemplate"-DtemplateData.tracecom.suning.XX2.3Instruments数据分析功能实现我们生成一个自定义数据模板MyTemplate.tracetemplate,根据使用TraceUtility解析instruments工具生成的trace文件,获取存储的信息。Trace文档的基本结构文档结构的逻辑可以从Instruments的交互逻辑中看出。一个文档有一个目标设备、一个被监控的进程和一组配置文件模板,然后同一组模板可以用于多个配置文件。Instruments对应的代码中,一个文档就是一个XRTrace对象。除了一些元数据,它还包含一个XRInstrument对象数组,每个对象包含一个XRRun数组。所以接下来要做的就是想办法从不同模板的XRInstrument中读取XRRun对象中的数据,然后依次遍历。读取和保存XRInstrument对象数据的代码主要在InstrumentsAnalysisCore.framework框架中。存储格式也使用了SQLite,它抽象了各种读写查询。比如用户在Instruments中用鼠标选中一段时间??查看这段时间的数据,这样的过滤操作不需要在每个模板中单独实现。同时,由于数据结构的类型比较有限,比如调用栈树、样本列表等。XRContext在Instruments中,XRContext体现在模板列表下方的导航栏中。它有一个树形结构,每次选择一个context,就是从根节点到这个context的一条context路径。XRContextContainer(通常是视图控制器)保留对上下文的引用,称为其contextRepresentation,XRContext还引用实际显示其数据的XRContextContainer(通常是视图),称为其容器。不同的模板当然会有不同的上下文,但有时一个模板也会包含多个不同的上下文,所以当用户选择不同的模板查看数据,或者从导航栏切换到当前模板的不同数据视图时,当前context会发生变化,调用新context的-[XRContextdisplay]方法,然后这个context会通过-[XRContextContainerdisplayContext:]传给对应的XRContextContainer,然后这个container(一般是viewcontroller)就可以把数据加载并刷新视图。也就是说,文档中的大部分数据只有在真正需要显示的时候才会被读取。从Instruments用户的角度来说,很容易理解,但是对于TraceUtility的用户来说,要知道如果自己看数据全是nil,或者是空数组,可以看看是不是忘了调用这个-[XRContext显示]方法。每个XRContextContainer对象存储不同的结构层次,下面给出三种结构分析方法。TimeProfiler模板分析示例:CPUActivityLog模板分析示例:Connections模板数据分析示例:SearchPaths虽然说调用Instruments的代码只需要链接它的framework,但是还是有那么几个地方值得一提。第一个是编译器搜索我们要链接的框架的目录。参考Xcode工程配置的FRAMEWORK_SEARCH_PATHS变量。/Applications/Xcode.app/Contents/SharedFrameworks/Applications/Xcode.app/Contents/Applications/Instruments.app/Contents/Frameworks如果设置不正确,链接时会报错,无法生成可执行程序.然后编译后的程序在启动时搜索这些动态链接框架的目录。参考Xcode项目配置中的LD_RUNPATH_SEARCH_PATHS变量。/Applications/Xcode.app/Contents/SharedFrameworks/Applications/Xcode.app/Contents/OtherFrameworks/Applications/Xcode.app/Contents/Developer/Library/Frameworks/Applications/Xcode.app/Contents/Developer/Library/PrivateFrameworks/Applications/Xcode.app/Contents/Applications/Instruments.app/Contents/Frameworks如果设置不正确,程序仍然可以编译,但是程序运行时会报错。另外这里不仅包含了前面配置中的目录,还有其他的,因为我们链接的框架还依赖于其他框架,而这些框架在运行时也需要dyld加载。最后,Instruments自己搜索Packages目录。这些目录都在Instruments.app的安装目录下,函数NSString*PFTInstrumentsAppContents()就是用来获取这个安装目录的。它调用+[NSBundlemainBundle]来确定当前进程是主Instruments应用程序还是其他命令行工具,并返回正确的结果。但是在我们的流程中,+[NSBundlemainBundle]返回的结果并不能被这个函数正确识别和处理,所以我们需要hook这个方法返回Instruments.app对应的bundle,这样Instruments才能正确的找到那个那个需要装Bag。2.3分析数据TimeProfiler解析数据如下图:CPUActivityLog解析数据如下图:CoreAnimation解析数据如下图:ActivityMonitormemoryusage解析数据如下图:EnergyUsageLevel解析数据如下图下图:Connections分析数据如下图所示:3.应用效果苏宁青蛙测试平台在iOS稳定性测试中应用了仪器检测iOS性能技术,对用户提交的任务结果进行采集分析,并将其转化为图表展示,方便测试人员直接高效的获取目的是测试App在不同系统版本和机型上的性能表现,提高相关人员的工作效率。以下截图为测试报告节选:四、总结考虑到文章篇幅,本文仅介绍苏宁沃特平台移动端性能测试的冰山一角。其他关于手机稳定性测试的技术要点会在后续文章中分享。推广期间,青蛙测试平台将全力保障每一个在线应用的安全、稳定、健壮,站在第一线,为苏宁软件的质量保驾护航。同时,我们也会不断的成长,提升我们的技术,以“测试,原来如此简单!”为苏宁智慧零售战略提供坚实保障。作者:钱梦奇,苏宁易购IT总部数据云公司移动SDK工程师,主要从事测试工具和平台的研发工作。专注于移动App开发、测试流程和测试工具开发,在移动自动化测试、稳定性测试、性能测试、App开发技术和新概念实践等方面积累了丰富的经验。【原创稿件,合作网站转载请注明原作者和出处为.com】