背景

自己当前在用的这款 MacBook Pro 是 2017 款带 Touch Bar 的,当年发布后不久入手。距今虽已有 7 年,但实际服役时间并没有那么久,因为中间有几年用的是公司的电脑。

这几年使用下来整体体验还是不错的,但最近却出了大问题:屏幕闪烁严重(简直能把眼睛闪瞎)。

由于我这里遇到的是硬件层面的故障,软件层面图像渲染并没有问题,因此用 macOS 上的软件录屏看不出异常。要想把异常录下来,只能拿外部设备(eg. 手机)录,嫌麻烦我这里就不录了。

问题 debug

自己 debug 了下,发现按下电源键开机、刚出现苹果 logo 时,苹果 logo 的闪烁就非常明显(苹果 logo 是白色的,有闪烁能很明显看出来;而在 recovery mode 下由于整个界面都是深色/黑色的,有闪烁也看不出来)。此时距引导进入 OS 还很远,因此大概率是硬件问题。

预约了苹果的电话技术支持,描述了问题及现象,苹果的技术支持也认为大概率是硬件问题,很可能是排线故障。

网上搜了下,发现是老问题了(Flexgate):

根据 TheVerge 的说法,Flexgate 影响的是 2016-2018 款的 MacBook(我的 MacBook 符合),欧洲用户大多两年出问题(我的 MacBook 服役时间远超两年)。然鹅,黑心的苹果公司却不承认这个问题,更别提什么维修/召回计划了。:-(

Flexgate refers to a design flaw in the ribbon cable connecting the body of the laptop to the display: that cable is supposed to flex with the opening and closing of the computer, but it’s wearing down too quickly with conventional use. Uncovered by an iFixit report and named by one of the site’s users, this problem is dramatically compounded by the fact that the cable in question is affixed to the display — so the only means of repairing a fault with the cable is the total replacement of the display. Which isn’t cheap.

iFixit says the Flexgate flaw means it’s a matter of when, not if, your MacBook’s display cable will give out. In the European Union, consumer protection dictates a two-year warranty on all products, and it seems like the Flexgate issue is becoming apparent in most affected laptops right around this two-year mark. That means that just as your statutory rights to free repair are running out, you’re getting hit with an intolerable display malfunction.

解决思路

由于这台 MBP 使用上并没什么大问题,而且我一直的使用习惯都是外接两台 4K 显示器,所以少一个内置显示器对我来说问题不大。

于是,问题就变成了如何关闭 MacBook 内置显示器。

尝试方案

MacBook 合盖使用

发热严重,尤其是夏天。MacBook 简直烫手,放弃。

参考:

SwitchResX

SwitchResX 能从硬件层面关闭内置显示器的输出。

看了 Felix021 的这篇 blog,同样尝试了 SwitchResX。连遇到的问题都一样:拔掉外接显示器线后,MacBook 内屏仍然是关闭状态;而当我重新连接上接显示器后,干脆连外屏也不亮了……

好家伙,这样一来我 3 块屏幕都不亮了,这电脑我还咋用?没办法,我只能按电源键重启了。

查了下官方的 FAQ,这似乎是 macOS 的锅:

I disabled the internal screen, then I unplugged the external display…… and I got a blue screen, and I had to turn my Mac Off to get access again.

This is unfortunately a bug in macOS. When the internal screen is disabled by SwitchResX, you have to turn it on manually before unplugging the external screen. macOS will not enable the internal screen automatically.Worse: it will think the internal screen IS active, when it is actually not, so any tentative to force turning is on will be unsuccessful…

官方建议的绕过这个 bug 的方法:在你拔掉外接显示器之前,手动 enable 内置显示器。

这么滑稽的解决方法,放弃。

displayplacer

displayplacer 提供了关闭显示器输出的方法。由于上面 SwitchResX 提到的 macOS bug,猜测 displayplacer 会有类似的问题。试了下,确实如此。

displayplacer 的 README 也提到了:

If you disable a screen, you may need to unplug/replug it to bring it back.

放弃。

Lunar

Lunar 是一款可以调节屏幕亮度的软件,而且提供了 CLI。它本身并没有关闭显示器输出的功能,但将屏幕亮度调到最低(也就是 0),视觉上和关闭显示器是一样的。

基于 Lunar 的完整的解决方案,需要包含以下几点:

  1. 将内置显示器 mirror for 某个外接显示器。这样做的目的是,保证所有的窗口都不会出现在内置显示器上,以绝后患。以 Command + Tab 这个 Application Switcher 为例,除非配置妥当,否则它的窗口是有可能出现在内置显示器屏幕上的。
  2. 用一个后台脚本(或者 crontab),不断检测 MacBook 是否连接了外接显示器,据此调节 MacBook 内置显示器亮度:连了,置 0;没连,置 25(自己酌情调整)。我自己的办法是,用 Automator 实现开机自启动亮度调节脚本,脚本每隔几秒检测调节一次。

Lunar 的使用上也有些注意事项/坑:

  • Lunar CLI 需要 Lunar 在前台运行才能生效。因此建议将 Lunar 设为开机自启动。
  • Lunar 默认内置显示器的最小亮度是 1。如果你无法将内置显示器亮度置为 0,可以先尝试用 Lunar 将内置显示器最小亮度置 0。
    Lunar min brightness
  • Lunar 有时会出现 not responding 的情形(eg. 开机自启动/插拔外接显示器/休眠后唤醒)。如果出现该问题,先在 Activity Monitor 中杀掉进程,然后重启 Lunar。个人体感,出现频率不高,影响不大。
    Lunar not responding

总结

由于 macOS 的 bug,截止当前(2024.06.27),任何物理上关闭 MacBook 内置显示器的方案都是不靠谱的。

总体而言,对基于 Lunar 的方案还是比较满意的。

如果笔记本电脑内置显示器不能用,那跟台式机基本无异了。

后面准备将这台 MBP 送 Genius Bar 检测,看是否真的是屏幕排线问题;由于早已过保,而官方维修价格高的离谱,只能找第三方维修了。

参考

Leave a Reply

Your email address will not be published. Required fields are marked *