逆向工程 macOS Tahoe 的影片桌布

Apple 在近期 macOS 版本中引入的電影級「Aerials」改變了桌面體驗,但系統仍然是封閉的。使用者無法在系統桌布選擇器中原生加入自己的影片檔案。於是出現了 Phosphene,這是一個由開發者 kageroumado 所打造的開源專案,透過逆向工程底層系統框架,將自訂影片桌布帶入 macOS Tahoe。

核心挑戰:WallpaperExtensionKit

Phosphene 並非僅在桌面上疊加影片;它直接整合到原生 macOS 桌布選擇器 System Settings → Wallpaper 中。為了達成此目標,開發者必須深入 WallpaperExtensionKit.framework,這是支援系統內建 Aerials 的 Apple 私有框架。

由於此框架是私有的,沒有公開的 SDK。Phosphene 採用了多種進階技術與作業系統溝通:

  • 動態載入:應用程式使用 dlopen 在執行時載入私有框架。
  • 執行時內省:由於 XPC 類型(應用程式與系統之間的通訊協定)未在公開標頭中定義,Phosphene 使用 Swift 的 Mirror 反射來解析並與這些類型互動。
  • 方法交換:為防止鎖定畫面在過渡期間變成灰色,開發者必須對 WallpaperSnapshotXPC 編碼器進行 method swizzling。系統預期的是特定的編碼類型 (NSXPCCoder),但實際的編碼器是其子類;若未進行此執行時修改,快照將無法編碼。

系統架構

Phosphene 分為兩個主要元件,透過共享的 App Group 容器進行通訊:

1. 功能列應用程式 (Phosphene.app)

它作為管理層,負責影片庫、管理中繼資料,並執行 HEVC 最佳化。它還包含一個 VideoOptimizationService,可預先渲染較低解析度或較低 fps 的影片變體,以節省系統資源。

2. 桌布擴充套件 (PhospheneExtension.appex)

它是 WallpaperAgent 的宿主。以獨立進程執行,意味著即使主功能列應用程式退出,桌布仍會持續播放。此擴充套件使用 AVSampleBufferDisplayLayer 將實際渲染輸出至遠端的 CAContext

為效能與電池壽命而設計的工程

在實作影片桌布時,最重要的挑戰之一是對電池與散熱效能的影響。Phosphene 實作了精密的 PlaybackPolicy,確保桌布不會耗盡筆記型電腦電池或導致熱節流。

具電源感知的播放

PlaybackPolicy 作為唯一的真實來源,將多種輸入——熱狀態、電池電量、交流電狀態、遊戲模式與展示模式——彙整為四種狀態:fullreducedminimalpaused

智慧遮蔽偵測

為節省 GPU 時間,Phosphene 偵測所有螢幕是否被視窗完全覆蓋。當桌面不再可見時,渲染器會完全暫停,直至桌面再次顯示。

無縫循環

標準的 AVPlayerLayer 常在遠端 CAContext 中失效。為解決此問題,開發者實作了手動解碼管線。透過為當前循環使用一個 AVAssetReader,為下一循環預載另一個,並套用跨循環增長的 PTS(呈現時間戳記)偏移,引擎得以實現逐格精準、無卡頓的循環,且不需清除渲染器。

技術需求與限制

對於想要建置或安裝 Phosphene 的使用者,因依賴最新 macOS API,需求相當嚴格:

  • 作業系統:macOS Tahoe(26.0 以上),因為它依賴 Tahoe 專屬的 SwiftUI 與 glassEffect() API。
  • 硬體:Apple Silicon(arm64-apple-macos26.0)。
  • 工具:Xcode 17 以上,啟用 Swift 6 嚴格併發。

結論

Phosphene 展示了逆向工程 Apple 私有框架的典範。雖然作者最初打算將其作為商業產品,但此專案已開源,讓人窺見 macOS 如何處理高階視覺效果,並為使用者提供一種自訂桌面的方式,達到 Apple 原生無法提供的精細度。

Sources