iOS 13.2 为何杀 App 这么频繁以及什么是 Wakeup

最近,iOS 13.2 频繁杀后台 App 的事情可以说是让全球的 iPhone 用户都很抓狂,大家纷纷在吐槽「bugOS」的同时,也在想是不是个别 App 不遵守规则,导致后台 App 频繁被杀。

我在前几天做过一个初步观察,说微信被杀的几率相当高,有些 App 则不太被杀。然后经朋友提醒,发现 iOS 日志里有关于微信频繁的 Wakeup 的记录。是这个引起的吗?那么什么是 Wakeup?本文就针对这个问题进行一番探究。

iOS 13.2 杀后台的初步观察

10 月 30 号的时候,我在社交网络上贴了一个初步观察,提出在我的 iOS 系统上,微信被杀的比较频繁。

然后 @Er1cT4n9 马上给我补充了一下,说是滥用了 wakeup 导致 的。

我去到 iOS 系统设置-隐私-分析与改进-分析数据,也确实找到了类似的日志。当时我望文生义,以为 Wakeup 就是后台唤醒,就觉得是微信频繁进行后台唤醒,才导致被 iOS 频繁杀掉。

WeChat Wakeups on iOS 13.jpeg

这就样做了一个初步结论,想着等微信更新应该会解决这个问题。

进一步观察

往后几天,我特别注意观察了一下,发现不仅是微信,其他的 App 也会被频繁的杀掉,只是程度不太一样罢了。或者说,之前用着不太被杀掉的 App,程度也相应增加了,可见 iOS 13.2 确实存在问题。Michael Tsai 还整理了一个社交网络上的观察《iOS 13.2 Killing Background Apps More》。

这些现象告诉我 wakeup 不是我想象中的 wakeup,被杀后台的原因没那么简单,于是决定深入研究一下。

什么是 Wakeup?

那么 iOS 日志记录的 Wakeup 是什么?难道不是字面意思上的「唤醒」吗?确实不是。

iOS 日志里记录的 Wakeup,不是 App 使用意义上的「唤醒」,而是线程级别的「唤醒」。这要如何去理解?我的补充解释是这样的:

App 使用意义上的唤醒:一个放入后台的 App,当它想要更新地理位置或刷新消息时,它需要被唤醒才能做这些事情,于是它在被放入后台前,会和系统进行一些约定,比如:我是打车 App,我需要不断更新地理位置,所以你要常常唤醒我。然后系统就会去唤醒它了。通常 iOS App 被放入后台后,只能在有限的条件下被系统唤醒,而不能随意的自主唤醒去操作。当我们不想要 App 被后台唤醒后,主动去杀掉它基本上就可以达到目的了。

App 线程唤醒:一个 App,不管在前台或是后台,在进行具体的任务时,大多都需要用到多线程的模式,比如为了不阻塞 UI,用一个线程下载内容,然后下载完成后,切换到主线程去更新 UI,那么这个过程,就是一次 Wakeup。

关于「线程唤醒」的详细解释,可以看 Technical Note TN2151,我将原文引用在这里:

The exception subtype WAKEUPS indicates that threads in the process are being woken up too many times per second, which forces the CPU to wake up very often and consumes battery life.

Typically, this is caused by thread-to-thread communication (generally using peformSelector:onThread: or dispatch_async) that is unwittingly happening far more often than it should be. Because the sort of communication that triggers this exception is happening so frequently, there will usually be multiple background threads with very similar Backtraces - indicating where the communication is originating.

从原文中可以明确得知,Wakeup 就是线程与线程的通讯,当发生异常情况,不管是 App 代码或系统层面,频繁地进行线程唤醒会吃 CPU 以及消耗电量。

后台程序频繁被杀的原因猜测

了解到什么是 Wakeup 后,我们基本上可以得出一个结论:微信等其他 App,频繁被杀,确实不能简单的归结于这些 App 在后台尝试唤醒自己太频繁而被系统杀掉。毕竟系统日志里也写明了 Acton taken 为 none。也就是说,iOS 系统虽然记录了线程级别的 Wakeup 比较频繁,但是也没有采取因此就杀 App 的动作,App 在后台被杀则是后续发生的。

根本原因还是 iOS 13.2 有系统级的 Bug,原本一些合法的让 App 进入后台后保持一段时间的活跃的这个机制出了 Bug,于是凡是用到这个机制的 App,都存在不同程度的被频繁杀掉的可能。

当然也不能因此就否认有些 App 会采用除系统合法机制除外的让自己保持活跃的各种 Tricks,众所周知,iOS 13 在隐私和权限上进一步严格了起来,也许 iOS 13 在处理这些 Tricks 的时候,没能处理完美,也导致了频繁杀后台的现象发生。

结论

Wakeup 调用不是微信等 App 被杀掉的主动原因,而是一个触发问题或 Bug 后的现象。更深层和具体的原因,也许只有开发商和 Apple 一起去 Debug,才能找到了。希望解决问题后的 iOS 13.3 早日到来…

11 月 2 日下午更新

写完这篇文章后不久,从各方消息得知,微信已经通过热更新解决了在后台频繁被杀的问题,亲测也确实能感受到微信能在后台待得更久了。

我的猜测是微信通过检测 iOS 13.2 版本,做了些 Workaround 绕过了系统的问题,也可能是专门针对 iOS 13.2 做了新的解决方案。

但是 iOS 13.2 杀后台的现象并没有到此就解决了,还有那么多其他的 App 还存在着这个问题。毕竟这是系统级的问题,连 Safari 都会被 iOS 13.2 频繁杀掉。还是期待 Apple 早日彻底解决这个问题吧。

欢迎使用图拉鼎和他的团队开发的作品

One Switch - 多功能开关工具

常驻 macOS 菜单栏的开关工具,可以快速开关 AirPods、睡眠模式、切换黑暗模式等。

5 Comments

反正,什么都不管,先骂微信流氓就对了。。

czhu

深入浅出 周老师加油

学到了,谢谢分享

tualatrix

不客气~已经订阅了你的 Blog。很赞!

deval

你这分析的不对啊,ios分析数据说的是两个限制 一个是每秒150次 一个是超过300秒

Leave a Comment