From 69e000b23dabab9ce9153dfa193659ed46d85565 Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Mon, 26 Jan 2026 20:11:30 +0800 Subject: [PATCH] Add Random and Round Robin policy group types --- .../src/main/java/com/v2ray/ang/AppConfig.kt | 1 + .../v2ray/ang/handler/V2rayConfigManager.kt | 98 ++++++++++++------- .../app/src/main/res/values-ar/strings.xml | 2 + .../app/src/main/res/values-bn/strings.xml | 2 + .../src/main/res/values-bqi-rIR/strings.xml | 2 + .../app/src/main/res/values-fa/strings.xml | 2 + .../app/src/main/res/values-ru/strings.xml | 2 + .../app/src/main/res/values-vi/strings.xml | 2 + .../src/main/res/values-zh-rCN/strings.xml | 2 + .../src/main/res/values-zh-rTW/strings.xml | 2 + V2rayNG/app/src/main/res/values/strings.xml | 2 + 11 files changed, 82 insertions(+), 35 deletions(-) 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 d72bf027..598c3b85 100644 --- a/V2rayNG/app/src/main/java/com/v2ray/ang/AppConfig.kt +++ b/V2rayNG/app/src/main/java/com/v2ray/ang/AppConfig.kt @@ -97,6 +97,7 @@ object AppConfig { const val TAG_FRAGMENT = "fragment" const val TAG_DNS = "dns-module" const val TAG_DOMESTIC_DNS = "domestic-dns" + const val TAG_BALANCER = "proxy-round" /** Network-related constants. */ const val UPLINK = "uplink" 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 12eab95f..e97b6c56 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 @@ -840,65 +840,93 @@ object V2rayConfigManager { * Configures load balancing settings for the V2ray configuration. * * @param v2rayConfig The V2ray configuration object to be modified with balancing settings + * @param config The profile item containing policy group settings */ private fun getBalance(v2rayConfig: V2rayConfig, config: ProfileItem) { try { v2rayConfig.routing.rules.forEach { rule -> if (rule.outboundTag == "proxy") { rule.outboundTag = null - rule.balancerTag = "proxy-round" + rule.balancerTag = AppConfig.TAG_BALANCER } } - if (config.policyGroupType == "0") { - val balancer = V2rayConfig.RoutingBean.BalancerBean( - tag = "proxy-round", - selector = listOf("proxy-"), - strategy = V2rayConfig.RoutingBean.StrategyObject( - type = "leastPing" + val lstSelector = listOf("proxy-") + when (config.policyGroupType) { + // Least Ping goto else + "1" -> { + // Least Load + val balancer = V2rayConfig.RoutingBean.BalancerBean( + tag = AppConfig.TAG_BALANCER, + selector = lstSelector, + strategy = V2rayConfig.RoutingBean.StrategyObject( + type = "leastLoad" + ) ) - ) - v2rayConfig.routing.balancers = listOf(balancer) - v2rayConfig.observatory = V2rayConfig.ObservatoryObject( - subjectSelector = listOf("proxy-"), - probeUrl = MmkvManager.decodeSettingsString(AppConfig.PREF_DELAY_TEST_URL) ?: AppConfig.DELAY_TEST_URL, - probeInterval = "3m", - enableConcurrency = true - ) - } else { - val balancer = V2rayConfig.RoutingBean.BalancerBean( - tag = "proxy-round", - selector = listOf("proxy-"), - strategy = V2rayConfig.RoutingBean.StrategyObject( - type = "leastLoad" + v2rayConfig.routing.balancers = listOf(balancer) + v2rayConfig.burstObservatory = V2rayConfig.BurstObservatoryObject( + subjectSelector = lstSelector, + pingConfig = V2rayConfig.BurstObservatoryObject.PingConfigObject( + destination = MmkvManager.decodeSettingsString(AppConfig.PREF_DELAY_TEST_URL) ?: AppConfig.DELAY_TEST_URL, + interval = "5m", + sampling = 2, + timeout = "30s" + ) ) - ) - v2rayConfig.routing.balancers = listOf(balancer) - v2rayConfig.burstObservatory = V2rayConfig.BurstObservatoryObject( - subjectSelector = listOf("proxy-"), - pingConfig = V2rayConfig.BurstObservatoryObject.PingConfigObject( - destination = MmkvManager.decodeSettingsString(AppConfig.PREF_DELAY_TEST_URL) ?: AppConfig.DELAY_TEST_URL, - interval = "5m", - sampling = 2, - timeout = "30s" + } + "2" -> { + // Random + val balancer = V2rayConfig.RoutingBean.BalancerBean( + tag = AppConfig.TAG_BALANCER, + selector = lstSelector, + strategy = V2rayConfig.RoutingBean.StrategyObject( + type = "random" + ) ) - ) + v2rayConfig.routing.balancers = listOf(balancer) + } + "3" -> { + // Round Robin + val balancer = V2rayConfig.RoutingBean.BalancerBean( + tag = AppConfig.TAG_BALANCER, + selector = lstSelector, + strategy = V2rayConfig.RoutingBean.StrategyObject( + type = "roundRobin" + ) + ) + v2rayConfig.routing.balancers = listOf(balancer) + } + else -> { + // Default: Least Ping + val balancer = V2rayConfig.RoutingBean.BalancerBean( + tag = AppConfig.TAG_BALANCER, + selector = lstSelector, + strategy = V2rayConfig.RoutingBean.StrategyObject( + type = "leastPing" + ) + ) + v2rayConfig.routing.balancers = listOf(balancer) + v2rayConfig.observatory = V2rayConfig.ObservatoryObject( + subjectSelector = lstSelector, + probeUrl = MmkvManager.decodeSettingsString(AppConfig.PREF_DELAY_TEST_URL) ?: AppConfig.DELAY_TEST_URL, + probeInterval = "3m", + enableConcurrency = true + ) + } } if (v2rayConfig.routing.domainStrategy == "IPIfNonMatch") { v2rayConfig.routing.rules.add( RulesBean( ip = arrayListOf("0.0.0.0/0", "::/0"), - balancerTag = "proxy-round", - type = "field" + balancerTag = AppConfig.TAG_BALANCER, ) ) } else { v2rayConfig.routing.rules.add( RulesBean( network = "tcp,udp", - balancerTag = "proxy-round", - type = "field" + balancerTag = AppConfig.TAG_BALANCER, ) ) } diff --git a/V2rayNG/app/src/main/res/values-ar/strings.xml b/V2rayNG/app/src/main/res/values-ar/strings.xml index 8f5eb205..19886afe 100644 --- a/V2rayNG/app/src/main/res/values-ar/strings.xml +++ b/V2rayNG/app/src/main/res/values-ar/strings.xml @@ -399,6 +399,8 @@ Least Ping Least Load + Random + Round Robin diff --git a/V2rayNG/app/src/main/res/values-bn/strings.xml b/V2rayNG/app/src/main/res/values-bn/strings.xml index 84c70d48..c1a4e5bd 100644 --- a/V2rayNG/app/src/main/res/values-bn/strings.xml +++ b/V2rayNG/app/src/main/res/values-bn/strings.xml @@ -405,6 +405,8 @@ Least Ping Least Load + Random + Round Robin 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 e4339af0..125ed7e1 100644 --- a/V2rayNG/app/src/main/res/values-bqi-rIR/strings.xml +++ b/V2rayNG/app/src/main/res/values-bqi-rIR/strings.xml @@ -415,6 +415,8 @@ کم ترین پینگ کم ترین بار(لود) + تصادفی + گردشی diff --git a/V2rayNG/app/src/main/res/values-fa/strings.xml b/V2rayNG/app/src/main/res/values-fa/strings.xml index 7fa6f4f7..78907e13 100644 --- a/V2rayNG/app/src/main/res/values-fa/strings.xml +++ b/V2rayNG/app/src/main/res/values-fa/strings.xml @@ -414,6 +414,8 @@ کمترین پینگ کمترین بار(لود) + تصادفی + گردشی diff --git a/V2rayNG/app/src/main/res/values-ru/strings.xml b/V2rayNG/app/src/main/res/values-ru/strings.xml index 2b43dce1..0c71cccc 100644 --- a/V2rayNG/app/src/main/res/values-ru/strings.xml +++ b/V2rayNG/app/src/main/res/values-ru/strings.xml @@ -414,6 +414,8 @@ Наименьшая задержка Наименьшая нагрузка + Случайный + По очереди diff --git a/V2rayNG/app/src/main/res/values-vi/strings.xml b/V2rayNG/app/src/main/res/values-vi/strings.xml index e9447676..23288c23 100644 --- a/V2rayNG/app/src/main/res/values-vi/strings.xml +++ b/V2rayNG/app/src/main/res/values-vi/strings.xml @@ -401,6 +401,8 @@ Least Ping Least Load + Random + Round Robin 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 f10f9db1..c9e2dbc5 100644 --- a/V2rayNG/app/src/main/res/values-zh-rCN/strings.xml +++ b/V2rayNG/app/src/main/res/values-zh-rCN/strings.xml @@ -406,6 +406,8 @@ 最低延迟 最稳定 + 随机选择 + 轮询 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 21793d10..09e67bef 100644 --- a/V2rayNG/app/src/main/res/values-zh-rTW/strings.xml +++ b/V2rayNG/app/src/main/res/values-zh-rTW/strings.xml @@ -406,6 +406,8 @@ 最低延遲 最少卡頓 + 隨機選擇 + 輪詢 diff --git a/V2rayNG/app/src/main/res/values/strings.xml b/V2rayNG/app/src/main/res/values/strings.xml index 4537d8d1..7e380bcd 100644 --- a/V2rayNG/app/src/main/res/values/strings.xml +++ b/V2rayNG/app/src/main/res/values/strings.xml @@ -419,6 +419,8 @@ Least Ping Least Load + Random + Round Robin