From 73d1dce4db1f12868d17bb213d92d414c93f9ea2 Mon Sep 17 00:00:00 2001 From: yuhan6665 <1588741+yuhan6665@users.noreply.github.com> Date: Mon, 12 Jan 2026 01:16:44 -0500 Subject: [PATCH] Add xray-core tun mode (#5150) * Add xray-core tun mode The service start-up sequence is changed: vpn service is created first, a file descriptor to the underlining vpn service can then be passed to xray-core, Xray core then create the TUN inbound from it * Remove badvpn-tun2socks --- .../main/assets/v2ray_config_with_tun.json | 117 ++++++++++++++++++ .../src/main/java/com/v2ray/ang/AppConfig.kt | 4 +- .../com/v2ray/ang/handler/SettingsManager.kt | 1 + .../v2ray/ang/handler/V2RayServiceManager.kt | 9 +- .../v2ray/ang/handler/V2rayConfigManager.kt | 44 +++++-- .../ang/service/V2RayProxyOnlyService.kt | 2 +- .../com/v2ray/ang/service/V2RayVpnService.kt | 30 +++-- .../java/com/v2ray/ang/ui/SettingsActivity.kt | 9 +- .../v2ray/ang/viewmodel/SettingsViewModel.kt | 10 +- .../app/src/main/res/values-ar/strings.xml | 3 +- .../app/src/main/res/values-bn/strings.xml | 3 +- .../src/main/res/values-bqi-rIR/strings.xml | 3 +- .../app/src/main/res/values-fa/strings.xml | 3 +- .../app/src/main/res/values-ru/strings.xml | 3 +- .../app/src/main/res/values-vi/strings.xml | 3 +- .../src/main/res/values-zh-rCN/strings.xml | 3 +- .../src/main/res/values-zh-rTW/strings.xml | 3 +- V2rayNG/app/src/main/res/values/arrays.xml | 5 + V2rayNG/app/src/main/res/values/strings.xml | 3 +- .../app/src/main/res/xml/pref_settings.xml | 12 +- 20 files changed, 210 insertions(+), 60 deletions(-) create mode 100644 V2rayNG/app/src/main/assets/v2ray_config_with_tun.json diff --git a/V2rayNG/app/src/main/assets/v2ray_config_with_tun.json b/V2rayNG/app/src/main/assets/v2ray_config_with_tun.json new file mode 100644 index 00000000..c3ad3e3d --- /dev/null +++ b/V2rayNG/app/src/main/assets/v2ray_config_with_tun.json @@ -0,0 +1,117 @@ +{ + "stats":{}, + "log": { + "loglevel": "warning" + }, + "policy":{ + "levels": { + "8": { + "handshake": 4, + "connIdle": 300, + "uplinkOnly": 1, + "downlinkOnly": 1 + } + }, + "system": { + "statsOutboundUplink": true, + "statsOutboundDownlink": true + } + }, + "inbounds": [{ + "tag": "socks", + "port": 10808, + "protocol": "socks", + "settings": { + "auth": "noauth", + "udp": true, + "userLevel": 8 + }, + "sniffing": { + "enabled": true, + "destOverride": [ + "http", + "tls" + ] + } + }, + { + "tag": "http", + "port": 10809, + "protocol": "http", + "settings": { + "userLevel": 8 + } + }, + { + "tag": "tun", + "port": 0, + "protocol": "tun", + "settings": { + "name": "xray0", + "MTU": 1500, + "userLevel": 8 + } + } +], + "outbounds": [{ + "tag": "proxy", + "protocol": "vmess", + "settings": { + "vnext": [ + { + "address": "v2ray.cool", + "port": 10086, + "users": [ + { + "id": "a3482e88-686a-4a58-8126-99c9df64b7bf", + "alterId": 0, + "security": "auto", + "level": 8 + } + ] + } + ], + "servers": [ + { + "address": "v2ray.cool", + "method": "chacha20", + "ota": false, + "password": "123456", + "port": 10086, + "level": 8 + } + ] + }, + "streamSettings": { + "network": "tcp" + }, + "mux": { + "enabled": false + } + }, + { + "protocol": "freedom", + "settings": { + "domainStrategy": "UseIP" + }, + "tag": "direct" + }, + { + "protocol": "blackhole", + "tag": "block", + "settings": { + "response": { + "type": "http" + } + } + } + ], + "routing": { + "domainStrategy": "AsIs", + "rules": [] + }, + "dns": { + "hosts": {}, + "servers": [] + } +} diff --git a/V2rayNG/app/src/main/java/com/v2ray/ang/AppConfig.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/AppConfig.kt index 3f4654bd..cd2b3f3d 100644 --- a/V2rayNG/app/src/main/java/com/v2ray/ang/AppConfig.kt +++ b/V2rayNG/app/src/main/java/com/v2ray/ang/AppConfig.kt @@ -63,7 +63,7 @@ object AppConfig { const val PREF_IS_BOOTED = "pref_is_booted" const val PREF_CHECK_UPDATE_PRE_RELEASE = "pref_check_update_pre_release" const val PREF_GEO_FILES_SOURCES = "pref_geo_files_sources" - const val PREF_USE_HEV_TUNNEL = "pref_use_hev_tunnel" + const val PREF_TUN = "pref_tun" const val PREF_HEV_TUNNEL_LOGLEVEL = "pref_hev_tunnel_loglevel" const val PREF_HEV_TUNNEL_RW_TIMEOUT = "pref_hev_tunnel_rw_timeout_v2" const val PREF_AUTO_REMOVE_INVALID_AFTER_TEST = "pref_auto_remove_invalid_after_test" @@ -175,6 +175,8 @@ object AppConfig { /** Give a good name to this, IDK*/ const val VPN = "VPN" const val VPN_MTU = 1500 + const val TUN_hevsocks5 = "hev-socks5-tunnel" + const val TUN_xray = "xray-core" /** hev-sock5-tunnel read-write-timeout value */ const val HEVTUN_RW_TIMEOUT = "300,60" diff --git a/V2rayNG/app/src/main/java/com/v2ray/ang/handler/SettingsManager.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/handler/SettingsManager.kt index 09656a70..7c2cf359 100644 --- a/V2rayNG/app/src/main/java/com/v2ray/ang/handler/SettingsManager.kt +++ b/V2rayNG/app/src/main/java/com/v2ray/ang/handler/SettingsManager.kt @@ -397,6 +397,7 @@ object SettingsManager { ensureDefaultValue(AppConfig.PREF_MUX_XUDP_CONCURRENCY, "8") ensureDefaultValue(AppConfig.PREF_FRAGMENT_LENGTH, "50-100") ensureDefaultValue(AppConfig.PREF_FRAGMENT_INTERVAL, "10-20") + ensureDefaultValue(AppConfig.PREF_TUN, AppConfig.TUN_hevsocks5) } private fun ensureDefaultValue(key: String, default: String) { diff --git a/V2rayNG/app/src/main/java/com/v2ray/ang/handler/V2RayServiceManager.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/handler/V2RayServiceManager.kt index f14c48c1..2d84b293 100644 --- a/V2rayNG/app/src/main/java/com/v2ray/ang/handler/V2RayServiceManager.kt +++ b/V2rayNG/app/src/main/java/com/v2ray/ang/handler/V2RayServiceManager.kt @@ -5,6 +5,7 @@ import android.content.BroadcastReceiver import android.content.Context import android.content.Intent import android.content.IntentFilter +import android.os.ParcelFileDescriptor import android.util.Log import androidx.core.content.ContextCompat import com.v2ray.ang.AppConfig @@ -123,7 +124,7 @@ object V2RayServiceManager { * `registerReceiver(Context, BroadcastReceiver, IntentFilter, int)`. * Starts the V2Ray core service. */ - fun startCoreLoop(): Boolean { + fun startCoreLoop(vpnInterface: ParcelFileDescriptor?): Boolean { if (coreController.isRunning) { return false } @@ -147,9 +148,13 @@ object V2RayServiceManager { } currentConfig = config + var tunFd = vpnInterface?.fd ?: 0 + if ((MmkvManager.decodeSettingsString(AppConfig.PREF_TUN) ?: AppConfig.TUN_hevsocks5) != AppConfig.TUN_xray) { + tunFd = 0 + } try { - coreController.startLoop(result.content) + coreController.startLoop(result.content, tunFd) } catch (e: Exception) { Log.e(AppConfig.TAG, "Failed to start Core loop", e) return false diff --git a/V2rayNG/app/src/main/java/com/v2ray/ang/handler/V2rayConfigManager.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/handler/V2rayConfigManager.kt index 7c7d051b..12d897e9 100644 --- a/V2rayNG/app/src/main/java/com/v2ray/ang/handler/V2rayConfigManager.kt +++ b/V2rayNG/app/src/main/java/com/v2ray/ang/handler/V2rayConfigManager.kt @@ -28,6 +28,7 @@ import com.v2ray.ang.util.Utils object V2rayConfigManager { private var initConfigCache: String? = null + private var initConfigCacheWithTun: String? = null //region get config function @@ -305,11 +306,20 @@ object V2rayConfigManager { * @return V2rayConfig object parsed from the JSON configuration, or null if the configuration is empty */ private fun initV2rayConfig(context: Context): V2rayConfig? { - val assets = initConfigCache ?: Utils.readTextFromAssets(context, "v2ray_config.json") - if (TextUtils.isEmpty(assets)) { - return null + var assets = "" + if ((MmkvManager.decodeSettingsString(AppConfig.PREF_TUN) ?: AppConfig.TUN_hevsocks5) != AppConfig.TUN_xray) { + assets = initConfigCache ?: Utils.readTextFromAssets(context, "v2ray_config.json") + if (TextUtils.isEmpty(assets)) { + return null + } + initConfigCache = assets + } else { + assets = initConfigCacheWithTun ?: Utils.readTextFromAssets(context, "v2ray_config_with_tun.json") + if (TextUtils.isEmpty(assets)) { + return null + } + initConfigCacheWithTun = assets } - initConfigCache = assets val config = JsonUtil.fromJson(assets, V2rayConfig::class.java) return config } @@ -479,16 +489,24 @@ object V2rayConfigManager { ) } - // if (MmkvManager.decodeSettingsBool(AppConfig.PREF_USE_HEV_TUNNEL, true)) { - //hev-socks5-tunnel dns routing - v2rayConfig.routing.rules.add( - 0, RulesBean( - inboundTag = arrayListOf("socks"), - outboundTag = "dns-out", - port = "53", - type = "field" + if (MmkvManager.decodeSettingsString(AppConfig.PREF_TUN, AppConfig.TUN_hevsocks5) == AppConfig.TUN_hevsocks5) { + //hev-socks5-tunnel dns routing + v2rayConfig.routing.rules.add( + 0, RulesBean( + inboundTag = arrayListOf("socks"), + outboundTag = "dns-out", + port = "53", + ) ) - ) + } else { + v2rayConfig.routing.rules.add( + 0, RulesBean( + inboundTag = arrayListOf("tun"), + outboundTag = "dns-out", + port = "53", + ) + ) + } // DNS outbound if (v2rayConfig.outbounds.none { e -> e.protocol == "dns" && e.tag == "dns-out" }) { diff --git a/V2rayNG/app/src/main/java/com/v2ray/ang/service/V2RayProxyOnlyService.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/service/V2RayProxyOnlyService.kt index 40bf9440..9b7bee9e 100644 --- a/V2rayNG/app/src/main/java/com/v2ray/ang/service/V2RayProxyOnlyService.kt +++ b/V2rayNG/app/src/main/java/com/v2ray/ang/service/V2RayProxyOnlyService.kt @@ -26,7 +26,7 @@ class V2RayProxyOnlyService : Service(), ServiceControl { * @return The start mode. */ override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int { - V2RayServiceManager.startCoreLoop() + V2RayServiceManager.startCoreLoop(null) return START_STICKY } diff --git a/V2rayNG/app/src/main/java/com/v2ray/ang/service/V2RayVpnService.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/service/V2RayVpnService.kt index 190e38ed..aa540f17 100644 --- a/V2rayNG/app/src/main/java/com/v2ray/ang/service/V2RayVpnService.kt +++ b/V2rayNG/app/src/main/java/com/v2ray/ang/service/V2RayVpnService.kt @@ -90,9 +90,8 @@ class V2RayVpnService : VpnService(), ServiceControl { } override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int { - if (V2RayServiceManager.startCoreLoop()) { - startService() - } + setupVpnService() + startService() return START_STICKY //return super.onStartCommand(intent, flags, startId) } @@ -102,7 +101,11 @@ class V2RayVpnService : VpnService(), ServiceControl { } override fun startService() { - setupService() + if (mInterface == null) { + Log.e(AppConfig.TAG, "Failed to create VPN interface") + return + } + V2RayServiceManager.startCoreLoop(mInterface) } override fun stopService() { @@ -124,7 +127,7 @@ class V2RayVpnService : VpnService(), ServiceControl { * Sets up the VPN service. * Prepares the VPN and configures it if preparation is successful. */ - private fun setupService() { + private fun setupVpnService() { val prepare = prepare(this) if (prepare != null) { return @@ -294,13 +297,16 @@ class V2RayVpnService : VpnService(), ServiceControl { * Starts the tun2socks process with the appropriate parameters. */ private fun runTun2socks() { - //if (MmkvManager.decodeSettingsBool(AppConfig.PREF_USE_HEV_TUNNEL, true)) { - tun2SocksService = TProxyService( - context = applicationContext, - vpnInterface = mInterface, - isRunningProvider = { isRunning }, - restartCallback = { runTun2socks() } - ) + if (MmkvManager.decodeSettingsString(AppConfig.PREF_TUN, AppConfig.TUN_hevsocks5) == AppConfig.TUN_hevsocks5) { + tun2SocksService = TProxyService( + context = applicationContext, + vpnInterface = mInterface, + isRunningProvider = { isRunning }, + restartCallback = { runTun2socks() } + ) + } else { + tun2SocksService = null + } tun2SocksService?.startTun2Socks() } diff --git a/V2rayNG/app/src/main/java/com/v2ray/ang/ui/SettingsActivity.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/ui/SettingsActivity.kt index 47f57884..3f2528e6 100644 --- a/V2rayNG/app/src/main/java/com/v2ray/ang/ui/SettingsActivity.kt +++ b/V2rayNG/app/src/main/java/com/v2ray/ang/ui/SettingsActivity.kt @@ -66,7 +66,7 @@ class SettingsActivity : BaseActivity() { // private val hevTunLogLevel by lazy { findPreference(AppConfig.PREF_HEV_TUNNEL_LOGLEVEL) } // private val hevTunRwTimeout by lazy { findPreference(AppConfig.PREF_HEV_TUNNEL_RW_TIMEOUT) } -// private val useHevTun by lazy { findPreference(AppConfig.PREF_USE_HEV_TUNNEL) } +// private val useTun by lazy { findPreference(AppConfig.PREF_TUN) } override fun onCreatePreferences(bundle: Bundle?, s: String?) { // Use MMKV as the storage backend for all Preferences @@ -190,8 +190,8 @@ class SettingsActivity : BaseActivity() { mode?.dialogLayoutResource = R.layout.preference_with_help_link //loglevel.summary = "LogLevel" -// useHevTun?.setOnPreferenceChangeListener { _, newValue -> -// updateHevTunSettings(newValue as Boolean) +// useTun?.setOnPreferenceChangeListener { _, newValue -> +// updateHevTunSettings(newValue as String == AppConfig.TUN_hevsocks5) // true // } @@ -274,8 +274,9 @@ class SettingsActivity : BaseActivity() { // delayTestUrl?.summary = MmkvManager.decodeSettingsString(AppConfig.PREF_DELAY_TEST_URL, AppConfig.DELAY_TEST_URL) // ipApiUrl?.summary = MmkvManager.decodeSettingsString(AppConfig.PREF_IP_API_URL, AppConfig.IP_API_URL) // hevTunRwTimeout?.summary = MmkvManager.decodeSettingsString(AppConfig.PREF_HEV_TUNNEL_RW_TIMEOUT, AppConfig.HEVTUN_RW_TIMEOUT) +// updateHevTunSettings(MmkvManager.decodeSettingsString(AppConfig.PREF_TUN, AppConfig.TUN_hevsocks5) == AppConfig.TUN_hevsocks5) - // initSharedPreference() +// initSharedPreference() } private fun initSharedPreference() { diff --git a/V2rayNG/app/src/main/java/com/v2ray/ang/viewmodel/SettingsViewModel.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/viewmodel/SettingsViewModel.kt index c3c8dfa4..78a09b0b 100644 --- a/V2rayNG/app/src/main/java/com/v2ray/ang/viewmodel/SettingsViewModel.kt +++ b/V2rayNG/app/src/main/java/com/v2ray/ang/viewmodel/SettingsViewModel.kt @@ -62,7 +62,8 @@ class SettingsViewModel(application: Application) : AndroidViewModel(application AppConfig.PREF_FRAGMENT_INTERVAL, AppConfig.PREF_MUX_XUDP_QUIC, AppConfig.PREF_HEV_TUNNEL_LOGLEVEL, - AppConfig.PREF_HEV_TUNNEL_RW_TIMEOUT + AppConfig.PREF_HEV_TUNNEL_RW_TIMEOUT, + AppConfig.PREF_TUN, -> { MmkvManager.encodeSettings(key, sharedPreferences.getString(key, "")) } @@ -83,18 +84,19 @@ class SettingsViewModel(application: Application) : AndroidViewModel(application AppConfig.PREF_DOUBLE_COLUMN_DISPLAY, AppConfig.SUBSCRIPTION_AUTO_UPDATE, AppConfig.PREF_FRAGMENT_ENABLED, - AppConfig.PREF_MUX_ENABLED + AppConfig.PREF_MUX_ENABLED, -> { MmkvManager.encodeSettings(key, sharedPreferences.getBoolean(key, false)) } AppConfig.PREF_SNIFFING_ENABLED, - AppConfig.PREF_USE_HEV_TUNNEL -> { + -> { MmkvManager.encodeSettings(key, sharedPreferences.getBoolean(key, true)) } AppConfig.PREF_MUX_CONCURRENCY, - AppConfig.PREF_MUX_XUDP_CONCURRENCY -> { + AppConfig.PREF_MUX_XUDP_CONCURRENCY, + -> { MmkvManager.encodeSettings(key, sharedPreferences.getString(key, "8")) } } diff --git a/V2rayNG/app/src/main/res/values-ar/strings.xml b/V2rayNG/app/src/main/res/values-ar/strings.xml index 5fda5439..8f9d9820 100644 --- a/V2rayNG/app/src/main/res/values-ar/strings.xml +++ b/V2rayNG/app/src/main/res/values-ar/strings.xml @@ -257,8 +257,7 @@ اللغة إعدادات واجهة المستخدم إعدادات وضع واجهة المستخدم ليلاً - Enable New TUN Feature - When enabled, TUN will use hev-socks5-tunnel; otherwise, it will use badvpn-tun2socks. + TUN Interface Hev Tun Log Level Hev Tun read/write timeout (seconds) (tcp,udp default 300,60) diff --git a/V2rayNG/app/src/main/res/values-bn/strings.xml b/V2rayNG/app/src/main/res/values-bn/strings.xml index cf60e3e1..f488852c 100644 --- a/V2rayNG/app/src/main/res/values-bn/strings.xml +++ b/V2rayNG/app/src/main/res/values-bn/strings.xml @@ -257,8 +257,7 @@ ভাষা ইউআই সেটিংস ইউআই মোড সেটিংস - Enable New TUN Feature - When enabled, TUN will use hev-socks5-tunnel; otherwise, it will use badvpn-tun2socks. + TUN Interface Hev Tun Log Level Hev Tun read/write timeout (seconds) (tcp,udp default 300,60) diff --git a/V2rayNG/app/src/main/res/values-bqi-rIR/strings.xml b/V2rayNG/app/src/main/res/values-bqi-rIR/strings.xml index 2db15d4b..7e7f3285 100644 --- a/V2rayNG/app/src/main/res/values-bqi-rIR/strings.xml +++ b/V2rayNG/app/src/main/res/values-bqi-rIR/strings.xml @@ -257,8 +257,7 @@ زووݩ سامووا رابت منتوری سامووا هالت رابت منتوری - فعال کردن ویژیی نۊ TUN - ٱر ک فعال بۊ، TUN ایا hev-socks5-tunnel ن و کار اگره؛ ٱندی ز badvpn-tun2socks. + TUN Interface Hev Tun سئت گوزارشا زمووݩ مندیر بیڌن خوندن/هؽل کردن Hev Tun (سانیه) (پؽش فرز tcp,udp 300،60) diff --git a/V2rayNG/app/src/main/res/values-fa/strings.xml b/V2rayNG/app/src/main/res/values-fa/strings.xml index b8c1df09..74c76334 100644 --- a/V2rayNG/app/src/main/res/values-fa/strings.xml +++ b/V2rayNG/app/src/main/res/values-fa/strings.xml @@ -254,8 +254,7 @@ زبان تنظیمات رابط کاربری تنظیمات حالت رابط کاربری - فعالسازی قابلیت TUN جدید - در صورت فعال بودن، TUN از hev-socks5-tunnel استفاده می‌کند؛ در غیر این صورت از badvpn-tun2socks. + TUN واسط سطح گزارشات Hev Tun زمان انتظار خواندن/نوشتن Hev Tun (ثانیه) (پیش‌فرض tcp,udp 300،60) diff --git a/V2rayNG/app/src/main/res/values-ru/strings.xml b/V2rayNG/app/src/main/res/values-ru/strings.xml index 8c99670a..5efba6f9 100644 --- a/V2rayNG/app/src/main/res/values-ru/strings.xml +++ b/V2rayNG/app/src/main/res/values-ru/strings.xml @@ -256,8 +256,7 @@ Язык Настройки интерфейса Тема интерфейса - Использовать новую версию TUN - Если включено, TUN будет использовать hev-socks5-tunnel, иначе будет использоваться badvpn-tun2socks + TUN интерфейса Подробность журнала HevTun Ожидание чтения/записи HevTun (секунд, по умолчанию TCP,UDP 300,60) diff --git a/V2rayNG/app/src/main/res/values-vi/strings.xml b/V2rayNG/app/src/main/res/values-vi/strings.xml index 3fb2022d..765f8de8 100644 --- a/V2rayNG/app/src/main/res/values-vi/strings.xml +++ b/V2rayNG/app/src/main/res/values-vi/strings.xml @@ -257,8 +257,7 @@ Ngôn ngữ Cài đặt UI Cài đặt chế độ UI - Enable New TUN Feature - When enabled, TUN will use hev-socks5-tunnel; otherwise, it will use badvpn-tun2socks. + TUN Interface Hev Tun Log Level Hev Tun read/write timeout (seconds) (tcp,udp default 300,60) diff --git a/V2rayNG/app/src/main/res/values-zh-rCN/strings.xml b/V2rayNG/app/src/main/res/values-zh-rCN/strings.xml index e8ef3a43..7b64bc54 100644 --- a/V2rayNG/app/src/main/res/values-zh-rCN/strings.xml +++ b/V2rayNG/app/src/main/res/values-zh-rCN/strings.xml @@ -254,8 +254,7 @@ 语言 用户界面设置 界面颜色设置 - 启用新的 TUN 功能 - 选择启用后 TUN 将使用 hev-socks5-tunnel 否则使用 badvpn-tun2socks + TUN 接口 HevTun 日志级别 HevTun 读写超时(秒) (tcp,udp 默认 300,60) diff --git a/V2rayNG/app/src/main/res/values-zh-rTW/strings.xml b/V2rayNG/app/src/main/res/values-zh-rTW/strings.xml index 259afd64..a0ab6f5d 100644 --- a/V2rayNG/app/src/main/res/values-zh-rTW/strings.xml +++ b/V2rayNG/app/src/main/res/values-zh-rTW/strings.xml @@ -255,8 +255,7 @@ 語言 介面顏色設定 介面顯示模式 - 啟用新 TUN 功能 - 選擇啟用後,TUN 將使用 hev-socks5-tunnel,否則使用 badvpn-tun2socks。 + TUN 介面 HevTun 日誌級別 HevTun 讀寫逾時(秒) (tcp,udp 預設 300,60) diff --git a/V2rayNG/app/src/main/res/values/arrays.xml b/V2rayNG/app/src/main/res/values/arrays.xml index e4ceda63..2ff0aa5c 100644 --- a/V2rayNG/app/src/main/res/values/arrays.xml +++ b/V2rayNG/app/src/main/res/values/arrays.xml @@ -118,6 +118,11 @@ Proxy only + + hev-socks5-tunnel + xray-core + + error warn diff --git a/V2rayNG/app/src/main/res/values/strings.xml b/V2rayNG/app/src/main/res/values/strings.xml index 1a40b120..5b07eaa2 100644 --- a/V2rayNG/app/src/main/res/values/strings.xml +++ b/V2rayNG/app/src/main/res/values/strings.xml @@ -260,8 +260,7 @@ Language UI settings UI mode settings - Enable New TUN Feature - When enabled, TUN will use hev-socks5-tunnel; otherwise, it will use badvpn-tun2socks. + TUN Interface Hev Tun Log Level Hev Tun read/write timeout (seconds) (tcp,udp default 300,60) diff --git a/V2rayNG/app/src/main/res/xml/pref_settings.xml b/V2rayNG/app/src/main/res/xml/pref_settings.xml index a74108f2..7ecdfa5f 100644 --- a/V2rayNG/app/src/main/res/xml/pref_settings.xml +++ b/V2rayNG/app/src/main/res/xml/pref_settings.xml @@ -100,11 +100,13 @@ android:summary="1500" android:title="@string/title_pref_vpn_mtu" /> - - - - - +