Android Clash Battery Drain Fixes: Background Settings & Power-Saving Checklist

Abnormal battery drain on Android is rarely caused by one thing. A too-short health-check interval, TUN mode left running constantly, an overly verbose log level, and OEM background restrictions not properly configured — stack these four together and you get a real battery killer. This guide walks through them in diagnostic order and lands on a config that balances battery life with stable background connectivity.

Find the drain first: reading Android's battery stats

Before touching any settings, confirm the drain is actually coming from Clash itself — not from a flaky subscription node causing constant reconnects, or some other app hogging the background. Android's built-in battery stats give you a rough starting point: go to Settings → Battery → App battery usage, find your client (naming varies across Android forks — Clash Meta for Android, FlClash, Clash Verge, etc. — so look for whatever app you actually installed), and check two numbers: "background time" and "wakeups".

If wakeups are far above normal (as a rough baseline: a few dozen wakeups per hour is fine with health checks enabled, but hundreds should raise a flag), it's likely the health-check interval is set too short, or there are a bunch of dead nodes in the pool being probed repeatedly. If background time is long but wakeups aren't unusually high, it's more likely constant power draw from TUN mode keeping the network layer active, rather than any single runaway task.

Note: check the numbers before you touch any settings. Tuning by gut feeling often backfires — you might lengthen a log level that should be shortened, or disable a health check that should stay on, and end up with worse battery life and less stable routing to boot.

Health-check interval and probe frequency: stop Clash from constantly "phoning home"

In Clash and Clash Meta (mihomo core) proxy group configs, url-test and fallback groups both have an interval field (in seconds) that controls how often nodes in the group get latency-probed. The smaller this value, the faster it switches to a lower-latency node — but the trade-off is the network stack gets woken up, sends requests, and waits for responses far more often. On mobile data, each probe can trigger a baseband wakeup, and those add up to noticeable battery drain over time.

proxy-groups:
  - name: Auto Select
    type: url-test
    url: http://www.gstatic.com/generate_204
    interval: 300
    tolerance: 50
    proxies:
      - Node A
      - Node B

Most subscriptions ship with a default interval of around 60–120 seconds, which is fine on a plugged-in desktop but overly aggressive on a phone. For mobile, bump it to 300 seconds or more, and pair it with tolerance (in milliseconds) set to 50–100, so minor latency jitter doesn't trigger an unnecessary switch. If the subscription is remotely managed and you can't edit this field directly, most clients let you add an override rule under "Override" or "Local Override" that only touches interval without disturbing the rest of your routing rules.

  • Mostly idle in the background, switching speed isn't critical: set interval to 300–600 seconds.
  • Frequent foreground use with latency sensitivity (e.g. gaming acceleration): keep 60–120 seconds, but accept the battery trade-off that comes with it.
  • Persistent dead nodes in the pool: clean up your subscription or filter rules first — don't rely on a longer interval to paper over a low-quality node pool.

The cost of running TUN mode constantly — and alternatives

TUN mode sets up a virtual network interface at the system network layer that transparently takes over all device traffic, regardless of whether individual apps honor the system proxy setting. That gets you broader coverage and cleaner DNS handling, but the trade-off is the virtual interface has to stay active at all times — which naturally clashes with Android's power-saving strategy. The more the system tries to put the network stack to sleep, the more TUN needs it awake to keep intercepting packets, and the tug-of-war between the two usually means both worse battery life and less stability.

If your daily proxy needs are really just a browser and a handful of apps, there's no need to run TUN mode around the clock. You can fall back to system proxy mode, and only enable TUN temporarily when you genuinely need global interception (e.g. an app that bypasses the system proxy setting, or scenarios requiring UDP/DNS-level handling). The core difference boils down to "apps voluntarily respecting the proxy" versus "the network layer forcibly intercepting everything" — for a fuller breakdown of the mechanics, see our deep dive comparing TUN mode and system proxy elsewhere on this site.

Note: some Android clients tie TUN mode to a persistent foreground notification. Dismissing the notification icon doesn't necessarily turn off the TUN interface. Check the actual TUN toggle state in the client's settings page — don't rely on whether there's an icon in the notification bar.

