Add Random and Round Robin policy group types

This commit is contained in:
2dust committed 2026-01-26 20:11:30 +08:00
1 parent a8e09611eb
commit 69e000b23d
11 files changed
+82 -35

No files matched your search

@@ -97,6 +97,7 @@ object AppConfig {
const val TAG_FRAGMENT = "fragment" const val TAG_FRAGMENT = "fragment"
const val TAG_DNS = "dns-module" const val TAG_DNS = "dns-module"
const val TAG_DOMESTIC_DNS = "domestic-dns" const val TAG_DOMESTIC_DNS = "domestic-dns"
const val TAG_BALANCER = "proxy-round"
/** Network-related constants. */ /** Network-related constants. */
const val UPLINK = "uplink" const val UPLINK = "uplink"
@@ -840,65 +840,93 @@ object V2rayConfigManager {
* Configures load balancing settings for the V2ray configuration. * Configures load balancing settings for the V2ray configuration.
* *
* @param v2rayConfig The V2ray configuration object to be modified with balancing settings * @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) { private fun getBalance(v2rayConfig: V2rayConfig, config: ProfileItem) {
try { try {
v2rayConfig.routing.rules.forEach { rule -> v2rayConfig.routing.rules.forEach { rule ->
if (rule.outboundTag == "proxy") { if (rule.outboundTag == "proxy") {
rule.outboundTag = null rule.outboundTag = null
rule.balancerTag = "proxy-round" rule.balancerTag = AppConfig.TAG_BALANCER
} }
} }
if (config.policyGroupType == "0") { val lstSelector = listOf("proxy-")
val balancer = V2rayConfig.RoutingBean.BalancerBean( when (config.policyGroupType) {
tag = "proxy-round", // Least Ping goto else
selector = listOf("proxy-"), "1" -> {
strategy = V2rayConfig.RoutingBean.StrategyObject( // Least Load
type = "leastPing" val balancer = V2rayConfig.RoutingBean.BalancerBean(
tag = AppConfig.TAG_BALANCER,
selector = lstSelector,
strategy = V2rayConfig.RoutingBean.StrategyObject(
type = "leastLoad"
)
) )
) v2rayConfig.routing.balancers = listOf(balancer)
v2rayConfig.routing.balancers = listOf(balancer) v2rayConfig.burstObservatory = V2rayConfig.BurstObservatoryObject(
v2rayConfig.observatory = V2rayConfig.ObservatoryObject( subjectSelector = lstSelector,
subjectSelector = listOf("proxy-"), pingConfig = V2rayConfig.BurstObservatoryObject.PingConfigObject(
probeUrl = MmkvManager.decodeSettingsString(AppConfig.PREF_DELAY_TEST_URL) ?: AppConfig.DELAY_TEST_URL, destination = MmkvManager.decodeSettingsString(AppConfig.PREF_DELAY_TEST_URL) ?: AppConfig.DELAY_TEST_URL,
probeInterval = "3m", interval = "5m",
enableConcurrency = true sampling = 2,
) timeout = "30s"
} else { )
val balancer = V2rayConfig.RoutingBean.BalancerBean(
tag = "proxy-round",
selector = listOf("proxy-"),
strategy = V2rayConfig.RoutingBean.StrategyObject(
type = "leastLoad"
) )
) }
v2rayConfig.routing.balancers = listOf(balancer) "2" -> {
v2rayConfig.burstObservatory = V2rayConfig.BurstObservatoryObject( // Random
subjectSelector = listOf("proxy-"), val balancer = V2rayConfig.RoutingBean.BalancerBean(
pingConfig = V2rayConfig.BurstObservatoryObject.PingConfigObject( tag = AppConfig.TAG_BALANCER,
destination = MmkvManager.decodeSettingsString(AppConfig.PREF_DELAY_TEST_URL) ?: AppConfig.DELAY_TEST_URL, selector = lstSelector,
interval = "5m", strategy = V2rayConfig.RoutingBean.StrategyObject(
sampling = 2, type = "random"
timeout = "30s" )
) )
) 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") { if (v2rayConfig.routing.domainStrategy == "IPIfNonMatch") {
v2rayConfig.routing.rules.add( v2rayConfig.routing.rules.add(
RulesBean( RulesBean(
ip = arrayListOf("0.0.0.0/0", "::/0"), ip = arrayListOf("0.0.0.0/0", "::/0"),
balancerTag = "proxy-round", balancerTag = AppConfig.TAG_BALANCER,
type = "field"
) )
) )
} else { } else {
v2rayConfig.routing.rules.add( v2rayConfig.routing.rules.add(
RulesBean( RulesBean(
network = "tcp,udp", network = "tcp,udp",
balancerTag = "proxy-round", balancerTag = AppConfig.TAG_BALANCER,
type = "field"
) )
) )
} }
@@ -399,6 +399,8 @@
<string-array name="policy_group_type"> <string-array name="policy_group_type">
<item>Least Ping</item> <item>Least Ping</item>
<item>Least Load</item> <item>Least Load</item>
<item>Random</item>
<item>Round Robin</item>
</string-array> </string-array>
<string-array name="config_backup_options"> <string-array name="config_backup_options">
@@ -405,6 +405,8 @@
<string-array name="policy_group_type"> <string-array name="policy_group_type">
<item>Least Ping</item> <item>Least Ping</item>
<item>Least Load</item> <item>Least Load</item>
<item>Random</item>
<item>Round Robin</item>
</string-array> </string-array>
<string-array name="config_backup_options"> <string-array name="config_backup_options">
@@ -415,6 +415,8 @@
<string-array name="policy_group_type"> <string-array name="policy_group_type">
<item>کم ترین پینگ</item> <item>کم ترین پینگ</item>
<item>کم ترین بار(لود)</item> <item>کم ترین بار(لود)</item>
<item>تصادفی</item>
<item>گردشی</item>
</string-array> </string-array>
<string-array name="config_backup_options"> <string-array name="config_backup_options">
@@ -414,6 +414,8 @@
<string-array name="policy_group_type"> <string-array name="policy_group_type">
<item>کمترین پینگ</item> <item>کمترین پینگ</item>
<item>کمترین بار(لود)</item> <item>کمترین بار(لود)</item>
<item>تصادفی</item>
<item>گردشی</item>
</string-array> </string-array>
<string-array name="config_backup_options"> <string-array name="config_backup_options">
@@ -414,6 +414,8 @@
<string-array name="policy_group_type"> <string-array name="policy_group_type">
<item>Наименьшая задержка</item> <item>Наименьшая задержка</item>
<item>Наименьшая нагрузка</item> <item>Наименьшая нагрузка</item>
<item>Случайный</item>
<item>По очереди</item>
</string-array> </string-array>
<string-array name="config_backup_options"> <string-array name="config_backup_options">
@@ -401,6 +401,8 @@
<string-array name="policy_group_type"> <string-array name="policy_group_type">
<item>Least Ping</item> <item>Least Ping</item>
<item>Least Load</item> <item>Least Load</item>
<item>Random</item>
<item>Round Robin</item>
</string-array> </string-array>
<string-array name="config_backup_options"> <string-array name="config_backup_options">
@@ -406,6 +406,8 @@
<string-array name="policy_group_type"> <string-array name="policy_group_type">
<item>最低延迟</item> <item>最低延迟</item>
<item>最稳定</item> <item>最稳定</item>
<item>随机选择</item>
<item>轮询</item>
</string-array> </string-array>
<string-array name="config_backup_options"> <string-array name="config_backup_options">
@@ -406,6 +406,8 @@
<string-array name="policy_group_type"> <string-array name="policy_group_type">
<item>最低延遲</item> <item>最低延遲</item>
<item>最少卡頓</item> <item>最少卡頓</item>
<item>隨機選擇</item>
<item>輪詢</item>
</string-array> </string-array>
<string-array name="config_backup_options"> <string-array name="config_backup_options">
@@ -419,6 +419,8 @@
<string-array name="policy_group_type"> <string-array name="policy_group_type">
<item>Least Ping</item> <item>Least Ping</item>
<item>Least Load</item> <item>Least Load</item>
<item>Random</item>
<item>Round Robin</item>
</string-array> </string-array>
<string-array name="config_backup_options"> <string-array name="config_backup_options">