From 2fd57baa373c5efb3d701f64e9700df23aeeb561 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Mon, 12 Jan 2026 16:14:33 +0800 Subject: [PATCH] Refactor TUN selection to use HEV toggle and cleanup Replaces the TUN interface selection ListPreference with a CheckBoxPreference for enabling HEV TUN, updates related logic and string resources, removes SettingsViewModel, and simplifies inbound configuration. This refactor improves user experience and code maintainability by consolidating TUN selection and removing legacy code. --- V2rayNG/app/src/main/assets/v2ray_config.json | 8 -- .../main/assets/v2ray_config_with_tun.json | 20 +--- .../src/main/java/com/v2ray/ang/AppConfig.kt | 4 +- .../java/com/v2ray/ang/dto/V2rayConfig.kt | 14 +-- .../com/v2ray/ang/handler/SettingsManager.kt | 9 +- .../v2ray/ang/handler/V2RayServiceManager.kt | 2 +- .../v2ray/ang/handler/V2rayConfigManager.kt | 37 +++--- .../com/v2ray/ang/service/V2RayVpnService.kt | 2 +- .../v2ray/ang/viewmodel/SettingsViewModel.kt | 108 ------------------ .../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, 67 insertions(+), 181 deletions(-) delete mode 100644 V2rayNG/app/src/main/java/com/v2ray/ang/viewmodel/SettingsViewModel.kt diff --git a/V2rayNG/app/src/main/assets/v2ray_config.json b/V2rayNG/app/src/main/assets/v2ray_config.json index 4f8c3d7e..4f2d637b 100644 --- a/V2rayNG/app/src/main/assets/v2ray_config.json +++ b/V2rayNG/app/src/main/assets/v2ray_config.json @@ -33,14 +33,6 @@ "tls" ] } - }, - { - "tag": "http", - "port": 10809, - "protocol": "http", - "settings": { - "userLevel": 8 - } } ], "outbounds": [{ diff --git a/V2rayNG/app/src/main/assets/v2ray_config_with_tun.json b/V2rayNG/app/src/main/assets/v2ray_config_with_tun.json index c3ad3e3d..837bff85 100644 --- a/V2rayNG/app/src/main/assets/v2ray_config_with_tun.json +++ b/V2rayNG/app/src/main/assets/v2ray_config_with_tun.json @@ -35,23 +35,15 @@ } }, { - "tag": "http", - "port": 10809, - "protocol": "http", + "tag": "tun", + "port": 0, + "protocol": "tun", "settings": { + "name": "xray0", + "MTU": 1500, "userLevel": 8 } - }, - { - "tag": "tun", - "port": 0, - "protocol": "tun", - "settings": { - "name": "xray0", - "MTU": 1500, - "userLevel": 8 - } - } + } ], "outbounds": [{ "tag": "proxy", 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 cd2b3f3d..92072e16 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_TUN = "pref_tun" + const val PREF_USE_HEV_TUNNEL = "pref_use_hev_tunnel_v2" 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,8 +175,6 @@ 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/dto/V2rayConfig.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/dto/V2rayConfig.kt index 1a598d31..c1659a9c 100644 --- a/V2rayNG/app/src/main/java/com/v2ray/ang/dto/V2rayConfig.kt +++ b/V2rayNG/app/src/main/java/com/v2ray/ang/dto/V2rayConfig.kt @@ -34,19 +34,19 @@ data class V2rayConfig( var port: Int, var protocol: String, var listen: String? = null, - val settings: Any? = null, + var settings: InSettingsBean? = null, val sniffing: SniffingBean? = null, val streamSettings: Any? = null, val allocate: Any? = null ) { data class InSettingsBean( - val auth: String? = null, - val udp: Boolean? = null, - val userLevel: Int? = null, - val address: String? = null, - val port: Int? = null, - val network: String? = null + var auth: String? = null, + var udp: Boolean? = null, + var userLevel: Int? = null, + var name: String? = null, + @SerializedName("MTU") + var mtu: Int? = null ) data class SniffingBean( 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 7c2cf359..bc5e9ca9 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 @@ -378,6 +378,14 @@ object SettingsManager { return Utils.parseInt(MmkvManager.decodeSettingsString(AppConfig.PREF_VPN_MTU), AppConfig.VPN_MTU) } + /** + * Check if HEV TUN is being used. + * @return True if HEV TUN is used, false otherwise. + */ + fun isUsingHevTun(): Boolean { + return MmkvManager.decodeSettingsBool(AppConfig.PREF_USE_HEV_TUNNEL, true) + } + /** * Ensure default settings are present in MMKV. */ @@ -397,7 +405,6 @@ 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 2d84b293..43e90d4f 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 @@ -149,7 +149,7 @@ object V2RayServiceManager { currentConfig = config var tunFd = vpnInterface?.fd ?: 0 - if ((MmkvManager.decodeSettingsString(AppConfig.PREF_TUN) ?: AppConfig.TUN_hevsocks5) != AppConfig.TUN_xray) { + if (SettingsManager.isUsingHevTun()) { tunFd = 0 } 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 12d897e9..5597089b 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 @@ -307,7 +307,7 @@ object V2rayConfigManager { */ private fun initV2rayConfig(context: Context): V2rayConfig? { var assets = "" - if ((MmkvManager.decodeSettingsString(AppConfig.PREF_TUN) ?: AppConfig.TUN_hevsocks5) != AppConfig.TUN_xray) { + if (SettingsManager.isUsingHevTun()) { assets = initConfigCache ?: Utils.readTextFromAssets(context, "v2ray_config.json") if (TextUtils.isEmpty(assets)) { return null @@ -341,34 +341,37 @@ object V2rayConfigManager { private fun getInbounds(v2rayConfig: V2rayConfig): Boolean { try { val socksPort = SettingsManager.getSocksPort() + val inbound1 = v2rayConfig.inbounds[0] - v2rayConfig.inbounds.forEach { curInbound -> - if (MmkvManager.decodeSettingsBool(AppConfig.PREF_PROXY_SHARING) != true) { - //bind all inbounds to localhost if the user requests - curInbound.listen = AppConfig.LOOPBACK - } + if (MmkvManager.decodeSettingsBool(AppConfig.PREF_PROXY_SHARING) != true) { + inbound1.listen = AppConfig.LOOPBACK } - v2rayConfig.inbounds[0].port = socksPort + inbound1.port = socksPort val fakedns = MmkvManager.decodeSettingsBool(AppConfig.PREF_FAKE_DNS_ENABLED) == true val sniffAllTlsAndHttp = MmkvManager.decodeSettingsBool(AppConfig.PREF_SNIFFING_ENABLED, true) != false - v2rayConfig.inbounds[0].sniffing?.enabled = fakedns || sniffAllTlsAndHttp - v2rayConfig.inbounds[0].sniffing?.routeOnly = + inbound1.sniffing?.enabled = fakedns || sniffAllTlsAndHttp + inbound1.sniffing?.routeOnly = MmkvManager.decodeSettingsBool(AppConfig.PREF_ROUTE_ONLY_ENABLED, false) if (!sniffAllTlsAndHttp) { - v2rayConfig.inbounds[0].sniffing?.destOverride?.clear() + inbound1.sniffing?.destOverride?.clear() } if (fakedns) { - v2rayConfig.inbounds[0].sniffing?.destOverride?.add("fakedns") + inbound1.sniffing?.destOverride?.add("fakedns") } - if (Utils.isXray()) { - v2rayConfig.inbounds.removeAt(1) - } else { - val httpPort = SettingsManager.getHttpPort() - v2rayConfig.inbounds[1].port = httpPort + if (!Utils.isXray()) { + val inbound2 = JsonUtil.fromJson(JsonUtil.toJson(inbound1), V2rayConfig.InboundBean::class.java) ?: return false + inbound2.tag = EConfigType.HTTP.name.lowercase() + inbound2.port = SettingsManager.getHttpPort() + inbound2.protocol = EConfigType.HTTP.name.lowercase() + v2rayConfig.inbounds.add(inbound2) } + if (!SettingsManager.isUsingHevTun()) { + val inboundTun = v2rayConfig.inbounds.firstOrNull { e -> e.tag == "tun" } + inboundTun?.settings?.mtu = SettingsManager.getVpnMtu() + } } catch (e: Exception) { Log.e(AppConfig.TAG, "Failed to configure inbounds", e) return false @@ -489,7 +492,7 @@ object V2rayConfigManager { ) } - if (MmkvManager.decodeSettingsString(AppConfig.PREF_TUN, AppConfig.TUN_hevsocks5) == AppConfig.TUN_hevsocks5) { + if (SettingsManager.isUsingHevTun()) { //hev-socks5-tunnel dns routing v2rayConfig.routing.rules.add( 0, RulesBean( 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 aa540f17..0a3f509a 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 @@ -297,7 +297,7 @@ class V2RayVpnService : VpnService(), ServiceControl { * Starts the tun2socks process with the appropriate parameters. */ private fun runTun2socks() { - if (MmkvManager.decodeSettingsString(AppConfig.PREF_TUN, AppConfig.TUN_hevsocks5) == AppConfig.TUN_hevsocks5) { + if (SettingsManager.isUsingHevTun()) { tun2SocksService = TProxyService( context = applicationContext, vpnInterface = mInterface, 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 deleted file mode 100644 index 78a09b0b..00000000 --- a/V2rayNG/app/src/main/java/com/v2ray/ang/viewmodel/SettingsViewModel.kt +++ /dev/null @@ -1,108 +0,0 @@ -package com.v2ray.ang.viewmodel - -import android.app.Application -import android.content.SharedPreferences -import android.util.Log -import androidx.lifecycle.AndroidViewModel -import androidx.preference.PreferenceManager -import com.v2ray.ang.AppConfig -import com.v2ray.ang.handler.MmkvManager -import com.v2ray.ang.handler.SettingsChangeManager -import com.v2ray.ang.handler.SettingsManager - -class SettingsViewModel(application: Application) : AndroidViewModel(application), - SharedPreferences.OnSharedPreferenceChangeListener { - - /** - * Starts listening for preference changes. - */ - fun startListenPreferenceChange() { - PreferenceManager.getDefaultSharedPreferences(getApplication()) - .registerOnSharedPreferenceChangeListener(this) - } - - /** - * Called when the ViewModel is cleared. - */ - override fun onCleared() { - PreferenceManager.getDefaultSharedPreferences(getApplication()) - .unregisterOnSharedPreferenceChangeListener(this) - Log.i(AppConfig.TAG, "Settings ViewModel is cleared") - super.onCleared() - } - - /** - * Called when a shared preference is changed. - * @param sharedPreferences The shared preferences. - * @param key The key of the changed preference. - */ - override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences, key: String?) { - Log.i(AppConfig.TAG, "Observe settings changed: $key") - when (key) { - AppConfig.PREF_MODE, - AppConfig.PREF_VPN_DNS, - AppConfig.PREF_VPN_BYPASS_LAN, - AppConfig.PREF_VPN_INTERFACE_ADDRESS_CONFIG_INDEX, - AppConfig.PREF_VPN_MTU, - AppConfig.PREF_REMOTE_DNS, - AppConfig.PREF_DOMESTIC_DNS, - AppConfig.PREF_DNS_HOSTS, - AppConfig.PREF_DELAY_TEST_URL, - AppConfig.PREF_IP_API_URL, - AppConfig.PREF_LOCAL_DNS_PORT, - AppConfig.PREF_SOCKS_PORT, - AppConfig.PREF_LOGLEVEL, - AppConfig.PREF_OUTBOUND_DOMAIN_RESOLVE_METHOD, - AppConfig.PREF_LANGUAGE, - AppConfig.PREF_UI_MODE_NIGHT, - AppConfig.PREF_ROUTING_DOMAIN_STRATEGY, - AppConfig.SUBSCRIPTION_AUTO_UPDATE_INTERVAL, - AppConfig.PREF_FRAGMENT_PACKETS, - AppConfig.PREF_FRAGMENT_LENGTH, - AppConfig.PREF_FRAGMENT_INTERVAL, - AppConfig.PREF_MUX_XUDP_QUIC, - AppConfig.PREF_HEV_TUNNEL_LOGLEVEL, - AppConfig.PREF_HEV_TUNNEL_RW_TIMEOUT, - AppConfig.PREF_TUN, - -> { - MmkvManager.encodeSettings(key, sharedPreferences.getString(key, "")) - } - - AppConfig.PREF_ROUTE_ONLY_ENABLED, - AppConfig.PREF_IS_BOOTED, - AppConfig.PREF_SPEED_ENABLED, - AppConfig.PREF_PROXY_SHARING, - AppConfig.PREF_LOCAL_DNS_ENABLED, - AppConfig.PREF_FAKE_DNS_ENABLED, - AppConfig.PREF_APPEND_HTTP_PROXY, - AppConfig.PREF_ALLOW_INSECURE, - AppConfig.PREF_PREFER_IPV6, -// AppConfig.PREF_PER_APP_PROXY, - AppConfig.PREF_BYPASS_APPS, - AppConfig.PREF_CONFIRM_REMOVE, - AppConfig.PREF_START_SCAN_IMMEDIATE, - AppConfig.PREF_DOUBLE_COLUMN_DISPLAY, - AppConfig.SUBSCRIPTION_AUTO_UPDATE, - AppConfig.PREF_FRAGMENT_ENABLED, - AppConfig.PREF_MUX_ENABLED, - -> { - MmkvManager.encodeSettings(key, sharedPreferences.getBoolean(key, false)) - } - - AppConfig.PREF_SNIFFING_ENABLED, - -> { - MmkvManager.encodeSettings(key, sharedPreferences.getBoolean(key, true)) - } - - AppConfig.PREF_MUX_CONCURRENCY, - AppConfig.PREF_MUX_XUDP_CONCURRENCY, - -> { - MmkvManager.encodeSettings(key, sharedPreferences.getString(key, "8")) - } - } - if (key == AppConfig.PREF_UI_MODE_NIGHT) { - SettingsManager.setNightMode() - } - SettingsChangeManager.makeRestartService() - } -} diff --git a/V2rayNG/app/src/main/res/values-ar/strings.xml b/V2rayNG/app/src/main/res/values-ar/strings.xml index 8f9d9820..596c83c5 100644 --- a/V2rayNG/app/src/main/res/values-ar/strings.xml +++ b/V2rayNG/app/src/main/res/values-ar/strings.xml @@ -257,7 +257,8 @@ اللغة إعدادات واجهة المستخدم إعدادات وضع واجهة المستخدم ليلاً - TUN Interface + Enable Hev TUN Feature + When enabled, TUN will use hev-socks5-tunnel; otherwise, it will use xray-core. 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 f488852c..67a30909 100644 --- a/V2rayNG/app/src/main/res/values-bn/strings.xml +++ b/V2rayNG/app/src/main/res/values-bn/strings.xml @@ -257,7 +257,8 @@ ভাষা ইউআই সেটিংস ইউআই মোড সেটিংস - TUN Interface + Enable Hev TUN Feature + When enabled, TUN will use hev-socks5-tunnel; otherwise, it will use xray-core. 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 7e7f3285..0261d677 100644 --- a/V2rayNG/app/src/main/res/values-bqi-rIR/strings.xml +++ b/V2rayNG/app/src/main/res/values-bqi-rIR/strings.xml @@ -257,7 +257,8 @@ زووݩ سامووا رابت منتوری سامووا هالت رابت منتوری - TUN Interface + Enable Hev TUN Feature + When enabled, TUN will use hev-socks5-tunnel; otherwise, it will use xray-core. 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 74c76334..87e499e3 100644 --- a/V2rayNG/app/src/main/res/values-fa/strings.xml +++ b/V2rayNG/app/src/main/res/values-fa/strings.xml @@ -254,7 +254,8 @@ زبان تنظیمات رابط کاربری تنظیمات حالت رابط کاربری - TUN واسط + Enable Hev TUN Feature + When enabled, TUN will use hev-socks5-tunnel; otherwise, it will use xray-core. سطح گزارشات 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 5efba6f9..027907b1 100644 --- a/V2rayNG/app/src/main/res/values-ru/strings.xml +++ b/V2rayNG/app/src/main/res/values-ru/strings.xml @@ -256,7 +256,8 @@ Язык Настройки интерфейса Тема интерфейса - TUN интерфейса + Enable Hev TUN Feature + When enabled, TUN will use hev-socks5-tunnel; otherwise, it will use xray-core. Подробность журнала 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 765f8de8..202de764 100644 --- a/V2rayNG/app/src/main/res/values-vi/strings.xml +++ b/V2rayNG/app/src/main/res/values-vi/strings.xml @@ -257,7 +257,8 @@ Ngôn ngữ Cài đặt UI Cài đặt chế độ UI - TUN Interface + Enable Hev TUN Feature + When enabled, TUN will use hev-socks5-tunnel; otherwise, it will use xray-core. 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 7b64bc54..0bf82ed3 100644 --- a/V2rayNG/app/src/main/res/values-zh-rCN/strings.xml +++ b/V2rayNG/app/src/main/res/values-zh-rCN/strings.xml @@ -254,7 +254,8 @@ 语言 用户界面设置 界面颜色设置 - TUN 接口 + 启用 Hev TUN 功能 + 选择启用后 TUN 将使用 hev-socks5-tunnel 否则使用 xray-core 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 a0ab6f5d..efa7effb 100644 --- a/V2rayNG/app/src/main/res/values-zh-rTW/strings.xml +++ b/V2rayNG/app/src/main/res/values-zh-rTW/strings.xml @@ -255,7 +255,8 @@ 語言 介面顏色設定 介面顯示模式 - TUN 介面 + 啟用 Hev TUN 功能 + 選擇啟用後 TUN 將使用 hev-socks5-tunnel 否則使用 xray-core 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 2ff0aa5c..e4ceda63 100644 --- a/V2rayNG/app/src/main/res/values/arrays.xml +++ b/V2rayNG/app/src/main/res/values/arrays.xml @@ -118,11 +118,6 @@ 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 5b07eaa2..a3b906cb 100644 --- a/V2rayNG/app/src/main/res/values/strings.xml +++ b/V2rayNG/app/src/main/res/values/strings.xml @@ -260,7 +260,8 @@ Language UI settings UI mode settings - TUN Interface + Enable Hev TUN Feature + When enabled, TUN will use hev-socks5-tunnel; otherwise, it will use xray-core. 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 7ecdfa5f..a79a29f1 100644 --- a/V2rayNG/app/src/main/res/xml/pref_settings.xml +++ b/V2rayNG/app/src/main/res/xml/pref_settings.xml @@ -100,13 +100,11 @@ android:summary="1500" android:title="@string/title_pref_vpn_mtu" /> - +