Log level and GUI refresh: the hidden drain people overlook

At the debug log level, the client logs every connection being established and every rule match as it happens — write frequency is very high, and in scenarios with lots of rules and heavy concurrent connections, the constant disk writes and string processing alone eat CPU cycles. For daily use, dial the log level back to info or even warning, and only switch to debug temporarily when you actually need to troubleshoot something — then remember to switch it back.

log-level: info
# Switch to debug temporarily while troubleshooting, then switch back

Another easily overlooked factor is the client's UI refresh behavior. Some Android clients have a main screen with a live traffic graph or a scrolling connection list, and if the client doesn't properly release rendering resources when backgrounded, that UI can keep waking up compositor-related processes even off-screen. Check whether your client has a "pause UI updates in background" or "power saving mode" toggle, and make sure it's turned on. Also check whether the notification is set to refresh traffic numbers every second — that kind of high-frequency notification update has a bigger battery impact than you'd expect. Try dropping the refresh rate to once every few seconds in the notification settings, or switch it to just show connection status instead of live numbers.

OEM background restrictions: getting this wrong can drain more battery, not less

Major Android OEMs (Xiaomi, Huawei, OPPO, vivo, etc.) each layer their own background management policy on top of stock Android, and without proper whitelisting, that restriction layer can repeatedly "freeze and wake" the process — and each wakeup, which involves reconnecting nodes and rebuilding the TUN interface from scratch, actually burns more battery than just letting the process stay normally resident in the background. The general approach is the same across brands, though menu names differ slightly:

  • Xiaomi (MIUI/HyperOS): Settings → Apps → Manage apps → find the client → set Battery saver to "No restrictions", and also disable extra blocking items under "Autostart management".
  • Huawei (EMUI/HarmonyOS): Settings → Battery → App launch management → turn off "Manage automatically" for the app, then manually enable Auto-launch, Secondary launch, and Run in background.
  • OPPO (ColorOS): Settings → Battery → App battery usage → find the client and set it to "Allow background activity", and add it to the "Battery saver allowlist".
  • vivo (OriginOS/Funtouch OS): i Manager → App manager → Permission manager → High background power consumption, and set the client to allowed.

Worth pointing out: these settings only mean "allow normal background persistence", not "allow unlimited battery drain". Once the client is whitelisted, you still need to apply the earlier adjustments to health-check interval, TUN usage scope, and log level — otherwise you've just green-lit a config that was already draining battery in the first place, and battery life will only get worse. The two go hand in hand; skipping either one defeats the purpose.

A balanced config checklist: battery life vs. stable connectivity

Here's everything from the sections above condensed into a checklist you can act on directly, ordered from highest to lowest priority:

  1. Make sure your subscription's node pool is clean — remove long-dead nodes first, so health checks aren't wasting probe cycles on nodes that will never respond.
  2. Set interval for url-test / fallback groups to 300 seconds or more, and keep tolerance at 50–100 milliseconds.
  3. Don't run TUN mode persistently unless you need to — only enable it temporarily when you need global interception or special DNS handling.
  4. Keep the log level at info or lower day-to-day; switch to debug temporarily when troubleshooting, then switch it back promptly.
  5. Turn off or slow down the client's live-refresh notifications, and check for a "pause UI updates in background" toggle and enable it.
  6. Complete the background-restriction whitelist steps for your specific device brand — try to set all four items (autostart, secondary launch, background activity, battery saver allowlist) at once, so you don't miss one and end up with the process still getting frozen by the system.

How to know it worked: after 24 hours, check that wakeups in the battery stats have dropped noticeably and background time has leveled off, while routing rules are still matching correctly. Battery life and stable connectivity aren't really an either-or trade-off — in most cases, getting the settings right gets you both.


If nodes are still timing out en masse or connections are still misbehaving after adjusting the health-check interval and TUN usage scope, the issue may no longer be battery-related at all — it could be a problem with the nodes or subscription itself. In that case, keep working through the diagnostic order to check subscription validity, local clock drift, and port conflicts as deeper-level causes.

Download Clash Client

Android, Windows, and macOS clients are all available on the download page, along with the matching routing and subscription setup guides on the tutorials page.

Download Clash