VpnService 授權:Android 代理的基礎機制
Android 平台上的 Clash 客戶端(以及 Clash Meta / mihomo 核心的移植版本)在沒有 root 權限的情況下,一律依賴系統提供的 VpnService 介面來實現流量接管。這套機制的原理是:客戶端向系統申請建立一個虛擬網路介面(TUN 裝置),系統彈出一次性授權對話框,使用者點擊「確定」後,該客戶端就取得了攔截、轉發全部或部分應用程式網路流量的權限。這個授權和真正的 VPN 連線沒有關係,只是 Android 系統用來限制「哪個應用程式可以建立虛擬網卡」的安全機制,任何需要透明代理能力的工具(不管是不是真的連線到遠端 VPN 伺服器)都要走這一套流程。
首次啟動客戶端並點擊「開始代理」或「連線」按鈕時,系統會彈出類似「是否允許 Clash 建立到所有網路流量的 VPN 連線」的確認框。這一步只需要授權一次,之後除非使用者手動撤銷、清除應用程式資料或更換客戶端,系統都會記住授權狀態。如果長時間沒有彈出這個對話框卻發現代理不生效,通常有兩種可能:一是客戶端在背景被系統靜默移除了授權,二是裝置上同時安裝了另一個佔用 VPN 介面的應用程式(系統只允許一個 VpnService 處於啟用狀態),需要先關閉另一個。
授權異常的排查思路
- 確認設定中沒有開啟「一律使用 VPN」綁定到其他應用程式,這會導致新客戶端無法搶佔介面。
- 檢查系統的「VPN」設定頁(通常在網路與網際網路分類下),看目前啟用的是不是目標客戶端。
- 部分客製化系統會在應用程式詳情頁額外提供一個「VPN 權限」開關,與首次彈窗的授權是兩套獨立紀錄,升級系統後可能需要重新確認。
分應用程式代理:精細控制哪些流量走節點
大多數 Android 客戶端在 TUN 模式基礎上提供了「應用程式白名單/黑名單」設定,本質是在虛擬網卡層面按套件名稱過濾流量,而不是修改每個 App 內部的網路邏輯。開啟分應用程式代理後,通常有兩種模式可選:
- 黑名單模式:預設所有應用程式都走代理,只有勾選的應用程式直連,適合「只想讓個別本地應用程式不受影響」的情境,例如銀行類、政府服務類 App 常需要直連才能正常驗證。
- 白名單模式:預設所有應用程式直連,只有勾選的應用程式走代理,適合「只想讓特定應用程式走節點」的情境,較省流量也更省電,建議大多數按需使用的使用者採用。
需要注意的是,分應用程式代理的生效範圍只覆蓋使用者空間的網路請求,系統層級元件(例如某些系統 DNS 解析、部分廠商內建的推播服務)可能不受套件名稱過濾約束,這屬於系統實作差異,不是客戶端的錯誤。另外,修改分應用程式清單後建議手動重新啟動一次代理服務(斷開再連線),不要指望設定能即時熱更新到已建立的連線中。
廠商省電策略為什麼會導致斷線
Clash 客戶端在 Android 上以前景服務的形式長期駐留記憶體,並持續維持一條 TUN 虛擬網卡的活躍連線。這種「長期在背景佔用資源」的行為模式,恰好是中國大陸主流客製化系統電池管理策略重點打擊的對象。廠商省電策略一般從三個層面介入:
- 行程凍結/查殺:鎖定螢幕或黑屏一段時間後,系統判定應用程式為「非活躍背景行程」,直接凍結或關閉行程,TUN 介面隨之失效,所有代理流量斷開。
- 自動啟動限制:被關閉的行程無法自行重新啟動前景服務,即便客戶端設定了斷線重連邏輯,行程本身已經不存在,重連也無從談起。
- 背景網路限制:即便行程存活,系統也可能單獨限制該應用程式在黑屏狀態下的背景網路存取權限,導致代理「看起來在運作,但流量對不上」。
這也是為什麼同一份設定檔、同一個客戶端版本,在原生 Android(如 Pixel)上穩定運作數小時不斷線,換到部分客製化系統上卻頻繁斷線——差異不在客戶端本身,而在系統對背景常駐服務的容忍度。
斷線後如果只看客戶端介面顯示「已連線」卻無法存取網路,大機率是 TUN 介面已被系統回收但介面狀態未及時刷新,而不是節點或訂閱出了問題。先重新啟動一次代理服務再排查其他環節。
把客戶端加入省電白名單的具體路徑
解決上述斷線問題的核心思路是:告訴系統「這個應用程式不要被自動最佳化」,把它從省電策略的管轄範圍裡移出來。各家客製化系統的入口命名不同,但操作邏輯基本一致,以下是常見系統的路徑參考(以設定選單常見命名為準,具體措辭可能隨系統版本略有差異):
原生 Android / 大部分接近原生的系統
- 進入「設定」→「應用程式」→找到目標客戶端。
- 點擊「電池」或「電池使用狀況」。
- 將「電池最佳化」從「最佳化」改為「不最佳化/無限制」。
MIUI(小米/紅米)
- 「設定」→「應用程式設定」→「應用程式管理」→找到客戶端。
- 「省電策略」選擇「無限制」。
- 額外檢查「自動啟動管理」是否已允許該應用程式自動啟動,以及「鎖定背景」(部分版本稱為「鎖定螢幕應用程式」)是否已在最近工作列中鎖定該應用程式圖示。
ColorOS / realme UI(OPPO/一加/真我)
- 「設定」→「電池」→「應用程式耗電管理」→找到客戶端。
- 關閉「休眠時停止活動」,並將耗電管理策略設為「允許背景執行」。
- 在最近工作列中長按客戶端卡片,選擇鎖定圖示,防止被一鍵清理背景時清除。
EMUI / HarmonyOS(華為/榮耀)
- 「設定」→「電池」→「應用程式啟動管理」→關閉客戶端的自動管理,手動開啟「自動啟動」「關聯啟動」「背景活動」三項。
- 「設定」→「電池」→「更多電池設定」→在耗電應用程式管理中確認該客戶端未被限制。
One UI(三星)
- 「設定」→「應用程式」→找到客戶端 →「電池」。
- 將「休眠應用程式」「深度休眠應用程式」清單中的該應用程式移除。
- 關閉「若長時間不使用則將該應用程式置於休眠狀態」開關。
設定完成後,建議重新連線一次代理,並保持黑屏 20~30 分鐘做驗證,確認背景斷線問題是否消失。如果個別系統版本更新後設定被重置,通常需要在每次大版本升級後重新檢查一遍上述開關。
日常使用中的穩定性建議
除了省電白名單,還有幾個細節能明顯提升 Android 端 Clash 客戶端的長期穩定性:
- 盡量在客戶端內開啟「保持通知常駐」或前景服務通知,這類前景服務通知會明顯降低系統主動查殺的機率,是官方設計上換取存活權的正常代價。
- 避免使用第三方一鍵清理類工具,這類工具往往會繞過系統白名單機制強行結束行程。
- 路由器或系統層已經做了 DNS 分流的使用者,分應用程式代理建議優先用白名單模式,減少虛擬網卡處理的連線數,間接降低耗電。
- 訂閱更新建議手動觸發而非依賴定時自動更新,定時工作在背景被限制時容易靜默失敗,造成規則與實際節點不同步。
把授權流程理清楚、按需設定分應用程式代理、再針對具體機型完成省電白名單設定,基本可以覆蓋 Android 端最常見的「用著用著就斷了」的問題。如果處理完上述步驟仍反覆斷線,可以進一步排查是否是節點或訂閱本身的問題,而不是繼續在系統設定裡打轉。