|簡體中文

比思論壇

 找回密碼
 按這成為會員
搜索



查看: 852|回復: 0
打印 上一主題 下一主題

[其他類型] iOS 13.2为何杀 App这么频繁?或与Wakeup机制有关

[複製鏈接]

4740

主題

0

好友

2萬

積分

教授

Rank: 8Rank: 8

  • TA的每日心情
    奮斗
    1 小時前
  • 簽到天數: 3388 天

    [LV.Master]伴壇終老

    推廣值
    0
    貢獻值
    323
    金錢
    58487
    威望
    20486
    主題
    4740

    文明人 回文勇士 中學生 簽到勳章 簽到達人 男生勳章 高中生 大學生 教授 伴壇終老 文章勇士 附件高人 文章達人 附件達人 愛因斯坦

    樓主
    發表於 2019-11-2 18:45:30
    来源:I'M TUALATRIX
    最近,iOS 13.2 频繁杀后台 App 的事情可以说是让全球的 iPhone 用户都很抓狂,大家纷纷在吐槽「bugOS」的同时,也在想是不是个别 App 不遵守规则,导致后台 App 频繁被杀。

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

    iOS 13.2 杀后台的初步观察

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

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

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

    进一步观察

    往后几天,我特别注意观察了一下,发现不仅是微信,其他的 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.

    从原文中可以明确得知,WAKEUPS 就是线程与线程的通讯,当发生异常情况,不管是 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 早日到来…

    重要聲明:本論壇是以即時上載留言的方式運作,比思論壇對所有留言的真實性、完整性及立場等,不負任何法律責任。而一切留言之言論只代表留言者個人意見,並非本網站之立場,讀者及用戶不應信賴內容,並應自行判斷內容之真實性。於有關情形下,讀者及用戶應尋求專業意見(如涉及醫療、法律或投資等問題)。 由於本論壇受到「即時上載留言」運作方式所規限,故不能完全監察所有留言,若讀者及用戶發現有留言出現問題,請聯絡我們比思論壇有權刪除任何留言及拒絕任何人士上載留言 (刪除前或不會作事先警告及通知 ),同時亦有不刪除留言的權利,如有任何爭議,管理員擁有最終的詮釋權。用戶切勿撰寫粗言穢語、誹謗、渲染色情暴力或人身攻擊的言論,敬請自律。本網站保留一切法律權利。

    手機版| 廣告聯繫

    GMT+8, 2024-11-16 16:58 , Processed in 0.014333 second(s), 20 queries , Gzip On, Memcache On.

    Powered by Discuz! X2.5

    © 2001-2012 Comsenz Inc.

    回頂部