您当前的位置:网站首页>king,裁判文书-三室一厅的现代风,有点小浪漫,有点小清新

king,裁判文书-三室一厅的现代风,有点小浪漫,有点小清新

2019-07-18 10:25:26 投稿作者:admin 围观人数:180 评论人数:0次

奇技攻略

本文介绍360在iOS端移动端线上功用监控计划——QDAS东莞地图-APM。

01 背 景

app的功用问题是影响用户体会的重要因素之一。功用问题首要包含:溃散、网络恳求过错或许超时、UI呼应速度慢、主线程卡顿、CPU和内存运用高、耗电量大等等。大多问题的原因在于开发者过错地运用了线程、锁、体系函数、编程标准问题、数据结构等等。处理这个问题的要害在于尽早发现和定位问题。

360作为一家重视用户体会的公司,app的功用问题无疑是被要点重视的,咱们也总李敏结出了一套自己的app功用监控体系。在平常开发和用户反应的问题中,咱们对功用问题进行了概括,总结出了5个分别是:资源文件怎么掌控、 版别质量怎么确保、线上问题怎么排查、开发阶段怎么避免功用衰减、功用监控是否能实在反映用户体会。一起学习了业界相对完善的功用监控平台上的功用原理。然后得出了360在iOS端移动端线上功用监控计划——QDAS-APM。

02 功用和原理

QDAS-APM现已完结以下功用监控:

  • 页面烘托时长
  • 主线程卡顿
  • 网络过错
  • FPS
  • 大文件存储
  • CPU
  • 内存运用
  • Crash
  • 发动时长

下面依照功用详细介绍完结轰趴馆细节和原理。别的用户在运用app时会感知功用问题,咱们能够将其转化为详细的功用监控目标。

1、页面烘托时长

什么是页面烘托时长?页面烘托时长其实是从页面初始化到用户能看到页面效果的时刻长度。所要了解的目标有:

  • 生命周期体系办法履行时长
  • 页面类名
  • 发动类型
  • 履行耗时
  • 插件称号

要害衡量的目标是履行耗时,不同的办法和过程发生的耗时在用户能承受的范围内才被认为是合理。其他目标则是起wanna有关联性效果和定位问题。直接hook UIViewController的办法显着是不可行的,原因是它只效果在UIViewController的办法,而app中大部分都选用承继UIViewController的办法。

这儿列出两个可行性计划:

  1. 选用KVO,咱们知道关于恣意目标进行KVO操作时,体系都会帮你动态的创立一个仿制类,一起完结了setter getter函数的掩盖和函数完结。
  2. 选用runtime遍历一切类为UIViewController的子类,再进行动态替换。

这两种办法愈加引荐榜首种,出于对兼容性、功用、以及能够直接获取UIViewController的子类的IMP。那详细怎么完结呢?总结概括为三过程:

  1. 需求创立一个UIViewController的类别,对UIViewController的实例进行KVO,意图是让KVO创立需求监控UIViewConking,裁判文书-三室一厅的现代风,有点小浪漫,有点小新鲜troller的子类。
  2. 增加需求监控的办法,在KVO创立出来的子类增加需求Swizzle的办法对应的SEL及其IMP。意图是操控调用本来类的办法机遇。
  3. 在UIViking,裁判文书-三室一厅的现代风,有点小浪漫,有点小新鲜ewController的实例毁掉时,在dealloc办法里将KVO监听移除,否则会导致Crash。

举个比方:咱们以监控到qh_viewDidLoad办法举例:

static void qh_viewDidLoad(UIViewController *kvo_self, SEL _sel)
{
Class kvo_cls = object_getClass(kvo_self烤鸡);
Class origin_cls = class_getSuperclass(k枫树精灵希尔夫vo_cls);
// 留意点
IMP origin_imp = method_getImplementation(class_getInstanceMethod(origin_cls, _sel));
void(*func)(UIViewController *, SEL) = (void(*)(UIViewController *, SEL))origin_imp;
CFAbsoluteTime startTime = CACurrentMediaTime();
func(kvo_self, _sel);
CFAbsoluteTime endTime = CACurrentMediaTime();
NSTimeInterval duration = (endTime - startTime)*1000;
NSLog(@"Class %@ cost %g in viewDidLoad", [kvo_self class], duration);
}结肠癌前期症状

会有一种特殊情况,假如KVO生成的类中对应的类本来没有完结监控办法,那么会形成什么成果呢?KVO内部生成的NSKVONotifying_ViewController实际上时承继自ViewController,因而直接取出对应的IMP调用。

OK,king,裁判文书-三室一厅的现代风,有点小浪漫,有点小新鲜上面说的是对UIViewController类办法的履行时长核算。咱们还想知道用户真实页面跳转后看到榜首针页面图画的时长要怎么收集呢?

那是不是将UIViewController林文龙类的init+loadView+viewDidLoad+viewWillAppear+viewDidAppear办法履行时长之和便是页面烘托时长了呢?

答案是否定的,下面举了三个不和比方:

关于异步回谐和异步烘托这两种办法,用上面说到的5个办法履行时长之和是不适用的。接下来看下怎么相对精确地来核算和核算的计划。

页面烘托的时长和页面的布局时长会在未来的某个时刻点上到达共同。要想得到页面烘托的时长能够间接地参阅页面的布局完结时长。在UIViewController的生命周期办法里有一个办法叫viewDidLayoutSubviews,它是干什么的呢?它其实是告知了操控器的subviews布局完结的时刻点。一般情况下会被调用两次,在不同的操作体系版别里调用次数也不同。

2、主线程卡顿剖析

