diff --git a/buildSrc/src/main/java/com/github/kr328/clash/tools/ClashBuildTask.kt b/buildSrc/src/main/java/com/github/kr328/clash/tools/ClashBuildTask.kt
index 01baa3c7602f4d68f6f0d38d62f72dd3cc1a562b..eb5aff5e9797dcd0a6fb0c99a99f2c44b86cb357 100644
--- a/buildSrc/src/main/java/com/github/kr328/clash/tools/ClashBuildTask.kt
+++ b/buildSrc/src/main/java/com/github/kr328/clash/tools/ClashBuildTask.kt
@@ -39,8 +39,8 @@ abstract class ClashBuildTask : DefaultTask() {
         config.abis.forEach {
             Command.ofGoRun(
                 "make/make.go",
-                listOf("bridge", "native", "build", "android", it.goArch),
-                input.resolve("tun2socket/bridge"),
+                listOf("tun2socket", ".", "android", it.goArch),
+                input.resolve("tun2socket"),
                 environment.ofLwipBuild(it)
             ).exec()
 
diff --git a/buildSrc/src/main/java/com/github/kr328/clash/tools/ClashCleanTask.kt b/buildSrc/src/main/java/com/github/kr328/clash/tools/ClashCleanTask.kt
index e4451bedcb5fc75cc041b7fb2321b1ef7b527e47..305dccca923944e6d61fc88249bc49ea3e0153b3 100644
--- a/buildSrc/src/main/java/com/github/kr328/clash/tools/ClashCleanTask.kt
+++ b/buildSrc/src/main/java/com/github/kr328/clash/tools/ClashCleanTask.kt
@@ -6,7 +6,7 @@ import golangSource
 
 abstract class ClashCleanTask : Delete() {
     fun applyFrom(project: Project, abis: List<NativeAbi>) {
-        val bridge = project.golangSource.resolve("tun2socket/bridge")
+        val bridge = project.golangSource.resolve("tun2socket")
 
         delete(bridge.resolve("build"))
 
diff --git a/buildSrc/src/main/java/com/github/kr328/clash/tools/Environment.kt b/buildSrc/src/main/java/com/github/kr328/clash/tools/Environment.kt
index 2bee8c014b5639efe79e1025cee0cf0f396ba1d1..0a026a3a4b803522721011b3ffdd025069817159 100644
--- a/buildSrc/src/main/java/com/github/kr328/clash/tools/Environment.kt
+++ b/buildSrc/src/main/java/com/github/kr328/clash/tools/Environment.kt
@@ -34,11 +34,25 @@ class Environment(
     }
 
     fun ofLwipBuild(abi: NativeAbi): Map<String, String> {
+        val host = when {
+            Os.isFamily(Os.FAMILY_WINDOWS) ->
+                "windows"
+            Os.isFamily(Os.FAMILY_MAC) ->
+                "darwin"
+            Os.isFamily(Os.FAMILY_UNIX) ->
+                "linux"
+            else ->
+                throw GradleException("Unsupported host: ${System.getProperty("os.name")}")
+        }
+
+        val compiler = ndkDirectory.resolve("toolchains/llvm/prebuilt/$host-x86_64/bin")
+            .resolve("${abi.compiler}${minSdkVersion}-clang")
+        val ar = ndkDirectory.resolve("toolchains/llvm/prebuilt/$host-x86_64/bin")
+            .resolve("${abi.archiver}-ar")
+
         return mapOf(
-            "CMAKE_SYSTEM_NAME" to "Android",
-            "CMAKE_ANDROID_NDK" to ndkDirectory.absolutePath,
-            "CMAKE_ANDROID_ARCH_ABI" to abi.value,
-            "CMAKE_SYSTEM_VERSION" to minSdkVersion.toString()
+            "CC" to compiler.absolutePath,
+            "AR" to ar.absolutePath,
         )
     }
 }
\ No newline at end of file
diff --git a/buildSrc/src/main/java/com/github/kr328/clash/tools/NativeAbi.kt b/buildSrc/src/main/java/com/github/kr328/clash/tools/NativeAbi.kt
index b115833bb249bc8b715424e576d1ab95c0be9380..029f17b657df613e967b8b5aaacba4c057e0c53d 100644
--- a/buildSrc/src/main/java/com/github/kr328/clash/tools/NativeAbi.kt
+++ b/buildSrc/src/main/java/com/github/kr328/clash/tools/NativeAbi.kt
@@ -3,13 +3,14 @@ package com.github.kr328.clash.tools
 enum class NativeAbi(
     val value: String,
     val compiler: String,
+    val archiver: String,
     val goArch: String,
     val goArm: String
 ) {
-    ArmeabiV7a("armeabi-v7a", "armv7a-linux-androideabi", "arm", "7"),
-    Arm64V8a("arm64-v8a", "aarch64-linux-android", "arm64", ""),
-    X86("x86", "i686-linux-android", "386", ""),
-    X64("x86_64", "x86_64-linux-android", "amd64", "");
+    ArmeabiV7a("armeabi-v7a", "armv7a-linux-androideabi", "arm-linux-androideabi", "arm", "7"),
+    Arm64V8a("arm64-v8a", "aarch64-linux-android", "aarch64-linux-android", "arm64", ""),
+    X86("x86", "i686-linux-android", "i686-linux-android", "386", ""),
+    X64("x86_64", "x86_64-linux-android", "x86_64-linux-android", "amd64", "");
 
     companion object {
         fun parse(value: String): NativeAbi {
diff --git a/core/src/main/golang/tun/dns.go b/core/src/main/golang/tun/dns.go
index f2d8fd7d7d5db928476a975085a6ba1275f407ad..1533034681a2d78f045b4b5f5b659f96c20c1a32 100644
--- a/core/src/main/golang/tun/dns.go
+++ b/core/src/main/golang/tun/dns.go
@@ -7,7 +7,7 @@ import (
 	"time"
 
 	"github.com/Dreamacro/clash/component/resolver"
-	"github.com/kr328/tun2socket/bridge"
+	"github.com/kr328/tun2socket"
 
 	D "github.com/miekg/dns"
 )
@@ -22,7 +22,7 @@ func shouldHijackDns(dns net.IP, target net.IP, targetPort int) bool {
 	return net.IPv4zero.Equal(dns) || target.Equal(dns)
 }
 
-func hijackUDPDns(pkt []byte, lAddr, rAddr net.Addr, udp bridge.UDP) {
+func hijackUDPDns(pkt []byte, lAddr, rAddr net.Addr, udp tun2socket.UDP) {
 	go func() {
 		answer, err := relayDnsPacket(pkt)
 
diff --git a/core/src/main/golang/tun/udp.go b/core/src/main/golang/tun/udp.go
index a2892af1c0d79ea73a2a58c8080c5408880b1df5..d7fc43757fe7a5ef91df8d2ad2fce2f5316bd3af 100644
--- a/core/src/main/golang/tun/udp.go
+++ b/core/src/main/golang/tun/udp.go
@@ -4,7 +4,7 @@ import (
 	"net"
 
 	"github.com/Dreamacro/clash/transport/socks5"
-	"github.com/kr328/tun2socket/bridge"
+	"github.com/kr328/tun2socket"
 
 	adapters "github.com/Dreamacro/clash/adapters/inbound"
 	"github.com/Dreamacro/clash/common/pool"
@@ -15,7 +15,7 @@ import (
 type udpPacket struct {
 	source   *net.UDPAddr
 	data     []byte
-	udp      bridge.UDP
+	udp      tun2socket.UDP
 }
 
 func (u *udpPacket) Data() []byte {
@@ -38,7 +38,7 @@ func (u *udpPacket) LocalAddr() net.Addr {
 	}
 }
 
-func handleUDP(payload []byte, source *net.UDPAddr, target *net.UDPAddr, udp bridge.UDP) {
+func handleUDP(payload []byte, source *net.UDPAddr, target *net.UDPAddr, udp tun2socket.UDP) {
 	pkt := &udpPacket{
 		source:   source,
 		data:     payload,
diff --git a/core/src/main/golang/tun2socket b/core/src/main/golang/tun2socket
index 958ecb352f87f8a10303b6df31a7aa859ce3bcf3..c388e5d9f63850b7f693d1d7e1a5d6fbf51d0b8d 160000
--- a/core/src/main/golang/tun2socket
+++ b/core/src/main/golang/tun2socket
@@ -1 +1 @@
-Subproject commit 958ecb352f87f8a10303b6df31a7aa859ce3bcf3
+Subproject commit c388e5d9f63850b7f693d1d7e1a5d6fbf51d0b8d