File tree 1 file changed +25
-1
lines changed
1 file changed +25
-1
lines changed Original file line number Diff line number Diff line change 8
8
9
9
## 前言
10
10
11
- 有关 APM 的技术文章非常多,但大部分文章都只是浅尝辄止,并未对实现细节进行深挖。本文旨在通过剖析 SDK 具体实现细节,揭露知名 APM 厂商的 iOS SDK 背后的秘密。
11
+ 有关 APM 的技术文章非常多,但大部分文章都只是浅尝辄止,并未对实现细节进行深挖。本文旨在通过剖析 SDK 具体实现细节,揭露知名 APM 厂商的 iOS SDK 背后的秘密。
12
+
13
+ ## 页面渲染时间
14
+
15
+ 页面渲染的监控,比较容易想到的是通过 hook 页面的几个关键的生命周期方法,例如 ` viewDidLoad ` 、` viewDidAppear: ` 等,从而计算出页面渲染时间,最终发现慢加载的页面。然而如果真正通过上述思路去着手实现的时候,便会遇到难题。在 APM SDK 中如何才能 hook 应用所有页面的生命周期的方法呢?如果尝试 hook ` UIViewController ` 的方法又会如何呢?hook ` UIViewController ` 的方法明显不可行,原因是他只会作用 ` UIViewController ` 的方法,而应用中大部分的视图控制器都是继承自 ` UIViewController ` 的,所以这种方法不可行。但是听云 SDK 却能够实现。页面 Hook 的逻辑主要是 ` _priv_NBSUIAgent ` 类中实现的,下面是 ` _priv_NBSUIAgent ` 类的定义,其中 ` hook_viewDidLoad ` 等几个方法便是线索。
16
+
17
+ ```
18
+ ; @class _priv_NBSUIAgent : NSObject {
19
+ ; +hookUIImage
20
+ ; +hookNSManagedObjectContext
21
+ ; +hookNSJSONSerialization
22
+ ; +hookNSData
23
+ ; +hookNSArray
24
+ ; +hookNSDictionary
25
+ ; +hook_viewDidLoad:
26
+ ; +hook_viewWillAppear:
27
+ ; +hook_viewDidAppear:
28
+ ; +hook_viewWillLayoutSubviews:
29
+ ; +hook_viewDidLayoutSubviews:
30
+ ; +nbs_jump_initialize:
31
+ ; +hookSubOfController
32
+ ; +hookFMDB
33
+ ; +start
34
+ ; }
35
+ ```
You can’t perform that action at this time.
0 commit comments