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的启动时间最为精确!

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,772评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,458评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,610评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,640评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,657评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,590评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,962评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,631评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,870评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,611评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,704评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,386评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,969评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,944评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,179评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,742评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,440评论 2 342

推荐阅读更多精彩内容

  • 背景 一个项目做的时间长了,启动流程往往容易杂乱,库也用的越来越多,APP的启动时间也会慢慢变长。本次将针对iOS...
    酱油瓶2阅读 3,488评论 0 12
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,083评论 1 32
  • ORA-00001: 违反唯一约束条件 (.) 错误说明:当在唯一索引所对应的列上键入重复值时,会触发此异常。 O...
    我想起个好名字阅读 5,154评论 0 9
  • 真的好感动。 我曾写过,所有的事,都在乎用心。 幸运的是,自己也一直被人用心对待着,这感觉,真幸福。 最近发现,自...
    抓星星的小超阅读 684评论 1 3
  • 幸福脑学习,爱的教育,脑的学习,觉知生命,学习幸福,幸福学习,见证生命的奇迹!让每一个人感觉爱的能量,启迪觉醒的智...
    幸福脑学习Mia阅读 375评论 1 2