Catilina:消失的音频
前几天升级了MacOS Catalina,正一边感叹新系统的伟大一边探索新功能的时候,AirPods莫名其妙的断开了。Mojave的时候也偶尔断开过几次,无非是和2.4G频道有冲突,就没有在意。
然而,再次连接没过几分钟又次断开了。具体表现为:
蓝牙仍在连接,只是输出设备变成了「扬声器」,同时音乐也自动暂停,尝试重新在声音设备连接后一直显示「正在连接」动画。
于是就尝试排查到底是什么原因导致的断连:
- 还原 Mac 的蓝牙模块( Shift+Option+蓝牙图标)
- 将 Mac 「所有连接的 Apple 设备还原到出厂设备」
- 移除 Mac 的连接的所有蓝牙设备
- 重启 Mac
- 重置 AirPods
- 重置Mac 的 NVRAM 和 PRAM
均没有效果,每次切换成AirPods之后几分钟就断开连接了,体验极差。更惨的是,前几天刚刚删掉了TM备份,想不丢数据回到Mojave也不可能了。(论NAS容量大的重要性
原因
看了一下Apple Community,发现好多人也有同样的问题:
- https://discussions.apple.com/thread/250793838
- https://discussions.apple.com/thread/251061620
- https://discussions.apple.com/thread/251167121
- https://discussions.apple.com/thread/251142499
除了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/LaunchDaemons
的com.apple.bluetoothaudiod.plist
。
有意思的是,配置文件中EnablePressuredExit
被设置成了Ture
:
1 | <key>EnableTransactions</key> |
按字面意思,EnablePressuredExit为「允许压力退出」?所以有可能:当内存压力大的时候,系统会杀掉这个进程来压缩内存。
解决方式
知道了哪里的问题,解决起来就很容易了:修改com.apple.bluetoothaudiod.plist
中EnablePressuredExit
的值为False
。但是由于MacOS有SIP保护,所以无法直接修改这个配置文件,需要先关闭SIP。
SIP 全称为「System Integrity Protection」即「系统完整性保护」,是 OS X El Capitan 时开始采用的一项安全技术。
少数派的一篇文章详细介绍了如何关闭SIP。
因为Catalina更新了SIP导致关闭了SIP仍然不能修改配置文件,只要重新挂载一下文件系统:
1 | sudo mount -uw / |
将EnablePressuredExit
这个字段的true
改为false
,保存,重新打开SIP,完成!
测试了一下:即使内存压力变成了「红色」,bluetoothaudiod
这个进程仍然没有被杀掉:
最后
因为只修改了一个plist文件,可以说对系统影响性忽略不计,关键是终于可以安心的一边写代码一边听歌了!
话说,这其实不是一个Bug,而是控制上班效率的Feature?
🥳 加载Disqus评论