APP啓動時間最精確的記錄方式

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的啓動時間最爲精確!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章