Choose a client based on the node’s protocol, transport, security layer, and flow. For VLESS + REALITY or XTLS Vision, v2rayNG is the preferred choice on Android. If your nodes use VMess or WebSocket + TLS and the server is configured for V2Fly, consider v2flyNG. This guide covers the projects’ history, compatibility limits, and what to check after importing—whether you’re comparing Android clients or sharing a subscription between desktop and Android.
1. How Project V, V2Fly, and Xray are related
Project V is a collection of tools and technologies for network proxying, with V2Ray as its core project. The V2Fly community continues to maintain the V2Ray core, while Xray was forked from the V2Ray codebase in 2020 and developed independently. The projects share a history, but their cores now evolve separately. Similar-looking configuration files don’t guarantee that every feature is interchangeable.
The core establishes connections, applies routing, handles DNS, and transfers data. The client displays nodes, manages subscriptions, provides settings, and launches the core. On Android, v2rayNG uses the Xray core and v2flyNG uses the V2Fly core. Desktop v2rayN is a client—not a third protocol or an alias for either core.
- Project names: Xray and V2Fly refer to two separate core development paths.
- Client names: v2rayN, v2rayNG, and v2flyNG are the apps you interact with.
- Protocol names: VMess and VLESS are protocols that clients and servers use to exchange proxy traffic.
- Transport and security layers: WebSocket, TCP, TLS, and REALITY describe other parts of a connection; they are not client names.
So, “The node says V2Ray—which app should I install?” isn’t enough to choose a client. Providers may use “V2Ray node” as a catch-all for several configurations. Check the fields in the node details and the core features the server requires.
2. Protocol compatibility: VLESS is not REALITY
A common source of confusion is treating VLESS, REALITY, and XTLS as a single feature. VLESS is a proxy protocol; it does not itself provide encryption for the entire connection. TLS and REALITY are separate security-layer options. XTLS Vision involves flow control and data handling; a common configuration field is flow=xtls-rprx-vision.
| Node capability | Xray core | V2Fly core | What to check |
|---|---|---|---|
| VMess | Supported | Supported | Transport type, TLS, path, and server compatibility requirements |
| Basic VLESS | Supported | Basic VLESS is implemented; check the version and configuration format in use | The vless:// prefix alone isn’t enough—check the security layer and flow too |
| WebSocket + TLS | Common combinations supported | Common combinations supported | Host, path, server name, and certificate validation |
| REALITY | Supported | Cannot use Xray REALITY configurations | Server name, public key, short ID, and fingerprint |
| XTLS Vision | Compatible VLESS combinations supported | Not compatible with Xray Vision flow | Does xtls-rprx-vision match the server requirements? |
“Supports basic VLESS” doesn’t mean “supports every VLESS share link.” A link may include security=reality, type=tcp, and flow=xtls-rprx-vision at the same time. If any required feature is unsupported, the link may import but fail to start—or start but fail during the handshake.
Bottom line: Choose Xray for REALITY or Vision
Check the node’s security layer and flow. If it specifically requires REALITY or xtls-rprx-vision, use v2rayNG on Android and make sure its bundled core is recent enough. Don’t try v2flyNG based on the VLESS label alone.
3. v2rayNG vs. v2flyNG: Choose a client for your nodes
The two apps have similar names, but choosing between them is straightforward. Start with the provider’s requirements, then consider how you maintain your setup. Broader feature support doesn’t make every connection faster. For the same standard VMess node, link quality, exit congestion, and routing rules usually matter more than the client’s name.
v2rayNG · Xray core
RecommendedChoose v2rayNG for VLESS + REALITY, XTLS Vision, or subscriptions that mix different Xray-compatible nodes. After importing, check the security layer, flow, and core version. A client recognizing a link doesn’t guarantee a successful connection to the server.
Best for: First-time client selection, REALITY nodes, and everyday use of Xray-specific features
v2flyNG · V2Fly core
Stick with v2flyNG if you have a stable VMess or standard WebSocket + TLS setup and both the server documentation and configuration workflow are built around V2Fly. It’s a separate core path—not an “old app” that must be replaced with Xray.
Best for: Existing V2Fly deployments, verified settings, and keeping your current configuration workflow
If your current client works, first identify what switching is meant to solve. A new node requiring REALITY or a core that doesn’t recognize the flow is a clear feature requirement. Hearing that a core is “faster” isn’t enough reason to migrate. Before upgrading or switching devices, save your subscription URL and essential routing settings—but never post links containing account details in public forums.
- Only have a subscription URL? Check the node details after importing, or ask the provider which core and minimum version they recommend.
- Only have standard VMess nodes? Either core is an option; decide based on your existing setup and actual connection results.
- Have a mixed subscription? Check that each node parses correctly, especially entries using REALITY or Vision.
- Need custom JSON? Use the target core’s configuration format. Don’t import an entire Xray configuration as a V2Fly configuration.
4. Which share-link fields determine compatibility?
A subscription distributes a list of nodes; it isn’t a connection protocol. Base64 is commonly used to encode the list, while vmess:// and vless:// are node-sharing formats. Base64 only changes how text is represented—it can’t add REALITY support to a core that lacks it, and it shouldn’t be treated as encryption.
When checking a VLESS node, sort its fields into the four groups below. These descriptions explain what the parameters mean; they aren’t a ready-to-use node link. Get actual values from the provider—don’t guess or assemble them from experience.
| Field group | Common fields | What to check |
|---|---|---|
| Destination and identity | Server address, port, UUID | Must match the server. Port 443 doesn’t mean the other parameters are correct. |
| Transport | type=tcp、type=ws、path、host |
Don’t remove or change the WebSocket path or Host arbitrarily |
| Security layer | security=tls or security=reality, sni, fp |
Distinguish the server name from the connection address; set the fingerprint as specified by the provider |
| REALITY and flow control | pbk、sid、flow=xtls-rprx-vision |
Check the public key, short ID, and flow; don’t replace these with standard TLS parameters |
REALITY clients use the public key information provided by the server; the private key stays on the server. Some versions of the editor may use different field names, so check the documentation for that version to confirm which fields correspond. The public key in a share link isn’t a value for you to generate yourself. Changing it arbitrarily breaks the relationship required for the handshake.
- Import from a complete link or subscription to avoid truncating query parameters when copying by hand.
- Open the node editor and confirm that the protocol, transport, security layer, and flow are all preserved.
- If an entry is skipped, check the import format and app version first. Don’t assume that a missing node means the server is down.
- If the entry appears but the connection fails, check the core logs and server parameters.
5. Importing and testing on Android: remote ports vs. connection tests
In the commonly used Chinese-language version of v2rayNG, subscription management is usually under “Subscription group settings” in the side menu. Add the URL, then select “Update subscription” from the main-screen menu. To add a single share link, tap “+” in the upper-right corner, then “Import from clipboard.” Menu labels may vary slightly by version. Check the current interface in v2flyNG too; don’t assume one version’s menu path applies to every release.
These three items are examples, not speed-test results or defaults for every version. The remote port is the server’s connection endpoint; a local listener port is where apps send traffic to the client. Don’t mix them up. Some versions use a mixed listener port, so check the actual settings. Don’t add an HTTP endpoint that doesn’t exist just to match a tutorial.
- Record the versions: Find the app version and core version on the About screen or in the startup log. Include both when reporting an issue; the app version number doesn’t replace the core version.
- Check the node: Select the imported node and verify the server port and security layer. Don’t enter a local port such as 10808 as the server port.
- Start the service: The first time you start in VPN mode, approve the permission prompt from Android. Stop any other service using Android’s VPN connection before testing.
- Verify access: Open a destination that should use the proxy, then check the logs for connection and routing entries. A “running” status alone doesn’t mean the destination’s traffic is going through the proxy.
- Understand the test: TCP latency only reports the result of a particular connection test. It doesn’t fully verify authentication, TLS, REALITY, or access from an actual app.
6. Sharing a subscription between desktop v2rayN and Android
Sharing a subscription avoids entering nodes twice, but it doesn’t sync all local settings. Desktop system proxy settings, Android VPN permissions, per-app rules, and DNS policies are configured separately. Even with the same node selected on both devices, different routing rules may send traffic to the same destination through different exits.
Recommended: Share the node source, check local settings on each device
Desktop · v2rayN
- Add the same subscription URL, then update it manually to confirm the nodes are available.
- For REALITY or Vision, confirm that the current configuration runs on an Xray core that supports the feature.
- Check whether the system proxy or TUN is enabled and whether the destination matches a proxy rule.
Android · v2rayNG or v2flyNG
- Choose a client based on the node’s capabilities, then import the same subscription.
- Make sure per-app rules aren’t excluding the target app.
- Check the VPN service, DNS settings, and background status.
The same subscription provides the same node source, but update timing, import support, and local rules may differ. Verify each device separately.
If the desktop works but Android doesn’t after switching networks, first compare the node actually selected on each device and the core’s capabilities. Then check Android’s app routing and DNS resolution path. Don’t skip these checks just because the subscription is the same. Subscription URLs may contain access tokens; hide the full URL, UUID, and other account details in troubleshooting screenshots.
7. Troubleshooting import failures, handshake errors, and slow speeds
Choosing a core addresses feature compatibility, not every network issue. The stage where an error occurs is more useful for diagnosis than asking which core is “more powerful.” First check whether the node imports, then whether the core starts, then the remote handshake and destination access. Compare performance only after that.
| Symptom | Check first | Next step |
|---|---|---|
| Some nodes are missing after a subscription update | Response content, sharing format, and client parsing support | Test with a complete individual link and check the app version |
| Configuration error at startup | Unknown fields, unsupported flow, or custom configuration structure | Check the startup log to confirm which core is actually running |
| REALITY handshake failure | Public key, short ID, server name, fingerprint, and system time | Restore each parameter from the original values provided by the server |
| Works in the browser but not in a specific app | Per-app proxy rules, routing, DNS, and destination protocol | Confirm the app’s traffic enters the client before switching cores |
| Connects, but speeds are slow | Network congestion, packet loss, exit restrictions, and device load | Keep the node and destination fixed, repeat the test, and don’t compare across different routes |
Should you switch from V2Fly to Xray for better speeds?
There’s no universal answer. Vision’s processing may perform differently in suitable scenarios, but that doesn’t mean it’s faster on every network. A meaningful comparison uses the same device, network, server, and comparable configuration, and tracks handshake time, download throughput, and stability separately. If the protocol or route changes, you can’t attribute the entire difference to the core.
The node only says VLESS. What should you ask first?
- Does it use standard TLS or REALITY?
- Does it require
xtls-rprx-vision, and which transport type does it use? - Which core does the provider recommend, and what’s the minimum core version?
- Can the provider share a complete link instead of just the server address and UUID?
Bottom line: Match the configuration before comparing performance
For REALITY or Vision nodes, start with v2rayNG. For existing V2Fly configurations, first verify compatibility with v2flyNG. Once connected, check routing, DNS, and network performance. Treat feature selection and speed testing as separate steps.