iOS之Instruments工具使用
前言
笔者一直很懒,恰逢最近离职,所以静下心来,梳理一些东西,希望大家能用得到。
笔者一直认为没有完美的app,只有更加优化的app。所以一个app不是做完功能就可以了的,是需要进行检查和优化的,而xcode自带了一个很好的检查工具instruments,可以检测内存泄漏、还可以查看哪一个方法比较耗时、还可以检测离屏渲染等等,功能上还是比较强大的。
Instruments提供了很多功能,我会介绍一下我最常用的几类:
1.Time Profiler:CPU分析工具分析代码的执行时间。
2.Core Animation:离屏渲染,图层混合等GPU耗时。
3.Leaks:内存检测,内存泄漏检测工具。
4.Energy Log:耗电检测工具。
一、打开instruments
如图,使用Xcode自带的Instruments工具首先需要打开它;也可以用快捷键(command + control + i)使其自动运行。
二、部分功能介绍
1、Time Profiler使用简介
TimeProfiler见名知意:时间分析工具,它会按照设定的时间间隔(默认1毫秒)来跟踪每一线程的堆栈信息(stacktrace),并通过比较时间间隔之间的堆栈状态,来推算出某个方法执行了多久,给出一个近似值。具体步骤如下:
1.双击TimeProfiler进入到调试界面点击左上角红色原点(启动程序按钮)之后便可以看到如下图的时间消耗。
但是我们发现这些信息只能显示到底层的线程Runloop耗时,并不能帮助我们定位到具体的代码中去,下面介绍CallTree选项的勾选操作以及含义。在页面左下角,CallTree选项默认是不选的,但把它们勾选上可以帮你更快定位到关键的代码上,往往这也是问题的源头。
Separate by Thread:按线程分开做分析,这样更容易揪出那些吃资源的问题线程。特别是对于主线程,它要处理和渲染所有的接口数据,一旦受到阻塞,程序必然卡顿或停止响应。
Invert Call Tree:反向输出调用树。把调用层级最深的方法显示在最上面,更容易找到最耗时的操作。
Hide Missing Symbols:隐藏缺失符号。如果dSYM文件或其他系统架构缺失,列表中会出现很多奇怪的十六进制的数值,用此选项把这些干扰元素屏蔽掉,让列表回归清爽。
Hide System Libraries:隐藏系统库文件。过滤掉各种系统调用,只显示自己的代码调用。
Flattern Recursion:拼合递归。将同一递归函数产生的多条堆栈(因为递归函数会调用自己)合并为一条。
Top Functions:找到最耗时的函数或方法。
将以上勾选之后便可以看到对应的具体代码,此时选中一行耗时操作双击便可以进入到对应的代码中并且显示详细的消耗时间等。
2.Core Animation动画渲染使用简介:
CoreAnimation系要注意的一点是必须是真机调试,用于调试离屏渲染,绘图,动画,等操作。调试需注意以下几个选项的勾选:
比较重要的:
·"Color Blended Layers":图层混合;
显示出被混合的图层BlendedLayer(用红色标注),BlendedLayer是因为这些Layer是透明的(Transparent),系统在渲染这些view时需要将该view和下层view混合(Blend)后才能计算出该像素点的实际颜色。所以红色越少越好。
·"Color Hits Green and Misses Red":图层缓存;
很多视图Layer由于Shadow、Mask和Gradient等原因渲染很高,因此UIKit提供了API用于缓存这些Layer:[layersetShouldRasterize:YES],系统会将这些Layer缓存成Bitmap位图供渲染使用,如果失效时便丢弃这些Bitmap重新生成。所以绿色越多,红色越少越好。
·"Color Offscreen-Rendered Yellow":离屏渲染;
Offscreen-Rendering离屏渲染意思是iOS要显示一个视图时,需要先在后台用CPU计算出视图的Bitmap,再交给GPU做Onscreen-Rendering显示在屏幕上,因为显示一个视图需要两次计算,所以这种Offscreen-Rendering会导致app的图形性能下降。所以黄色越少越好。
次要的:
·"Color Misaligned Images":图片缩放;
MisalignedImage表示要绘制的点无法直接映射到频幕上的像素点,此时系统需要对相邻的像素点做anti-aliasing反锯齿计算,增加了图形负担,通常这种问题出在对某些View的Frame重新计算和设置时产生的。
·"Color Copied images":标注应用绘制时被Core Animation复制的图片;
·"Color Immediately":Instruments在做color-flush操作时取消10毫秒的延时;
·"Color Compositing Fast-Path Blue":标记由硬件绘制的路径;
·"Flash Updated Regions":重绘的区域;
勾选这些不同的选项可以在真机上看到不同颜色的渲染标注。
3.Leaks内存调试使用简介
Leaks是iOS程序中用来检测内存泄漏的工具,灵活的运用Leaks可以帮助我们预防程序中的内存泄漏防止程序内存耗用过大被挂起。首先双击Leaks点击左上角红色圆点运行,并且选中CallTree,在CallTree选项中勾选InvertCallTree和HideSystemLibraries选项如下图所示
然后程序跑起来我们观察上方的内存变化区域,工具中按照时间把所耗内存的大小都以填充图的形式展现出来,当鼠标移动到图的位置时直接显示出那一时刻所占用的内存大小,如果内存途中下方显示出红色叉号则代表此处存在内存泄漏。可以通过鼠标在图中圈出此区域,此时下面的CallTree就会打印出对应的函数堆栈调用以及所占内存大小信息,双击便可进入到对应的代码区域来查看;若无对应打印信息,可能存在高内存操作,但并无内存泄漏问题。
4.Energy Log耗电量检测使用简介:
双击打开EnergyLog直接点击红色圆点运行程序,左侧依次即可看到CPU活动比例,网络活动比例,亮度状态,手机睡眠状态,手机连接蓝牙状态,手机连接wifi状态,手机GPS状态这次都是手机耗电的构成部分。如下图:
我们也可以在Xoce启动程序时点击Xcode左侧状态栏,选择Energy Impact选项,在右侧即可看到手机实时的耗电情况。如下图:
左上部分是资源实时消耗情况仪表盘,右上部分是资源平均消耗情况,下方是资源具体消耗情况。
注意资源实时消耗情况仪表盘中指针指向的区域
绿色—合理
黄色—资源消耗高.你的程序比较耗电.
红色—资源消耗非常高.仅仅轻度使用你的app,用户就可以明显感到电量在消耗。
三、补充
如果遇到This app could not be installed at this time.卸载掉app重新run。
如上为笔者自己使用情况以及网上文章总结,仅供大家参考。