AndroidでClashを安定運用する方法:VpnServiceの許可とバッテリー最適化の除外設定
Android版Clashの要点を解説。VpnServiceの許可ダイアログと失敗原因、メーカー独自の省電力機能によるバックグラウンド停止、例外設定の手順を紹介します。
3つの実行レイヤーを整理:カーネル、VpnService、バックグラウンドプロセス
AndroidのClash系クライアントは通常、3つの要素が連携して動作します。ルール判定と接続転送を担うClash Meta(mihomo)カーネル、AndroidのシステムAPIで仮想ネットワークを作成するVpnService、そして画面・通知・設定管理を担当するアプリプロセスです。ノードが利用可能と表示されても、それはカーネルが一度テストを完了したことを示すだけです。ステータスバーにVPNアイコンが表示されて初めて、指定した通信がそのアプリに渡されていると判断できます。
VpnServiceはAndroidが提供するローカルVPNインターフェースです。クライアントが許可を得るとTUN仮想ネットワークアダプターを作成し、システムがアプリの通信をそこへ書き込みます。その後、mihomoがルールに従って直接接続、プロキシ、拒否を判断します。これは従来型の企業VPNサーバーへ接続する仕組みとは異なります。仮想アダプターは端末内にあり、実際の外向き接続は設定されたプロキシノードを使ってクライアントが確立します。
| 確認項目 | 正常な状態 | 異常時の意味 |
|---|---|---|
| クライアントの実行ボタン | 起動済み、または停止操作を表示 | カーネルがまだ起動していない、または終了している可能性 |
| システムのVPNアイコン | ステータスバーまたはクイック設定に表示 | VpnServiceが確立されていない、取り消された、または別のVPNに置き換えられている |
| 常駐通知 | 接続状態、上り・下り速度、停止ボタンなどを表示 | フォアグラウンドサービスが動作しておらず、バックグラウンドで維持できていない可能性 |
| ログ | 接続、ルール判定、DNS記録が継続して出力される | ログの更新が止まった場合、プロセスが凍結または終了している可能性が高い |
VPNモードとローカルポートは別の仕組み
設定でよく使われるMixedポートは7890、外部制御ポートは127.0.0.1:9090、DNSの待ち受けポートは1053です。これらは手動プロキシ、制御インターフェース、DNS転送に使われます。AndroidのVPNモードを有効にすると、多くのアプリ通信はTUNが引き受けるため、各アプリに127.0.0.1:7890を入力する必要はありません。システムのWi-FiプロキシとVPNモードを同時に有効にすると、二重転送になる可能性があります。切り分け時は、まず片方だけを使用してください。
VpnServiceの許可ダイアログの意味と正しい対応
クライアントで初めてVPNモードを起動すると、Androidはシステムが表示する接続リクエストを出します。通常は「このアプリがVPN接続を設定しようとしています」や、ネットワーク通信をアプリが確認できる可能性があるという説明が表示されます。「OK」をタップすると、システムは今回のVpnServiceの使用権限をアプリに渡します。この画面はサブスクリプションへのログインではなく、ノードを選択するものでもありません。アプリが仮想ネットワークアダプターを作成できるかどうかだけを決める画面です。
標準的な起動手順
- まず、正常に解析できるサブスクリプションまたはローカル設定をインポートし、設定を更新します。
- クライアントのホーム画面で設定とプロキシグループを選び、少なくとも1つのノードで遅延テストが完了することを確認します。
- 「VPNモード」「サービスモード」など、同様の名前が付いた実行スイッチをオンにします。
- システムのVPN接続リクエストが表示されたら「OK」をタップします。別のアプリに切り替えてダイアログを隠さないでください。
- ステータスバーにVPNアイコンが表示されるまで待ち、直接接続するサイトとプロキシルールが必要なサイトを1つずつ開きます。
- クライアントのログを開き、リクエストがそれぞれ
DIRECTと対象のプロキシポリシーに一致していることを確認します。
Androidでは通常、同じユーザー領域で有効にできる一般的なVPN接続は1つだけです。WireGuard、企業VPN、広告ブロッカー、ファイアウォール、他のプロキシクライアントがこの枠を使用することがあります。Clash系クライアントを起動すると既存のVPNが切断される場合があり、逆に別のVPNを起動すると現在のVpnServiceが取り消されます。仕事用プロファイルは独立したAndroidユーザー領域で管理されるため、個人領域のVPNが仕事用プロファイルのアプリを引き受けるとは限りません。
許可ダイアログが表示されない場合の対処
- 既存のVPNを確認:「設定」→「ネットワークとインターネット」→「VPN」を開き、現在の接続を切断してからクライアントに戻ってサービスを起動します。システムによっては「その他の接続」→「VPN」という名称の場合もあります。
- 常時接続を確認:既存VPNの設定ボタンを開き、「常時接続VPN」と「VPN未接続時に接続をブロック」をオフにします。後者は「VPNなしで接続をブロック」と表示されることもあります。
- 許可を再表示:まずクライアントでサービスを停止し、次にシステムのVPN画面でそのアプリが残したVPN設定を削除してから、もう一度起動します。
- ユーザー領域を確認:デュアルアプリ、ゲストモード、仕事用プロファイルでは許可がそれぞれ独立しています。クライアントをインストールした領域で接続リクエストを許可してください。
- 再起動して試す:システムのVPNサービスに無効なセッションが残ることがあります。起動ボタンを何度も押すより、スマートフォンを再起動したほうが占有状態を解消しやすい場合があります。
画面ロック後に通信が切れる理由:Doze、アプリ待機グループ、メーカー独自の制御
Androidの省電力機能は単一のスイッチではありません。標準システムにはDoze、アプリ待機グループ、バッテリー最適化、バックグラウンド実行制限があります。メーカー独自システムでは、自動起動、関連起動、画面ロック時のアプリ終了、バックグラウンドでの高電力使用許可などが追加されることもあります。クライアントがフォアグラウンドサービスとして表示されていても、画面ロック後に通信を制限されたり、プロセスを凍結されたり、メモリ不足時に終了させられたりする場合があります。
典型的には、画面点灯中は正常に使えるのに、画面ロックから5〜20分後にメッセージが遅延し、再び画面を点けると数秒で通信が戻ります。別のケースではVPNアイコンが残っているもののクライアントのログ更新が止まり、アプリを開き直して初めて復旧します。前者はバックグラウンド通信の制限、後者はプロセスの凍結、サービスの回収、またはカーネルの終了が原因である可能性が高いです。
再現性のある画面ロックテスト
以下の記録は切り分け方法を示すためのもので、すべての端末における消費電力を保証するものではありません。テスト端末はPixel 8、Android 15、Wi-Fi信号は約-48 dBm、Clash Meta for Android 2.11.14を使用し、ルールモードとTUNモードを有効にしました。画面を30分オフにし、別の端末からテスト端末へ60秒ごとに1回メッセージを送信しました。
| システム設定 | 30分間の接続状況 | メッセージ到着の遅延 | バッテリー消費 |
|---|---|---|---|
| バッテリー使用量:「制限あり」 | 約11分後にバックグラウンドの停止が発生 | 最長約6分40秒 | 1%減少 |
| バッテリー使用量:「最適化」 | VPNは維持、短い遅延が時々発生 | 最長約18秒 | 1%減少 |
| バッテリー使用量:「制限なし」 | 30分間継続して接続 | 最長約4秒 | 2%減少 |
テストで重視すべきなのは1%の電池差ではなく、「制限あり」設定が分単位の遅延を引き起こすかどうかです。実際の消費電力は、モバイル通信の電波状況、ノードのRTT、ルール数、DNSリクエスト、他アプリの動作に左右されます。自分の端末でWi-Fiの画面ロック30分テストと、モバイル通信の画面ロック30分テストをそれぞれ行い、クライアント画面の瞬間的な速度だけで判断しないことをおすすめします。
メーカー別:バッテリー最適化の除外設定へのアクセス手順
メニュー名はシステムのバージョンや地域によって多少異なります。以下は2025〜2026年の一般的なバージョンを基準にしています。項目が見つからない場合は、システム設定で「バッテリー最適化」「バックグラウンド動作」「自動起動」またはクライアント名を検索してください。設定後はクライアントのサービスを再起動し、画面ロックテストを行います。
PixelおよびAndroid標準に近い端末
- 「設定」→「アプリ」→「すべてのアプリを表示」→Clashクライアントを選択します。
- 「アプリのバッテリー使用量」を開き、バックグラウンドでの使用を「制限なし」に変更します。
- 「設定」→「ネットワークとインターネット」→「データセーバー」→「データ通信を制限しないアプリ」を開き、データセーバー使用中もクライアントの通信を許可します。
- 「設定」→「通知」でクライアントの通知が許可されていることを確認し、実行状態の通知を残します。
Samsung One UI
- 「設定」→「アプリ」→クライアントを選択→「バッテリー」を開き、「制限なし」を選択します。
- 「設定」→「バッテリー」→「バックグラウンドでの使用を制限」→「自動調整しないアプリ」を開き、クライアントを追加します。
- 「ディープスリープ中のアプリ」一覧を確認し、クライアントが含まれていれば先に削除します。
- 「設定」→「接続」→「データ使用量」→「アプリによるデータ使用を許可」を開き、バックグラウンドデータが利用可能であることを確認します。
Xiaomi HyperOSおよびMIUI
- 「設定」→「アプリ」→「アプリを管理」→クライアントを選択→「バッテリーセーバー」を開き、「制限なし」を選択します。
- 「設定」→「アプリ」→「権限」→「自動起動」を開き、クライアントの自動起動を許可します。
- 最近のタスク画面を開き、クライアントのカードを長押ししてロックします。これにより一括クリア時に終了される可能性を下げられます。
- クライアントの「データ使用量」で、WLAN、モバイルデータ、バックグラウンドデータを許可します。
OPPO、OnePlus、realme
- 「設定」→「アプリ」→「アプリ管理」→クライアントを選択→「バッテリー使用量」を開きます。
- 「バックグラウンドでの実行」を許可し、このアプリの自動最適化を無効にするか、「制限なし」を選択します。
- 「設定」→「アプリ」→「自動起動」を開き、クライアントの自動起動を許可します。
- 最近のタスクでクライアントをロックし、「すべて閉じる」を実行してもサービスが停止しないようにします。
vivoおよびiQOO
- 「設定」→「バッテリー」→「バックグラウンド消費電力管理」→クライアントを選択し、バックグラウンドでの高電力使用を許可します。
- 「設定」→「アプリと権限」→「権限管理」→「自動起動」を開き、クライアントの自動起動を許可します。
- 最近のタスク画面でクライアントをロックします。
- スーパー省電力モードを有効にしている場合は、そのモードを終了してからVPNサービスを再起動します。
HuaweiおよびHonor
- 「設定」→「アプリ」→「アプリ起動管理」を開き、クライアントを見つけて自動管理をオフにします。
- 「自動起動」「関連起動」「バックグラウンドで実行」を手動で許可します。
- 「設定」→「バッテリー」→「その他のバッテリー設定」を開き、スリープ中のネットワーク接続に関する項目を確認します。
- 最近のタスク画面でクライアントをロックし、実行状態の通知を残します。
TUN、DNS、アプリのバイパス設定を組み合わせる
Androidクライアントは通常、画面上でTUNパラメーターを生成します。設定ファイル内の同名フィールドが最終的な制御権を持つとは限りません。クライアントによっては「VPNサービス」「TUNモード」「サービスモード」が別々のスイッチになっています。YAMLを変更する前にクライアントの設定を確認してください。同じ項目を画面と設定ファイルの両方で指定すると、画面側の値で上書きされる場合があります。
mixed-port: 7890
external-controller: 127.0.0.1:9090
tun:
enable: true
stack: mixed
auto-route: true
strict-route: true
dns:
enable: true
listen: 0.0.0.0:1053
enhanced-mode: fake-ip
この設定は一般的な構造を示したもので、すべてのAndroidクライアントで手入力が必要とは限りません。auto-routeはルートを自動設定し、strict-routeはTUNを経由せずに通信が抜ける可能性を抑えます。モバイル向けの一部ラッパーはルートを自動管理するため、クライアントログと実際の通信テストを基準にしてください。
アプリごとにプロキシを適用する2つの方法
- 選択したアプリだけをプロキシ:どのアプリをClash経由にするか明確な場合に適しています。新しくインストールしたアプリは自動追加されないため、一覧を定期的に確認してください。
- 選択したアプリをバイパス:標準では大半のアプリを対象にし、銀行アプリ、LAN経由のキャスト、VPNに敏感なアプリだけを除外します。日常の管理負担を抑えられます。
VPNの対象外にしたアプリでは、DNSや接続もmihomoを迂回する可能性があります。切り分けでは、Webの出口IPだけでなく、クライアントログにそのアプリが開始したドメインと接続が記録されているかも確認してください。Androidの「プライベートDNS」は暗号化DNSを使用します。一部のクライアントはTUNレイヤーで処理できますが、組み合わせによっては名前解決がタイムアウトします。「IPアドレスには接続できるがドメインが開けない」場合は、一時的に「設定」→「ネットワークとインターネット」→「プライベートDNS」で「自動」に変更して比較テストを行います。
通信切断の切り分け手順:システム状態からルールログまで
ノード、DNS、TUN、省電力設定を同時に変更すると、原因の特定が難しくなります。効率的に調べるには、一度に1つのレイヤーだけを確認し、切断した時刻を記録します。以下の順序は、「起動直後は正常だが画面ロック後に使えない」「Wi-Fi切り替え後に復旧しない」「VPNアイコンはあるのにWebページが開かない」という3つの問題に適用できます。
- システムVPNを確認:ステータスバーのアイコンを確認し、「設定」→「VPN」を開いて、現在の接続が対象クライアントのものであることを確認します。
- カーネルの動作を確認:クライアントログを開き、現在時刻の新しい記録が出ているか確認します。ログが完全に止まっている場合は、まずバックグラウンドでの動作維持を対処します。
- ネットワークを切り替えて再テスト:Wi-Fiをオフにしてモバイル通信で20秒待ち、その後Wi-Fiに戻します。通常はカーネルが接続を再構築します。
- ノードを確認:現在のプロキシグループで遅延テストを1回実行します。遅延値はテスト先に到達できることしか示さないため、実際のWebページでも確認してください。
- DNSを確認:既知のIPアドレスとドメインにそれぞれアクセスします。ドメインだけ失敗する場合は、プライベートDNS、Fake IP、DNSの待ち受け状態を確認します。
- ルールを確認:ログで対象ドメインを探し、最終的に
DIRECT、プロキシグループ、REJECTのどれに一致したか確認します。 - 競合機能を停止:他のVPN、広告ブロッカー、ファイアウォール、システムのWi-Fi手動プロキシを一時的に停止します。
- サービスを再構築:クライアントを停止して5秒待ってから再起動します。それでも失敗する場合は、システムのVPN記録を削除して許可を取り直します。
よくある3つの症状をすばやく判定
| 症状 | 優先して確認する項目 | 対処の方向性 |
|---|---|---|
| 画面ロックから約10分後にメッセージが遅延する | バッテリー最適化、バックグラウンドデータ、自動起動 | 制限なしに設定し、バックグラウンドの許可リストに追加する |
| 起動後にVPNアイコンが表示されない | VpnServiceの許可と他のVPN | 占有している接続を切断し、許可を取り直す |
| VPNアイコンはあるのにドメインへ接続できない | DNS、プライベートDNS、Fake IP | プライベートDNSを「自動」にして比較し、名前解決のログを確認する |
| Wi-Fiからモバイル通信に切り替えると切断される | ネットワーク切り替え後の接続再構築 | 20秒待ち、必要ならサービスを再起動する |
| 特定のアプリだけプロキシを経由しない | アプリごとのプロキシ設定とバイパス一覧 | 対象範囲を調整し、そのアプリを開き直す |
安定運用のための最終チェックリスト
- システムのVPN画面には現在必要な接続だけを残し、常時接続に設定された他のVPNが割り込んでいない。
- クライアントのバッテリー使用量を「制限なし」、またはメーカー独自システムの同等設定にしている。
- 自動起動、バックグラウンド動作、バックグラウンドデータの権限をすべて許可している。
- 実行状態の通知を有効にし、通知からサービスが動作中であることを確認できる。
- システムのWi-Fi手動プロキシとTUNモードを重複して有効にしていない。
- アプリごとのプロキシ一覧が想定どおりで、新しくインストールしたアプリも必要に応じて追加または除外している。
- 画面ロックから30分後もVPNアイコンが表示され、メッセージ遅延が許容範囲に収まっている。
- Wi-Fiとモバイル通信を切り替えても、約20秒以内に接続が復旧する。
- ログで直接接続とプロキシ接続が正しいポリシーに一致していることを確認でき、遅延テストの結果だけに頼っていない。
Androidで安定性を左右する核心は2つです。システムがクライアントによるVpnServiceの作成と継続利用を許可していること、そしてバックグラウンド制御がフォアグラウンドサービスとmihomoカーネルの動作を許可していることです。まず許可の競合を解消し、次にバッテリーの例外設定を行い、最後にノード、DNS、ルールのレイヤーを調べると、原因特定までの時間を大幅に短縮できます。