主线程的卡顿直接影响用户运用体会,其表现在页面的操作流通性影响。首要引进一个概念FPS(Frames Per Second):每秒显现接连图片的帧数。每秒帧数越多,UI灾组词操作就越流通。一般运用保持在每秒50~60帧数,会给用户带来流通的感觉,反之,用粉丝的做法户则会感知到卡顿。那为什么会呈现主线程卡顿呢?首要了解下,每一帧图画显现到屏幕的原理。

这是触屏幕显现的原理流程图。CPU担任核算显现内容,包含视图的创立、布局核算、图片解码、文本制作等,cpu会把核算后的成果提交给GPU,GPU进行改换、组成、烘托后,将烘托成果提交到帧缓冲区,当下一次笔直同步信号到来时,视频操控器从缓冲区里获取视图显现到屏幕上。理解了就屏幕显现的原理,接下来看下为甚么会发生卡顿。

图上说到 V-Sync 是什么,以及为什么要在 iPhone 的显现流程引进它呢?在 iPhone 中运用的是双缓冲机制,即上图中的 FrameBuffer 有两个缓冲区,双缓冲区的引进是为了提高显现功率,可是与此一起,他引进了一个新的问题,当视频操控器还未读取完结时,比方屏幕king,裁判文书-三室一厅的现代风,有点小浪漫,有点小新鲜内容刚显现一半时,GPU 将新的一帧内容提交到帧缓冲区并把两个缓冲区进行交流后,视频操控器就会把king,裁判文书-三室一厅的现代风,有点小浪漫,有点小新鲜新的一帧数据的下半段显现到屏幕上,形成画面撕裂现象,V-Sync 便是为了处理画面撕裂问题,敞开 V-Sync 后,GPU 会在显现器宣布 V-Sync 信号后,去进行新帧的烘托和缓冲区的更新。

搞清楚了 iPhone 的屏幕显现原理后,下面来看看在 iPhone 上为什么会呈现卡顿现象,上文现已提及在图画真实在屏幕显现之前,CPU 和 GPU 需求完结本身的使命,而假如他们完结的时刻错失了下一次 V-Sync 的到来(一般是1000/60=16.67ms),这样就会呈现显现屏仍是之前帧的内容,这便是界面卡顿的原因。不难发现,无论是 CPU 仍是 GPU 引起错失 V-Sync 信号,都会形成界面卡顿。

3、网络监控

网络监控一般经过 NSURLProtocol 和代李维嘉发悲伤慨叹码注入(Hook)这两种办法来完结,因为 NSURLProtocol 作为上层接口,运用起来更为便利,NSURLProtocol 归于 URL Loading System 体系中,运用层的协议支撑有限,只支撑 FTP,HTTP,HTTPS 等几个运用层协议,关于运用其他协议的流量则束手无策,所以存在必定的局限性。监控底层网络库 CFNetwork 则没有这个约束。假如本地有https的证书验证也不适用于NSURLProtocol这种办法。简单引起事务数据丢掉问题。

NSURLProtocol

上图是根据NSURLProtocol协议来完结king,裁判文书-三室一厅的现代风,有点小浪漫,有点小新鲜的,经过承继自NSURLking,裁判文书-三室一厅的现代风,有点小浪漫,有点小新鲜Protocol,并注册。经过署理和本身办法来得到网络恳求相关红冬蛇菰的目标。

HOOK办法—NSProxy

NSProxy is an abstract superclass defining an API for objects 
that act as stand-ins for other objects or for objects that don’t exist yet.
Typically, a message to a proxy is forwarded to the real object or causes the proxy to load (or
transform itself in龙眼上火吗to) the real object. Subclasses of NSProxy can be used to implement transparent
distributed messaging (for example, NSDistantObject) or for lazy instantiation of objects that are expensive to create.

上面的这段英文是 Apple 官方文档给 NSProxy 的界说,NSProxy 和 NSObject 相同都是根类,它是一个抽象类,能够经过承继它,并重写 -forwardInvocation: 和 -methodSignatureForSelector: 办法以完结音讯转发到另一个捏奶头实例。综上,NSProxy 的意图便是担任将音讯转发到真实的 target 试开城际轻轨的署理类。

那为什么咱们不必Method swizzling 替换办法需求指定类名?是因为 NSURLConnectionDelegate 和 NSURLSessionDelegate 是由事务方指定,一般来说是不确定,所以这种场景不适合运用 Method swizzling。运用 NSProxy 能够处理,详细完结:proxy delegate 替换 NSURLConnection 和 NSURLSession 本来的 delegate,当 proxy delegate 收到回调时,假如是要 hook 的办法,一上究竟则调用 proxy 的完结,proxy 的完结终究会调用本来的 delegate;反之,则经过音讯转发机制将音讯转发给本来的 delegate。

下图暗示了整个操作流程:

经过对NSURLConnection、NSURLSession和CFNetwork这三个类中要害办法的hook来获取上报目标。详细hook哪些办法,请看下图:

将hook办法中得到的相关目标整理成需求的格局上签到服务端,服务端经过数据处理和拆分目标,汇总加核算生成终究的报表。

03 QDAS超级英豪-APM在集成和运用上的快捷

因为sdk功用基本上选用的都是自动收集功用,无需二次开发,也无需额定引进体系库。所以在集成和运用上十分快捷。在sdk的集成上,只需求三过程:

  1. 引进sdk库
  2. 引进sdk头文件
  3. 在app的didFinishLauchingWithOptions里初始化sdk,并传入appkey即可。

参阅文other章

美团Herz:

https://tech.meituan.com/2016/12/19/hertz.htmlg

iOS功用监控计划:

http://www.cocoachina.com/articles/19680

关于360技能

360技能是360技能团队打造的技能共享大众号,每天推送技能干货内容

更多技能信息欢迎重视“橡皮树360技能”微信大众号

the end
三室一厅的现代风,有点小浪漫,有点小清新