Commit 19083dc0 authored by Mygod's avatar Mygod

Fix bindSocketToNetwork optimized out in API 22

parent 0e8888d1
...@@ -30,6 +30,7 @@ import android.os.Looper ...@@ -30,6 +30,7 @@ import android.os.Looper
import android.system.ErrnoException import android.system.ErrnoException
import android.system.Os import android.system.Os
import android.system.OsConstants import android.system.OsConstants
import com.crashlytics.android.Crashlytics
import com.github.shadowsocks.Core import com.github.shadowsocks.Core
import com.github.shadowsocks.utils.closeQuietly import com.github.shadowsocks.utils.closeQuietly
import com.github.shadowsocks.utils.int import com.github.shadowsocks.utils.int
...@@ -52,7 +53,8 @@ sealed class DnsResolverCompat { ...@@ -52,7 +53,8 @@ sealed class DnsResolverCompat {
when (Build.VERSION.SDK_INT) { when (Build.VERSION.SDK_INT) {
in 29..Int.MAX_VALUE -> DnsResolverCompat29 in 29..Int.MAX_VALUE -> DnsResolverCompat29
in 23 until 29 -> DnsResolverCompat23 in 23 until 29 -> DnsResolverCompat23
in 21 until 23 -> DnsResolverCompat21() 22 -> DnsResolverCompat22
21 -> DnsResolverCompat21()
else -> error("Unsupported API level") else -> error("Unsupported API level")
} }
} }
...@@ -138,6 +140,25 @@ sealed class DnsResolverCompat { ...@@ -138,6 +140,25 @@ sealed class DnsResolverCompat {
GlobalScope.async(unboundedIO) { InetAddress.getAllByName(host) }.await() GlobalScope.async(unboundedIO) { InetAddress.getAllByName(host) }.await()
} }
@TargetApi(22)
private object DnsResolverCompat22 : DnsResolverCompat21() {
private val bindSocketFd by lazy {
Network::class.java.getDeclaredMethod("bindSocketFd").apply { isAccessible = true }
}
override fun bindSocket(network: Network, socket: FileDescriptor) {
try {
bindSocketFd.invoke(network, socket)
} catch (e1: ReflectiveOperationException) {
try {
super.bindSocket(network, socket)
Crashlytics.logException(e1)
} catch (e2: ReflectiveOperationException) {
throw e1.apply { addSuppressed(e2) }
}
}
}
}
@TargetApi(23) @TargetApi(23)
private object DnsResolverCompat23 : DnsResolverCompat21() { private object DnsResolverCompat23 : DnsResolverCompat21() {
override fun bindSocket(network: Network, socket: FileDescriptor) = network.bindSocket(socket) override fun bindSocket(network: Network, socket: FileDescriptor) = network.bindSocket(socket)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment