本文首發於圖拉鼎的博客I’M TUALATRIX,對排版和內容略作調整

iOS 13.2 頻繁「殺」後臺 App 的事情可以說是讓全球的 iPhone 用戶都很抓狂,大家紛紛在吐槽「bugOS」的同時,也在想是不是個別 App 不遵守規則,導致後臺 App 頻繁被退出。

我在前幾天做過一個初步觀察,說微信被退出的幾率相當高,有些 App 則不太被退出。經朋友提醒,我發現 iOS 日誌裏有很多關於微信的 Wakeup 記錄。那麼,什麼是 Wakeup?微信被退出後臺會是過多 Wake 引起的嗎?本文就針對這個問題進行一番探究。

初步觀察

我就這樣得出了初步結論,想着等微信更新應該會解決這個問題。

進一步觀察

往後幾天,我特別注意觀察了一下,發現不僅是微信,其它的 App 也會頻繁被「殺」掉,只是程度不一樣罷了。或者說,之前用着不太會被退出後臺的 App,程度也相應增加了,可見 iOS 13.2 確實存在問題。對於這個現象,名爲 Michael Tsai 的用戶還整理了一份他對於社交網絡上對於 iOS 13.2 「殺後臺」現象的言論彙總。

這些現象告訴我,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 會採用除系統合法機制之外的讓自己保持活躍狀態的各種 Trick。衆所周知,iOS 13 在隱私和權限方面進一步嚴格了起來,也許 iOS 13 在處理這些 Trick 的時候,沒能處理完美,導致了應用頻繁被退出後臺的現象發生。

結論

Wakeup 調用不是微信等 App 被退出的主動原因,而是一個觸發了 iOS 13.2 中存在的問題或 Bug 後的現象。更深層和具體的原因,也許只有開發商和 Apple 一起去 Debug,才能找到了。希望解決問題後的 iOS 13.3 能夠早日到來。

最後,有不少人反饋微信已經通過熱更新解決了在後臺頻繁被退出的問題,我在測試之後也確實感受到微信能在後臺待得更久了。

但是 iOS 13.2「殺後臺」的現象並沒有到此就解決了,還有很多其它的 App 存在這個問題。畢竟這是系統級的問題,連 Safari 都會被 iOS 13.2 頻繁退出。還是期待 Apple 能夠早日徹底解決這個問題吧。

相關文章