Catilina:消失的音频

前几天升级了MacOS Catalina,正一边感叹新系统的伟大一边探索新功能的时候,AirPods莫名其妙的断开了。Mojave的时候也偶尔断开过几次,无非是和2.4G频道有冲突,就没有在意。

然而,再次连接没过几分钟又次断开了。具体表现为:

蓝牙仍在连接,只是输出设备变成了「扬声器」,同时音乐也自动暂停,尝试重新在声音设备连接后一直显示「正在连接」动画。

于是就尝试排查到底是什么原因导致的断连:

  • 还原 Mac 的蓝牙模块( Shift+Option+蓝牙图标)
  • 将 Mac 「所有连接的 Apple 设备还原到出厂设备」
  • 移除 Mac 的连接的所有蓝牙设备
  • 重启 Mac
  • 重置 AirPods
  • 重置Mac 的 NVRAM 和 PRAM

均没有效果,每次切换成AirPods之后几分钟就断开连接了,体验极差。更惨的是,前几天刚刚删掉了TM备份,想不丢数据回到Mojave也不可能了。(论NAS容量大的重要性

原因

看了一下Apple Community,发现好多人也有同样的问题:

除了AirPods系列,Bose QC II、Sony WH-1000X和Bluetooth Speaker都会不定时的断开连接,似乎是Catalina一直以来的Bug。

但是全网也没有找到修复的方式,就这样凑活着用了几天。

最后实在忍受不了几分钟断开一次,于是尝试看了一下系统日志,发现断开的时候bluetoothaudiod这个进程会被kill掉:

而当内存压力变为「黄色」时,这个进程会被100%杀掉,进程被杀掉后自然与AirPods断开连接,也就证实了「音乐会断开」。

守护进程

MacOS中,有两个位置存放守护进程:

  • /System/Library/LaunchDaemons:用户未登录时就启动的进程,没有任何UI界面,是一个后台服务
  • /System/Library/LaunchAgents:用户登录后启动的进程,可能会有一个图形界面

关于MacOS的Launchd信息可以查看这个PDF

bluetoothaudiod进程

bluetoothaudiod是一个守护进程(Daemon),配置文件在/System/Library/LaunchDaemonscom.apple.bluetoothaudiod.plist

有意思的是,配置文件中EnablePressuredExit被设置成了Ture:

1
2
3
4
5
6
<key>EnableTransactions</key>
<true/>
<key>EnablePressuredExit</key>
<true/>
<key>Label</key>
<string>com.apple.bluetoothaudiod</string>

按字面意思,EnablePressuredExit为「允许压力退出」?所以有可能:当内存压力大的时候,系统会杀掉这个进程来压缩内存。

解决方式

知道了哪里的问题,解决起来就很容易了:修改com.apple.bluetoothaudiod.plistEnablePressuredExit的值为False。但是由于MacOS有SIP保护,所以无法直接修改这个配置文件,需要先关闭SIP。

SIP 全称为「System Integrity Protection」即「系统完整性保护」,是 OS X El Capitan 时开始采用的一项安全技术。

少数派的一篇文章详细介绍了如何关闭SIP。

因为Catalina更新了SIP导致关闭了SIP仍然不能修改配置文件,只要重新挂载一下文件系统:

1
2
sudo mount -uw /
killall Finder

EnablePressuredExit这个字段的true改为false,保存,重新打开SIP,完成!

测试了一下:即使内存压力变成了「红色」,bluetoothaudiod这个进程仍然没有被杀掉:

最后

因为只修改了一个plist文件,可以说对系统影响性忽略不计,关键是终于可以安心的一边写代码一边听歌了!

话说,这其实不是一个Bug,而是控制上班效率的Feature?

🥳 加载Disqus评论