diff --git a/app/src/main/java/io/nekohasekai/sagernet/Constants.kt b/app/src/main/java/io/nekohasekai/sagernet/Constants.kt index 4d29104..edf9993 100644 --- a/app/src/main/java/io/nekohasekai/sagernet/Constants.kt +++ b/app/src/main/java/io/nekohasekai/sagernet/Constants.kt @@ -52,9 +52,6 @@ object Key { const val ALWAYS_SHOW_ADDRESS = "alwaysShowAddress" // Protocol Settings - const val MUX_TYPE = "muxType" - const val MUX_PROTOCOLS = "mux" - const val MUX_CONCURRENCY = "muxConcurrency" const val GLOBAL_ALLOW_INSECURE = "globalAllowInsecure" const val ACQUIRE_WAKE_LOCK = "acquireWakeLock" diff --git a/app/src/main/java/io/nekohasekai/sagernet/database/DataStore.kt b/app/src/main/java/io/nekohasekai/sagernet/database/DataStore.kt index 7ace0b8..f710f00 100644 --- a/app/src/main/java/io/nekohasekai/sagernet/database/DataStore.kt +++ b/app/src/main/java/io/nekohasekai/sagernet/database/DataStore.kt @@ -169,9 +169,6 @@ object DataStore : OnPreferenceDataStoreChangeListener { // protocol - var muxType by configurationStore.stringToInt(Key.MUX_TYPE) - var muxProtocols by configurationStore.stringSet(Key.MUX_PROTOCOLS) - var muxConcurrency by configurationStore.stringToInt(Key.MUX_CONCURRENCY) { 8 } var globalAllowInsecure by configurationStore.boolean(Key.GLOBAL_ALLOW_INSECURE) { false } // old cache, DO NOT ADD diff --git a/app/src/main/java/io/nekohasekai/sagernet/database/ProxyEntity.kt b/app/src/main/java/io/nekohasekai/sagernet/database/ProxyEntity.kt index 45f0a31..8d2b129 100644 --- a/app/src/main/java/io/nekohasekai/sagernet/database/ProxyEntity.kt +++ b/app/src/main/java/io/nekohasekai/sagernet/database/ProxyEntity.kt @@ -33,6 +33,7 @@ import io.nekohasekai.sagernet.ktx.app import io.nekohasekai.sagernet.ktx.applyDefaultValues import io.nekohasekai.sagernet.ui.profile.* import moe.matsuri.nb4a.Protocols +import moe.matsuri.nb4a.SingBoxOptions.MultiplexOptions import moe.matsuri.nb4a.proxy.config.ConfigBean import moe.matsuri.nb4a.proxy.config.ConfigSettingActivity import moe.matsuri.nb4a.proxy.neko.* @@ -309,19 +310,31 @@ data class ProxyEntity( } } - fun needCoreMux(): Boolean { + fun singMux(): MultiplexOptions? { return when (type) { - TYPE_VMESS -> if (vmessBean!!.isVLESS) { - Protocols.isProfileNeedMux(vmessBean!!) && Protocols.shouldEnableMux("vless") - } else { - Protocols.isProfileNeedMux(vmessBean!!) && Protocols.shouldEnableMux("vmess") + TYPE_VMESS -> MultiplexOptions().apply { + enabled = vmessBean!!.enableMux + padding = vmessBean!!.muxPadding + max_streams = vmessBean!!.muxConcurrency + protocol = when (vmessBean!!.muxType) { + 1 -> "smux" + 2 -> "yamux" + else -> "h2mux" + } } - TYPE_TROJAN -> Protocols.isProfileNeedMux(trojanBean!!) - && Protocols.shouldEnableMux("trojan") + TYPE_TROJAN -> MultiplexOptions().apply { + enabled = trojanBean!!.enableMux + padding = trojanBean!!.muxPadding + max_streams = trojanBean!!.muxConcurrency + protocol = when (trojanBean!!.muxType) { + 1 -> "smux" + 2 -> "yamux" + else -> "h2mux" + } + } - TYPE_SS -> !ssBean!!.sUoT && Protocols.shouldEnableMux("shadowsocks") - else -> false + else -> null } } diff --git a/app/src/main/java/io/nekohasekai/sagernet/fmt/ConfigBuilder.kt b/app/src/main/java/io/nekohasekai/sagernet/fmt/ConfigBuilder.kt index b9bc150..686bce1 100644 --- a/app/src/main/java/io/nekohasekai/sagernet/fmt/ConfigBuilder.kt +++ b/app/src/main/java/io/nekohasekai/sagernet/fmt/ConfigBuilder.kt @@ -383,18 +383,12 @@ fun buildConfig( // val keepAliveInterval = DataStore.tcpKeepAliveInterval // val needKeepAliveInterval = keepAliveInterval !in intArrayOf(0, 15) - if (!muxApplied && proxyEntity.needCoreMux()) { - muxApplied = true - currentOutbound["multiplex"] = MultiplexOptions().apply { - enabled = true - padding = Protocols.shouldEnableMux("padding") - max_streams = DataStore.muxConcurrency - protocol = when (DataStore.muxType) { - 1 -> "smux" - 2 -> "yamux" - else -> "h2mux" - } - }.asMap() + if (!muxApplied) { + val muxObj = proxyEntity.singMux() + if (muxObj != null && muxObj.enabled) { + muxApplied = true + currentOutbound["multiplex"] = muxObj.asMap() + } } } } diff --git a/app/src/main/java/io/nekohasekai/sagernet/fmt/trojan_go/TrojanGoFmt.kt b/app/src/main/java/io/nekohasekai/sagernet/fmt/trojan_go/TrojanGoFmt.kt index cb02357..4e6e91f 100644 --- a/app/src/main/java/io/nekohasekai/sagernet/fmt/trojan_go/TrojanGoFmt.kt +++ b/app/src/main/java/io/nekohasekai/sagernet/fmt/trojan_go/TrojanGoFmt.kt @@ -92,10 +92,10 @@ fun TrojanGoBean.buildTrojanGoConfig(port: Int): String { put(password) }) put("log_level", if (DataStore.logLevel > 0) 0 else 2) - if (Protocols.shouldEnableMux("trojan-go")) put("mux", JSONObject().apply { - put("enabled", true) - put("concurrency", DataStore.muxConcurrency) - }) +// if (Protocols.shouldEnableMux("trojan-go")) put("mux", JSONObject().apply { +// put("enabled", true) +// put("concurrency", DataStore.muxConcurrency) +// }) put("tcp", JSONObject().apply { put("prefer_ipv4", DataStore.ipv6Mode <= IPv6Mode.ENABLE) }) diff --git a/app/src/main/java/io/nekohasekai/sagernet/fmt/v2ray/StandardV2RayBean.java b/app/src/main/java/io/nekohasekai/sagernet/fmt/v2ray/StandardV2RayBean.java index bdd82c7..b3cbcc4 100644 --- a/app/src/main/java/io/nekohasekai/sagernet/fmt/v2ray/StandardV2RayBean.java +++ b/app/src/main/java/io/nekohasekai/sagernet/fmt/v2ray/StandardV2RayBean.java @@ -52,11 +52,20 @@ public abstract class StandardV2RayBean extends AbstractBean { public Boolean enableECH; + public String echConfig; + + // sing-box 不再使用 public Boolean enablePqSignature; public Boolean disabledDRS; - public String echConfig; + // --------------------------------------- Mux + + public Boolean enableMux; + public Boolean muxPadding; + public Integer muxType; + public Integer muxConcurrency; + // --------------------------------------- // @@ -101,11 +110,16 @@ public abstract class StandardV2RayBean extends AbstractBean { if (JavaUtil.isNullOrBlank(echConfig)) echConfig = ""; if (enablePqSignature == null) enablePqSignature = false; if (disabledDRS == null) disabledDRS = false; + + if (enableMux == null) enableMux = false; + if (muxPadding == null) muxPadding = false; + if (muxType == null) muxType = 0; + if (muxConcurrency == null) muxConcurrency = 1; } @Override public void serialize(ByteBufferOutput output) { - output.writeInt(1); + output.writeInt(2); super.serialize(output); output.writeString(uuid); output.writeString(encryption); @@ -160,6 +174,11 @@ public abstract class StandardV2RayBean extends AbstractBean { } output.writeInt(packetEncoding); + + output.writeBoolean(enableMux); + output.writeBoolean(muxPadding); + output.writeInt(muxType); + output.writeInt(muxConcurrency); } @Override @@ -239,6 +258,13 @@ public abstract class StandardV2RayBean extends AbstractBean { } packetEncoding = input.readInt(); + + if (version >= 2) { + enableMux = input.readBoolean(); + muxPadding = input.readBoolean(); + muxType = input.readInt(); + muxConcurrency = input.readInt(); + } } @Override @@ -251,6 +277,10 @@ public abstract class StandardV2RayBean extends AbstractBean { bean.enableECH = enableECH; bean.disabledDRS = disabledDRS; bean.echConfig = echConfig; + bean.enableMux = enableMux; + bean.muxPadding = muxPadding; + bean.muxType = muxType; + bean.muxConcurrency = muxConcurrency; } public boolean isVLESS() { diff --git a/app/src/main/java/io/nekohasekai/sagernet/group/RawUpdater.kt b/app/src/main/java/io/nekohasekai/sagernet/group/RawUpdater.kt index fc70e58..02041af 100644 --- a/app/src/main/java/io/nekohasekai/sagernet/group/RawUpdater.kt +++ b/app/src/main/java/io/nekohasekai/sagernet/group/RawUpdater.kt @@ -416,6 +416,20 @@ object RawUpdater : GroupUpdater() { realityOpt.value.toString() } } + + "smux" -> for (smuxOpt in (opt.value as Map)) { + when (smuxOpt.key.lowercase()) { + "enabled" -> bean.enableMux = + smuxOpt.value.toString() == "true" + + "max-streams" -> bean.muxConcurrency = + smuxOpt.value.toString().toInt() + + "padding" -> bean.muxPadding = + smuxOpt.value.toString() == "true" + } + } + } } if (isHttpUpgrade) { @@ -475,6 +489,19 @@ object RawUpdater : GroupUpdater() { grpcOpt.value.toString() } } + + "smux" -> for (smuxOpt in (opt.value as Map)) { + when (smuxOpt.key.lowercase()) { + "enabled" -> bean.enableMux = + smuxOpt.value.toString() == "true" + + "max-streams" -> bean.muxConcurrency = + smuxOpt.value.toString().toInt() + + "padding" -> bean.muxPadding = + smuxOpt.value.toString() == "true" + } + } } } if (isHttpUpgrade) { diff --git a/app/src/main/java/io/nekohasekai/sagernet/ui/SettingsPreferenceFragment.kt b/app/src/main/java/io/nekohasekai/sagernet/ui/SettingsPreferenceFragment.kt index ff1e669..254529a 100644 --- a/app/src/main/java/io/nekohasekai/sagernet/ui/SettingsPreferenceFragment.kt +++ b/app/src/main/java/io/nekohasekai/sagernet/ui/SettingsPreferenceFragment.kt @@ -17,7 +17,6 @@ import io.nekohasekai.sagernet.database.preference.EditTextPreferenceModifiers import io.nekohasekai.sagernet.ktx.* import io.nekohasekai.sagernet.utils.Theme import io.nekohasekai.sagernet.widget.AppListPreference -import moe.matsuri.nb4a.Protocols import moe.matsuri.nb4a.ui.* class SettingsPreferenceFragment : PreferenceFragmentCompat() { @@ -81,7 +80,6 @@ class SettingsPreferenceFragment : PreferenceFragmentCompat() { val ipv6Mode = findPreference(Key.IPV6_MODE)!! val trafficSniffing = findPreference(Key.TRAFFIC_SNIFFING)!! - val muxConcurrency = findPreference(Key.MUX_CONCURRENCY)!! val tcpKeepAliveInterval = findPreference(Key.TCP_KEEP_ALIVE_INTERVAL)!! tcpKeepAliveInterval.isVisible = false @@ -123,16 +121,7 @@ class SettingsPreferenceFragment : PreferenceFragmentCompat() { true } - val muxProtocols = findPreference(Key.MUX_PROTOCOLS)!! - - muxProtocols.apply { - val e = Protocols.getCanMuxList().toTypedArray() - entries = e - entryValues = e - } - portLocalDns.setOnBindEditTextListener(EditTextPreferenceModifiers.Port) - muxConcurrency.setOnBindEditTextListener(EditTextPreferenceModifiers.Port) mixedPort.setOnBindEditTextListener(EditTextPreferenceModifiers.Port) val metedNetwork = findPreference(Key.METERED_NETWORK)!! @@ -175,7 +164,6 @@ class SettingsPreferenceFragment : PreferenceFragmentCompat() { appendHttpProxy.onPreferenceChangeListener = reloadListener showDirectSpeed.onPreferenceChangeListener = reloadListener trafficSniffing.onPreferenceChangeListener = reloadListener - muxConcurrency.onPreferenceChangeListener = reloadListener tcpKeepAliveInterval.onPreferenceChangeListener = reloadListener bypassLan.onPreferenceChangeListener = reloadListener bypassLanInCore.onPreferenceChangeListener = reloadListener diff --git a/app/src/main/java/io/nekohasekai/sagernet/ui/profile/StandardV2RaySettingsActivity.kt b/app/src/main/java/io/nekohasekai/sagernet/ui/profile/StandardV2RaySettingsActivity.kt index 90d5066..b8ba4da 100644 --- a/app/src/main/java/io/nekohasekai/sagernet/ui/profile/StandardV2RaySettingsActivity.kt +++ b/app/src/main/java/io/nekohasekai/sagernet/ui/profile/StandardV2RaySettingsActivity.kt @@ -47,6 +47,11 @@ abstract class StandardV2RaySettingsActivity : ProfileSettingsActivity { host.preference.setTitle(R.string.ws_host) path.preference.setTitle(R.string.ws_path) diff --git a/app/src/main/java/moe/matsuri/nb4a/Protocols.kt b/app/src/main/java/moe/matsuri/nb4a/Protocols.kt index 2fa9d80..2bbafbf 100644 --- a/app/src/main/java/moe/matsuri/nb4a/Protocols.kt +++ b/app/src/main/java/moe/matsuri/nb4a/Protocols.kt @@ -2,43 +2,13 @@ package moe.matsuri.nb4a import android.content.Context import io.nekohasekai.sagernet.R -import io.nekohasekai.sagernet.database.DataStore import io.nekohasekai.sagernet.database.ProxyEntity.Companion.TYPE_NEKO import io.nekohasekai.sagernet.fmt.AbstractBean -import io.nekohasekai.sagernet.fmt.v2ray.StandardV2RayBean -import io.nekohasekai.sagernet.fmt.v2ray.isTLS import io.nekohasekai.sagernet.ktx.app import io.nekohasekai.sagernet.ktx.getColorAttr -import moe.matsuri.nb4a.plugin.NekoPluginManager // Settings for all protocols, built-in or plugin object Protocols { - // Mux - - fun isProfileNeedMux(bean: StandardV2RayBean): Boolean { - return when (bean.type) { - "tcp", "ws" -> true - "http" -> !bean.isTLS() - else -> false - } - } - - fun shouldEnableMux(protocol: String): Boolean { - return DataStore.muxProtocols.contains(protocol) - } - - fun getCanMuxList(): List { - // built-in and support mux - val list = mutableListOf("vmess", "trojan", "trojan-go", "shadowsocks", "vless", "padding") - - NekoPluginManager.getProtocols().forEach { - if (it.protocolConfig.optBoolean("canMux")) { - list.add(it.protocolId) - } - } - - return list - } // Deduplication diff --git a/app/src/main/java/moe/matsuri/nb4a/proxy/neko/NekoFmt.kt b/app/src/main/java/moe/matsuri/nb4a/proxy/neko/NekoFmt.kt index 88e45ec..eb29e53 100644 --- a/app/src/main/java/moe/matsuri/nb4a/proxy/neko/NekoFmt.kt +++ b/app/src/main/java/moe/matsuri/nb4a/proxy/neko/NekoFmt.kt @@ -65,8 +65,8 @@ suspend fun NekoBean.updateAllConfig(port: Int) = suspendCoroutine { val otherArgs = mutableMapOf() otherArgs["finalAddress"] = finalAddress otherArgs["finalPort"] = finalPort - otherArgs["muxEnabled"] = Protocols.shouldEnableMux(protocolId) - otherArgs["muxConcurrency"] = DataStore.muxConcurrency +// otherArgs["muxEnabled"] = Protocols.shouldEnableMux(protocolId) +// otherArgs["muxConcurrency"] = DataStore.muxConcurrency val ret = jsip.buildAllConfig(port, this@updateAllConfig, otherArgs) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index ff5f33e..196858c 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -568,4 +568,6 @@ Disable certificate checking when updating subscriptions Always allow insecure + Mulitplex + Padding \ No newline at end of file diff --git a/app/src/main/res/xml/global_preferences.xml b/app/src/main/res/xml/global_preferences.xml index e612ad9..463e92a 100644 --- a/app/src/main/res/xml/global_preferences.xml +++ b/app/src/main/res/xml/global_preferences.xml @@ -134,34 +134,6 @@ app:useSimpleSummaryProvider="true" /> - - - - - - - + diff --git a/app/src/main/res/xml/standard_v2ray_preferences.xml b/app/src/main/res/xml/standard_v2ray_preferences.xml index 5717c75..fd679e4 100644 --- a/app/src/main/res/xml/standard_v2ray_preferences.xml +++ b/app/src/main/res/xml/standard_v2ray_preferences.xml @@ -118,11 +118,6 @@ app:key="allowInsecure" app:summary="@string/allow_insecure_sum" app:title="@string/allow_insecure" /> - + app:key="serverMuxCategory" + app:title="@string/mux_preference"> + + + + + + + +