共有データを守りながら Mac アプリを削除する
自己完結型のアプリをゴミ箱へドラッグするだけで、十分なアンインストールになることもあります。一方で、ヘルパー、ドライバ、システム拡張、ログイン項目、共有コンテナ、大きなユーザーデータベースを入れるアプリもあります。目標は、ベンダー名に似たファイル名を片っ端から消すことではありません。ほかのアプリがまだ所有している書類や共有データを消しつつ、そのソフトを引退させることです。
隠れ場所、手作業での消し方、そして当て推量なしでまとめて見つける速い方法を整理します。
なぜゴミ箱へドラッグすると残骸が残るのか
Mac アプリはバンドル(.app ファイル)ですが、多くのアプリは初回起動時に、そのバンドルの外へもデータを書き込みます。環境設定、キャッシュ、サポートファイル、ときにはログイン項目やバックグラウンドエージェントです。.app を消すとプログラム本体は消えますが、Library 各所に残した痕跡までは消えません。その痕跡が、いわゆるアプリの残骸や residual です。
小さなアプリなら、無害な設定が少し残る程度です。ブラウザ、ゲーム、開発ツール、メディアアプリは、ユーザーが制御するデータをギガバイト単位で残すことがあります。サイズだけでは、捨ててよいキャッシュと、プロファイル、プロジェクト、メッセージ、プラグイン、ダウンロード済みコンテンツを区別できません。
システムを変えるアプリは、まずベンダーのアンインストーラを使う
VPN クライアント、ウイルス対策、オーディオドライバ、仮想化ソフト、クラウド同期クライアント、入力デバイス用ツール、システム拡張を持つアプリは、内蔵またはベンダー提供のアンインストーラで外してください。その手順は、拡張の無効化、特権サービスの停止、レシートの削除を、Finder では推測できない順序で行えます。始める前に設定やローカルデータを書き出し、サブスクリプションやデバイス認証を別に解除する必要があるかも確認してください。Apple の アンインストールガイドも、アプリに専用のアンインストーラがある場合はそちらを優先し、アプリを消してもサブスクリプションはキャンセルされず、そのアプリで作った書類も残ると記しています。
アプリの残骸が隠れる場所
多くのユーザー単位の残骸は、既定では隠れているユーザーの Library フォルダにあります。システムに深く組み込まれたソフトは /Library 配下にも入れることがあり、だからこそシステム全体を探すより、そのアンインストーラを使う理由になります。Finder で Option を押しながら 移動 メニューを開くと ライブラリ が表示されます。よくあるユーザー側の場所は次のとおりです。
~/Library/Application Support/:アプリの主なサポートデータ。しばしばいちばん大きい残骸です。~/Library/Caches/:速度のためにアプリが作ったキャッシュです。~/Library/Preferences/:アプリの設定(.plist)ファイルです。~/Library/Containers/と~/Library/Group Containers/:サンドボックス化されたアプリのデータです。~/Library/Logs/:アプリのログファイルです。~/Library/Saved Application State/:ウィンドウとセッションの状態です。~/Library/LaunchAgents/:ログイン時にアプリやサービスを再起動するバックグラウンドヘルパーです。
サンドボックスアプリはコンテナ内にデータを置き、グループコンテナ経由で共有することがあります。そのグループコンテナを使うすべてのアプリと拡張を特定するまで、削除しないでください。引退したひとつのアプリのために消すと、同じ開発者の別アプリのデータを消してしまうことがあります。
バンドル識別子で探す
残骸は見た目だけでは突き合わせにくいです。macOS はアプリの表示名ではなく、com.spotify.client のような reverse-DNS 文字列である バンドル識別子 で名付けるからです。まず識別子を取得します。
osascript -e 'id of app "Spotify"'
mdls -name kMDItemCFBundleIdentifier -r /Applications/Spotify.app
次に識別子とベンダー名を手がかりに検索します。
find ~/Library -maxdepth 4 \( -iname "*spotify*" -o -iname "*com.spotify*" \) -print 2>/dev/null
検索結果は候補であり、証明ではありません。各パスの中身、所有アプリ、役割を確認してください。設定は defaults で照会できますが、preference ドメインの削除は任意であり、再インストール時に古い設定を引き継げなくなります。容量がわずかか、将来の再インストールがありそうなら残してください。
手作業で消す手順
- 替えのきかないデータを書き出し、最新のバックアップがあることを確認します。
- ベンダーのアンインストール手順を確認し、ヘルパー、拡張、ドライバ、ライセンス状態を持つソフトではそちらを使います。
- アプリ本体と、アプリまたはアクティビティモニタ経由で見えるヘルパーを終了します。
- 単純な
.appをゴミ箱へ移し、Library 内で正確なバンドル一致とベンダー一致をレビューします。キャッシュと、プロファイル、プロジェクト、データベース、共有コンテナを分けて扱います。 - 残っているベンダーのログイン項目は システム設定 > 一般 > ログイン項目と拡張機能 から無効にします。plist のファイル名から launchd ラベルを推測しないでください。
- ベンダーの拡張やアンインストーラが求めるときだけ再起動します。関連アプリ、ファイル種別、デバイス、同期を確認してから、ゴミ箱を空にします。
この方法でもできますが、遅く誤りやすいです。アプリ名と開発者名がフォルダ名と一致しないこともあり、サンドボックスのデータは深く埋もれ、誤って消したり肝心なものを見逃したりしやすくなります。
より速く、より安全な方法
専用のアンインストーラはバンドル識別子を解決し、Library 内の有力な一致を集められます。Mole は削除前に候補とサイズを示し、パスを検証し、通常のファイルはゴミ箱へ移します。検索の手間は減りますが、ベンダーのアンインストーラを置き換えたり、共有コンテナを捨ててよいものにしたりはしません。レビューは飾りではなく、アンインストールの一部です。
内部の仕組み:安全なアンインストーラの動き
飛ばしても構いませんが、順序と検証がここで重要な理由がわかります。CLI とネイティブアプリは別実装ですが、どちらも発見、レビュー、確認済み実行に分けています。次の流れはネイティブアプリの経路です。
バンドル識別子は reverse-DNS 形式として受理されたときだけ、バンドル由来のマッチングに使えます。不正な入力で検索パターンが広がることはありません。スキャナは埋め込みログイン項目の識別子を、ファイル名からの推測ではなく、その Info.plist から読みます。完全なプランを承認すると、アプリは対象を終了し、その正確なヘルパーを止めます。起動項目は PathGuard が承認したあとだけアンロードされ、DeletionExecutor はゴミ箱レイヤーを呼ぶ前にすべての URL を再検証します。欠落、保護、拒否されたパスは、部分的な黙った削除ではなく、明示的なスキップになります。
安全なアンインストールの原則
システムに深く組み込まれたソフトは、ベンダーのアンインストーラを使います。単純なアプリはバンドルを消し、識別子とデータの種類で正確な残骸をレビューします。書類、プロファイル、データベース、グループコンテナは、所有が証明されるまで残します。関連アプリとサービスを確認しているあいだはゴミ箱に置き、Mac が期待どおり動いてから空にしてください。