在之前的文章中提到过, 现有市面上的 iPhone 老设备 (特指 iPhone 6s 之前的设备) 占有率高达 40%,iOS app 卡顿的发生率发生概率也很高. 卡顿里有一类卡顿又尤其严重: 主线程长期不响应而导致的系统 Watchdog 强杀.
现在很多 iOS 线上 App 都集成了卡顿检测工具, 原理多是基于 runloop 的各个事件回调, 这类工具可以检测主线程是否在某个 threshold(比如 2 秒) 内是否处于可反应状态, 比如重复进入某个 runloop 即可认为主线程没有被卡住. 我们姑且称这类工具为 AppWatchdog, 但对于严重的主线程卡顿, 比如超过 10 秒会被系统强杀, 我们称这种系统机制为 iOSWatchdog. 为了方便表述, 我们进一步将 AppWatchdog 侦测到的卡顿我们称为 stall,iOSWatchdog 强杀的卡顿我们称为 hard stall.
AppWatchdog 侦测到的 stall 很好分析, 我们只需要在发生 stall 时, 在另外一个线程将主线程的 call stack 记录下来上报即可, 而后对症下药在下个版本修复. 但对于 hard stall, 准确检测很难, 原因是系统强杀时并没有任何信号提醒, 也不会像 crash 一样生成一个 report, 现在主流 App 是怎么做的呢?
- kCFRunLoopBeforeTimers
- kCFRunLoopBeforeSources
- kCFRunLoopBeforeWaiting
- kCFRunLoopAfterWaiting
- if (report.stallTs <activeTs) {
- report.isHardStall = true;
- } else {
- report.isHardStall = false;
- }
来源: http://www.jianshu.com/p/4b0dbbd7397a