From 850096789b111abc41a660f37a2e5b56686becbd Mon Sep 17 00:00:00 2001 From: 2dust <31833384+2dust@users.noreply.github.com> Date: Mon, 9 Mar 2026 16:52:57 +0800 Subject: [PATCH] When geoip:cn and geoip:private appear in the routing rules, load geoip-only-cn-private.dat to reduce memory usage. --- .../app/src/main/java/com/v2ray/ang/AppConfig.kt | 6 ++++++ .../java/com/v2ray/ang/handler/SettingsManager.kt | 2 +- .../com/v2ray/ang/handler/V2rayConfigManager.kt | 13 +++++++++++++ .../com/v2ray/ang/viewmodel/UserAssetViewModel.kt | 15 +++++++++++++-- 4 files changed, 33 insertions(+), 3 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 b8b48d76..7ab21797 100644 --- a/V2rayNG/app/src/main/java/com/v2ray/ang/AppConfig.kt +++ b/V2rayNG/app/src/main/java/com/v2ray/ang/AppConfig.kt @@ -132,6 +132,12 @@ object AppConfig { const val GEOIP_PRIVATE = "geoip:private" const val GEOIP_CN = "geoip:cn" + /** Geo data file names. */ + const val GEOSITE_DAT = "geosite.dat" + const val GEOIP_DAT = "geoip.dat" + const val GEOIP_ONLY_CN_PRIVATE_DAT = "geoip-only-cn-private.dat" + const val GEOIP_ONLY_CN_PRIVATE_URL = "$GITHUB_RAW_URL/Loyalsoldier/geoip/release/$GEOIP_ONLY_CN_PRIVATE_DAT" + /** Ports and addresses for various services. */ const val PORT_LOCAL_DNS = "10853" const val PORT_SOCKS = "10808" 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 d5f7d90c..52358a07 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 @@ -265,7 +265,7 @@ object SettingsManager { val extFolder = Utils.userAssetPath(context) try { - val geo = arrayOf("geosite.dat", "geoip.dat") + val geo = arrayOf(AppConfig.GEOSITE_DAT, AppConfig.GEOIP_DAT, AppConfig.GEOIP_ONLY_CN_PRIVATE_DAT) assets.list("") ?.filter { geo.contains(it) } ?.filter { !File(extFolder, it).exists() } 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 e2c7c7fb..2aa000a7 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 @@ -467,6 +467,19 @@ object V2rayConfigManager { val rule = JsonUtil.fromJson(JsonUtil.toJson(item), RulesBean::class.java) ?: return + // Replace specific geoip rules with ext versions + rule.ip?.let { ipList -> + val updatedIpList = ArrayList() + ipList.forEach { ip -> + when (ip) { + AppConfig.GEOIP_CN -> updatedIpList.add("ext:${AppConfig.GEOIP_ONLY_CN_PRIVATE_DAT}:cn") + AppConfig.GEOIP_PRIVATE -> updatedIpList.add("ext:${AppConfig.GEOIP_ONLY_CN_PRIVATE_DAT}:private") + else -> updatedIpList.add(ip) + } + } + rule.ip = updatedIpList + } + v2rayConfig.routing.rules.add(rule) } catch (e: Exception) { diff --git a/V2rayNG/app/src/main/java/com/v2ray/ang/viewmodel/UserAssetViewModel.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/viewmodel/UserAssetViewModel.kt index c92548f8..80cf0953 100644 --- a/V2rayNG/app/src/main/java/com/v2ray/ang/viewmodel/UserAssetViewModel.kt +++ b/V2rayNG/app/src/main/java/com/v2ray/ang/viewmodel/UserAssetViewModel.kt @@ -15,7 +15,7 @@ import java.net.HttpURLConnection class UserAssetViewModel : ViewModel() { private val assets = mutableListOf() - private val builtInGeoFiles = listOf("geosite.dat", "geoip.dat") + private val builtInGeoFiles = listOf(AppConfig.GEOSITE_DAT, AppConfig.GEOIP_DAT, AppConfig.GEOIP_ONLY_CN_PRIVATE_DAT) val itemCount: Int get() = assets.size @@ -47,7 +47,18 @@ class UserAssetViewModel : ViewModel() { ) ) } - return builtInItems + savedAssets + // Force update URL for geoip-only-cn-private.dat + return (builtInItems + savedAssets).map { cache -> + if (cache.assetUrl.remarks == AppConfig.GEOIP_ONLY_CN_PRIVATE_DAT) { + cache.copy( + assetUrl = cache.assetUrl.copy( + url = AppConfig.GEOIP_ONLY_CN_PRIVATE_URL + ) + ) + } else { + cache + } + } } fun downloadGeoFiles(extDir: File, httpPort: Int): GeoDownloadResult {