This practical guide explains how to configure per-app proxy routing in v2rayNG on Android. You will learn how the app-list switch works, when to use bypass mode or proxy-only mode, how to select and save applications, how to start the VPN profile, and how to verify the result with browser, messaging, and local-network tests. Menu names can vary slightly between v2rayNG releases, but the routing logic remains the same.
What per-app proxy routing actually changes
v2rayNG normally creates a local VPN interface and captures traffic from Android applications. The Xray or v2fly core then receives those connections, applies the selected node and routing rules, and sends the request either through the proxy server or directly to its destination. Per-app proxy is an additional filter before the ordinary domain, IP, and outbound rules are applied: Android identifies the application that created the connection, and v2rayNG decides whether that application is included in the VPN route.
This is different from selecting a node or changing the global proxy mode. A node defines how an allowed request reaches the remote server. A routing rule decides where that request goes after it enters the core. The per-app list decides which applications are allowed to enter the VPN tunnel in the first place. If an application is excluded, its traffic normally uses the Android network path directly and will not be affected by the selected VLESS, VMess, or Trojan profile.
There are two practical list modes. In a bypass-style mode, the applications selected in the list are excluded from the VPN, while other applications use v2rayNG. In a proxy-only mode, only the applications selected in the list use v2rayNG, while all other applications remain outside the tunnel. The exact labels may appear as an inverse or bypass option depending on the build and translation, so read the description beside the switch rather than relying on the position of the toggle.
Bypass selected apps
- Selected apps
- Stay outside the VPN
- Other apps
- Use v2rayNG
- Useful for
- Excluding games or banking tools
Choose this when most applications should use the proxy and only a small group must remain direct.
Proxy selected apps
- Selected apps
- Enter the VPN tunnel
- Other apps
- Use the normal network
- Useful for
- Testing one browser or tool
Choose this when only two or three applications need the proxy and the rest should not be changed.
Practical decision
If you are setting up per-app routing for the first time, start with proxy-only mode and select one browser. It limits the scope of the test, makes DNS and IP checks easier to interpret, and avoids unexpectedly changing background applications.
Choose the correct app mode before selecting packages
Open v2rayNG and first confirm that a usable profile already exists. On the main screen, tap the profile entry you intend to use, run a latency test if your build provides one, and make sure the profile contains the expected server address, port, UUID or password, transport, and security settings. Per-app routing cannot repair an invalid node. If the core cannot establish the remote connection, an application may appear selected correctly while every request still times out.
Next open the application settings from the main screen. In common v2rayNG builds, the path is Menu → Settings → VPN settings, followed by an item named Allowed apps, Per-app proxy, or Application routing. Some releases place the app list directly under Settings. Android may display a system VPN confirmation the first time the profile starts; approve it only after checking that v2rayNG is the application you launched.
- Use proxy-only mode when you want to route a single browser, a test utility, or one work application while leaving Android services unchanged.
- Use bypass mode when nearly all applications should use the proxy but selected local-network tools, games, or payment applications should remain direct.
- Do not select v2rayNG itself by default. The client needs to maintain its VPN service and core process; excluding or including it unnecessarily can make troubleshooting more confusing.
- Include the complete package when an application has separate companion packages. A browser, download helper, or work profile may appear as a different package in the list.
- Remember Android profiles. A personal application and its work-profile copy can be listed separately, so selecting one does not always select the other.
The app list is not a domain allowlist. Selecting a browser does not mean that only one website inside that browser is proxied. Every connection created by that application may enter the VPN, including DNS requests, update checks, media connections, and connections to local addresses. If you need website-level control inside the selected application, combine per-app selection with the core’s routing rules rather than expecting the package selector to distinguish individual domains.
Open VPN settings
From the v2rayNG main screen, open Menu → Settings → VPN settings. If the labels differ, look for the settings page containing TUN, VPN, or application-list options.
Enable app routing
Turn on the per-app or allowed-app feature. Keep the mode visible while editing so that you do not accidentally interpret a bypass list as a proxy-only list.
Select packages
Open the application list, search for the target package, and tick one easily identified browser first. Add other packages only after the initial test succeeds.
Save the list
Tap the confirmation, save, or back control required by your build. Reopen the list once and verify that the selected checkboxes are still present.
Start the profile
Return to the main screen, select the intended node, tap the connect button, and accept the Android VPN request if it appears.
After saving, stop any previous VPN service before starting the new configuration. Android generally permits one active VPN service at a time, and an older profile can remain active even when the visible v2rayNG screen has changed. Wait until the status shows connected, then open the target application. If the app was already running, force-close it or remove it from recent tasks before testing so that persistent sockets do not produce a false result.
Configure and start a controlled test
A controlled test should begin with one selected application, one active profile, and one known destination. For example, select a browser in proxy-only mode, start a VLESS + TCP + REALITY profile, and visit a service that displays the public address. Do not begin by selecting ten applications and changing DNS, routing mode, and node at the same time. If the result is wrong, too many variables will be involved.
In the VPN settings, review whether Route all, Bypass LAN, or a similar local-network option is enabled. These controls are separate from the package list. A selected browser may enter the VPN, but a private address such as 192.168.1.1 can still be sent directly when LAN bypass is active. That behavior is often desirable for router panels and local printers, but it should be understood before diagnosing it as a failure.
Also check the DNS choice. A proxy-selected application can still resolve a hostname using Android’s ordinary resolver if the configuration does not redirect DNS through the core. This may create inconsistent results: the TCP connection uses the proxy, while the name lookup follows the local network. For ordinary testing, use the DNS behavior supplied by the imported profile first. Only change remote DNS, fake-IP mode, or domain strategies after confirming that the package selection itself works.
Small-scope test
- Mode
- Proxy selected apps
- Apps
- One browser
- Local port
- 127.0.0.1:10808 example
- First check
- Public IP and page load
Best for proving that the selected package enters the tunnel without changing every application.
Broad daily setup
- Mode
- Bypass selected apps
- Apps
- Games or local tools
- LAN option
- Bypass private ranges if needed
- First check
- Proxy and direct app pair
Best when the majority of Android traffic should follow the active node.
Do not confuse local ports with per-app routing
Ports such as 10808 or 10809 are local SOCKS or HTTP interfaces used by applications configured to use a manual proxy. Android VPN per-app routing works at the VPN-service level and does not require every application to be manually assigned one of those ports.
Start the service and watch the status for at least 10 seconds. A connected indicator only confirms that the VPN service and core are running; it does not prove that the intended application is included. Open the selected app, create a fresh request, and then open an excluded app to create a second request. This pair of tests gives you a baseline for both sides of the package rule.
Verify that each application follows the intended route
Verification should test more than whether one webpage opens. First record the public IP shown by the selected browser, then stop v2rayNG and record the same result over the ordinary network. Restart v2rayNG and compare again. If proxy-only mode is working, the selected browser should show the node’s egress address while an excluded browser or application should continue to use the ordinary network path. The addresses may occasionally be shared by a carrier or gateway, so repeat the test with a second destination when the results look identical.
Next test an application that uses a persistent connection, such as a messaging client or streaming tool. Force-close it, start v2rayNG, and launch it again. Background connections created before the VPN started may remain outside the new route, and an application can cache DNS answers or maintain an existing QUIC session. A clean relaunch is therefore more reliable than observing an already-open screen.
- Selected-app test: Open the selected browser and visit an IP-check page plus a normal HTTPS page.
- Excluded-app test: Open an unselected application and confirm that its behavior matches the direct network baseline.
- DNS test: Check whether the selected application resolves the expected hostname consistently; compare after reopening the app.
- LAN test: If LAN bypass is enabled, access a private router or storage address and confirm that local access remains available.
- Restart test: Stop the VPN, wait five seconds, start it again, and repeat the selected-app request to rule out a stale session.
Why does the selected app still show the direct IP?
Confirm that the mode is proxy-only rather than bypass, verify the checkbox after saving, and force-close the app before testing. Then check that v2rayNG shows the VPN as connected and that the selected profile passes a latency or connection test.
Why does an unselected app use the proxy?
The list may be in bypass mode, or the application may share traffic with a selected companion package. Switch temporarily to proxy-only mode with one selected browser and repeat the comparison.
Why can the browser open pages but a game cannot connect?
The game may use UDP, QUIC, a separate package, or a hard-coded IP. Check whether the profile and core support the required network type, select the correct package, and review the routing and core log entries.
Why is a local device unreachable?
Check Bypass LAN and private-address routing. If the device is on a different subnet, confirm the actual address range and avoid sending local management traffic through a remote proxy unless that is intentional.
Troubleshoot common per-app routing mistakes
When the expected split does not appear, begin with the simplest explanation: the wrong mode was selected. A bypass list and a proxy-only list can contain exactly the same packages while producing opposite results. Take a screenshot or write down the mode before changing the checkboxes. Then reduce the list to one package, save it, restart the VPN, and test again.
Another frequent cause is testing the wrong process. Android applications can include a main package, a work-profile copy, a browser helper, or a separately installed beta package. The visible application name may not identify the package that creates the connection. Select the package shown by v2rayNG, relaunch the application, and avoid adding every similarly named entry until you know which one is responsible.
If the VPN connects but the selected application cannot load anything, inspect the core log and compare the error with the local network state. A port conflict is more common when another VPN or proxy service is active. A handshake error points to the node’s address, port, SNI, UUID, public key, short ID, transport, or server availability—not to the app checkbox. A DNS error suggests resolver or domain-strategy settings. Separate these layers before editing the profile.
Error: VPN service is already running
Cause and fix: Another VPN profile or an older v2rayNG service still owns Android’s VPN slot. Disconnect it, wait several seconds, then start only the intended v2rayNG profile.
Error: bind: address already in use
Cause and fix: A local SOCKS, HTTP, or DNS port is occupied by another process or duplicate core instance. Stop the old service, change the local port in the client if necessary, and restart once.
Error: failed to handshake with server
Cause and fix: The remote node parameters or server state are invalid. Re-import the profile, verify the port and security fields, and test another node before changing per-app rules.
Error: DNS lookup failed
Cause and fix: The selected traffic entered the core but hostname resolution failed. Check the configured DNS server, network access, and domain strategy, then repeat with a known reachable hostname.
Battery optimization can also interrupt routing after the screen turns off. If traffic works immediately after connection but stops later, open Android’s app battery settings for v2rayNG and permit the background behavior required by your device. Do not disable every power restriction without reason; make the smallest change that keeps the VPN service alive. Also check whether the system automatically disables VPN applications, restricts background data, or switches networks between Wi-Fi and mobile data.
Reliable troubleshooting order
Use this order: confirm the active mode, reduce the list to one package, reconnect the VPN, relaunch the app, test a known destination, then inspect the core log. Changing the node, DNS, routing strategy, and Android permissions simultaneously makes it impossible to identify which layer caused the result.
Once the single-app test succeeds, add applications gradually and record whether each one should be proxied or bypassed. Keep a small written inventory of the selected packages, the active mode, the profile name, and any LAN exception. This is especially useful after importing a new subscription, clearing v2rayNG data, or moving between personal and work profiles. A predictable list is easier to audit than a large collection of unchecked entries.