Mac 的 ~/Library/Group Containers 是什麼?哪些可以刪?
在一台用了一段時間的 Mac 上打開 ~/Library/Group Containers,會看到一整列 UBF8T346G9.Office、group.com.apple.notes 或 9K33E3U3T4.net.shinyfrog.bear 這樣的資料夾,有的只有幾 KB 的設定,有的裝著某個 App 的整個資料庫,也有幾個屬於早就移除的 App。名字看起來像亂碼,所以空間不夠的人常會把這個資料夾清空,而這麼做往往會出問題。
這篇講這個資料夾是什麼、名字怎麼讀、怎麼查出一個群組還被哪個已安裝的 App 使用,以及已移除的 App 留下的哪些群組可以移到垃圾桶。
這個資料夾是什麼
App Group 是開發者在 App 的程式碼簽署裡宣告的一塊共用空間,對應的授權項目是 com.apple.security.application-groups。Apple 的 App Groups 授權項目文件說明,同一個開發團隊的幾個 App 靠它共用容器和鑰匙圈存取群組,也靠它彼此溝通。在 Mac 上,每個群組會有一個 ~/Library/Group Containers/<group id> 資料夾,第一次用到時,系統會在裡面建立 Library/Application Support、Library/Caches 和 Library/Preferences。
Apple 列出兩種識別碼格式:
group.<group name>,要在 Apple Developer 網站註冊,iOS 用的也是這種格式。<team identifier>.<group name>,macOS 的格式,以開發者十個字元的 Team ID 開頭,不需要註冊。
資料夾名稱就是識別碼,所以直接列出資料夾,就看得出每個群組屬於哪一種。
為什麼 App 刪了,群組還在
一個群組很少只有一個成員。主 App、它的小工具、分享或 Finder 延伸功能,以及輔助工具,常常加入同一個群組,才能讀到同一份設定和檔案。開發者也可以把幾個獨立的 App 放進同一個群組,例如 Microsoft 的 Office App 共用 UBF8T346G9.ms、UBF8T346G9.Office 和 UBF8T346G9.OfficeOsfWebHost,Pages、Numbers 和 Keynote 共用 group.com.apple.iWork。
移除時 macOS 和 iOS 就不一樣了。Apple 的 containerURL(forSecurityApplicationGroupIdentifier:) 文件寫明,在 iOS 上,群組裡的 App 全部刪除後,系統會刪除群組目錄,而在 macOS 上,系統在 App 第一次需要時建立目錄,之後從不移除。把 App 拖到垃圾桶,它的群組會原封不動留在原處。
裡面裝的東西差別很大,可能是很小的偏好設定檔,可能是快取,也可能是真正的資料。Microsoft 提醒過,把 Office 的三個共用資料夾移到垃圾桶會刪掉 Outlook 的資料,WhatsApp 則把收到的媒體放在 group.net.whatsapp.WhatsApp.shared 和 group.net.whatsapp.WhatsApp.private 裡,可能佔到幾十甚至幾百 GB。
怎麼讀資料夾名稱
| 名稱形態 | 例子 | 通常代表什麼 |
|---|---|---|
group.<bundle id> |
group.com.apple.testflight |
以某一個 App 命名,這裡是 TestFlight |
group.<bundle id>.<suffix> |
group.net.whatsapp.WhatsApp.shared |
錨定在一個 App 的完整 id 上,由這個 App 或它的延伸功能使用 |
group.<shared name> |
group.com.apple.iWork、group.net.whatsapp.family |
幾個 App 共用,名稱裡沒有任何單一 App 的 id |
<TeamID>.<bundle id> |
9K33E3U3T4.net.shinyfrog.bear |
單一 App 的 Mac 寫法,這裡是 Bear |
<TeamID>.group.<name> |
G78RJ6NLJU.group.at.EternalStorms.Yoink |
以團隊為範圍的群組,可能是一個 App,也可能是好幾個 |
<TeamID>.<short name> |
UBF8T346G9.Office、UBF8T346G9.ms |
整個套件共用,以產品或廠商命名 |
有兩點讓它比看起來難判斷。Team ID 指的是開發者,不是 App,Mac 上 Microsoft 的每個群組都以 UBF8T346G9. 開頭,不管屬於 Teams 還是 Office。名稱長得像 bundle id,也不一定是目前這個 App 的 id,Teams 用的是 UBF8T346G9.com.microsoft.teams,App 本身卻是 com.microsoft.teams2。名稱只是線索,已安裝 App 的簽署才是證據。
為什麼按大小排序直接刪會出問題
這裡最大的幾個資料夾,通常正是還在使用的那幾個。按大小排序,排在最前面的會是郵件資料庫、備忘錄資料庫或聊天 App 的媒體,沒有一個是快取。
Apple 自己的 App 也在這裡。group.com.apple.notes 和 group.com.apple.reminders 屬於備忘錄和提醒事項,group.com.apple.iWork 屬於 Pages、Numbers 和 Keynote,以 systemgroup. 開頭的是系統群組。就算你不認得名稱,它們也都不是殘留。
共用群組比它的任何一個成員都活得久。移除 Word 之後,只要 Excel 或 Outlook 還裝著,UBF8T346G9.Office 就不能丟,刪了會讓剩下的 App 被重置或無法正常運作。
群組一旦刪除,裡面的內容就回不來了。還需要這個群組的 App,下次要用時會拿到一個新的空資料夾,但原本裡面的東西,除非你另外留了副本,否則就沒了。
查出一個群組屬於誰
先用唯讀的方式看看裡面有什麼、各佔多大:
ls ~/Library/Group\ Containers
du -sh ~/Library/Group\ Containers/* 2>/dev/null | sort -h | tail -15
第一行列出所有群組,第二行顯示最大的十五個,最大的排在最後。macOS 可能會詢問「終端機」能不能取用其他 App 的資料,如果你拒絕,或某個資料夾回報權限錯誤、沒有顯示大小,只是代表它沒被量到,不代表它是空的。
接著查一個已安裝的 App 是哪個開發者簽署的,宣告了哪些群組:
codesign -dv "/Applications/Microsoft Teams.app" 2>&1 | grep TeamIdentifier
codesign -d --entitlements - "/Applications/Microsoft Teams.app" 2>/dev/null
TeamIdentifier 那一行應該和你懷疑的那些群組的前綴相符。第二個指令會印出 App 的授權項目,它所屬的群組列在 com.apple.security.application-groups 底下。
想找出還有哪些已安裝的 App 宣告了某個群組,就搜尋它們的簽署:
find /Applications ~/Applications -maxdepth 3 -name "*.app" -prune 2>/dev/null |
while read -r app; do
codesign -d --entitlements - "$app" 2>/dev/null | grep -qF "UBF8T346G9.Office" && echo "$app"
done
它印出的每一行,都是自己的簽署裡宣告了這個群組的 App,這個群組就要留著。沒有輸出是很強的線索,但不是證明。這個迴圈只讀取每個 App 外層的簽署,而 App 裡面的小工具、延伸功能和輔助工具各有自己的簽署,裝在這兩個資料夾以外的 App 它也不會檢查。
哪些可以放心移除
下面幾條全部成立時,這個群組才是可以移除的殘留:
- 名稱裡帶著你已經移除的 App 的完整 id,或帶著一個你已安裝的 App 都沒用來簽署的 Team ID。
- 照上面的方法查過,沒有任何已安裝的 App 宣告它,
/Applications以外的 App 也算在內。 - 它不是 Apple 的群組,也就是不以
group.com.apple.或systemgroup.開頭,除非它正好是你移除的某個另外下載的 Apple App 自己的群組,例如 TestFlight。 - 你看過裡面的內容,確定用不到了。聊天 App 的媒體或 Outlook 的郵件資料庫,App 移除之後仍然是你的東西。
然後結束這個開發者的所有 App,在 Finder 裡用 前往 › 前往檔案夾 找到這個資料夾,移到垃圾桶,過一陣子再清空垃圾桶。之後重新安裝這個 App,它會從一個全新的群組開始。~/Library 其他地方的清理,可以看解除安裝 Mac App 後,如何清理殘留檔案,另外哪些地方看起來能刪其實不能刪,列在 Mac 清理工具絕不可刪的內容裡。
Mole 怎麼處理
Mole 只在解除安裝 App 時才會移除群組容器。它會找以這個 App 的 bundle id 命名的群組、帶有它 Team ID 的群組,以及 App 本身和裡面的延伸功能、登入項目、XPC 服務與輔助工具在簽署裡宣告的群組。和 App 完全同名的 group.<bundle id> 資料夾會預設勾選。<TeamID>.<bundle id> 資料夾、只是以 App id 開頭的群組,或 App 宣告的共用群組,會列出但不勾選,而屬於某個仍安裝著、id 更長更具體的 App 的群組,則根本不會列出。
每個群組移動前一刻,Mole 會再檢查一次。它會重新讀取同一開發者的已安裝 App 和啟用中的系統延伸功能,只要其中任何一個宣告了這個群組、它檢查過的 App 有變動或被重新安裝,或這份清單沒能及時讀出,就拒絕移動這個群組。某一列通過的結論,從不拿來套用到下一列。Apple 的 group.com.apple. 群組一律受保護,只有像 TestFlight 這種另外發佈的 Apple App 自己的群組例外,所以移除 Pages 時,group.com.apple.iWork 會留給 Numbers 和 Keynote。我在測試用的 Mac 上移除 Microsoft Teams 時,留下了 UBF8T346G9.com.microsoft.teams、UBF8T346G9.com.microsoft.oneauth 和 UBF8T346G9.com.microsoft.entrabroker 三個群組,Mole 把它們回報為受保護,而不是去猜。Office 的 UBF8T346G9.Office 和它的同伴,則是刻意不去動的。
解除安裝移除的所有東西都會進垃圾桶。在解除安裝之外,Group Containers 列在 Mole 受保護的使用者資料位置清單裡。「清理」裡的已解除安裝 App 殘留區塊,從不列出 group. 群組或共用群組,它唯一可能列出的群組容器,是沒有任何已安裝軟體認領其 id 的單一 App <TeamID>.<bundle id> 資料夾,而這項檢查沒辦法完成時,它一個都不列。其他清理的全貌,可以看 Mac 哪些快取可以刪,哪些資料該保留?和 Office 解除安裝指南。
常見問題
可以把整個 Group Containers 資料夾刪掉嗎?
不行。裡面有仍安裝著的 App 的資料,包括備忘錄、提醒事項、iWork,以及你在用的郵件或聊天 App。只有在確認沒有已安裝的 App 宣告某個群組之後,才一個一個移除。
為什麼 App 解除安裝了,群組還在?
在 macOS 上,系統在 App 第一次需要時建立群組資料夾,之後從不移除,而且同一個群組可能還被這個開發者的其他 App 或延伸功能使用。把 App 拖到垃圾桶不會動到它。
刪掉一個已安裝的 App 還在用的群組會怎樣?
App 會失去裡面的內容,例如設定、登入狀態或本機資料,下次要用時會拿到一個空資料夾。所以群組要移到垃圾桶,而不是直接刪除,哪個 App 出問題時還能放回去。