APP啓動時間記錄:
1、用戶點擊icon ----> main函數 === T1
2、main函數 -----> FirstController === T2
3、firstController加載成功 === T3
通常 用戶的感知時間 T1 + T2 + T3
,通常記錄APP的啓動時長的方法三種,下方依次簡單介紹,相信只要提供一個思路,下面都會知道怎麼辦的!
記錄的三中思路 依次精確
:
方法一:didFinishLaunch ---- > FirstController
方法二:AAXX動態庫 ----> FirstController
方法三: 用戶點擊Icon -----> FirstController
方法一: 最普通的記錄方式,從didFinishLaunch開始記錄
DidFinishLaunch方法 ---> FirstController : ViewDidAppear: 方法時間的記錄
相信通常是這樣來記錄APP的啓動時長,但是我們都知道這樣一點都不準確,DidFinishLaunch
方法之前還有很多操作要做,那麼如何精確的測量呢?
方法二 => 從加載動態庫的時候開始記錄
思路如下:
1、動態庫加載
2、記錄方法一的時間
解釋一下:
APP啓動的大體流程:
1、pre-main
加載可執行文件、加載動態鏈接器dyld、按照依賴
加載動態庫……
2、main()
==>DidFinishLaunch
……
通常記錄啓動時長從2
記錄,但是,仔細看一下1
步驟,按照依賴加載動態庫
,方法二由此而來
思路:
創建一個確保第一個加載的動態庫,在+load方法中記錄時間,相比方法一,更加精確記錄啓動時間!
PS:如何確保第一個加載動態庫:參考下方的兩個鏈接,具體講解了很多,這裏涉及到的是CocoaPods
使用了molinillo
的算法對動態庫的依賴進行了計算
,大體呈現的現象像是按照首字母排列的,但是並不是!!
注意:雖然依賴按照算法計算,但是一般以AA開頭的動態庫加載也是優先的,當然這是大部分情況,可以試一下!
CocoaPods 都做了什麼?
Molinillo
方法三: 最爲精確的記錄APP啓動時間,從用戶點擊Icon的時候開始記錄!
方法二中我們從第一個動態庫開始記錄啓動
時間,但是在加載動態庫之前
還有一段時間我們記錄不到,怎麼辦呢?
思路:
監聽APP加載到內存中的進程信息!
這裏對於進程
就不再做過多的介紹!
根據這個思路,我查看了相關的官方API,發現真的有針對進程的方法:
iOS中獲取進程信息-NSProcessInfo
可以參考這個文章,可以獲取到進程的一些屬性,那麼使用如下方法,我們即可以獲取到進程加載到內存
的時間!
// 根據進程ID,獲取進程信息!
+ (BOOL)processInfoForPID:(int)pid procInfo:(struct kinfo_proc*)procInfo
{
int cmd[4] = {CTL_KERN, KERN_PROC, KERN_PROC_PID, pid};
size_t size = sizeof(*procInfo);
return sysctl(cmd, sizeof(cmd)/sizeof(*cmd), procInfo, &size, NULL, 0) == 0;
}
// 根據進程信息,獲取具體的進程加載到內存中的時間戳
+ (NSTimeInterval)processStartTime {
struct kinfo_proc kProcInfo;
if ([[self class] processInfoForPID:[[NSProcessInfo processInfo] processIdentifier] procInfo:&kProcInfo]) {
return (kProcInfo.kp_proc.p_un.__p_starttime.tv_sec * 1000.0 + kProcInfo.kp_proc.p_un.__p_starttime.tv_usec / 1000.0);
} else {
NSAssert(NO, @"無法取得進程的信息");
return 0;
}
}
PS: 獲取到相關進程加載到內存
中的時間,其實可以等同於
獲取到用戶點擊Icon
的時間,用這個時間來記錄APP的啓動時間最爲精確!