From 6c992c5937d56c34a585117e06705277e7f561ed Mon Sep 17 00:00:00 2001 From: Mygod Date: Tue, 12 Jul 2016 18:46:31 +0800 Subject: [PATCH] Refine proguard rules and flushing DNS on Android 4.x This reverts commit 7a87eab47c9c7e0230ab62b569d31f72448fe0cb. --- build.sbt | 15 ++-- .../shadowsocks/ShadowsocksNatService.scala | 79 +------------------ .../com/github/shadowsocks/utils/Utils.scala | 9 ++- 3 files changed, 18 insertions(+), 85 deletions(-) diff --git a/build.sbt b/build.sbt index 16597e13..25808fdf 100644 --- a/build.sbt +++ b/build.sbt @@ -51,14 +51,13 @@ proguardVersion in Android := "5.2.1" proguardCache in Android := Seq() -proguardOptions in Android ++= Seq("-keep class com.github.shadowsocks.**", - "-keep class com.github.shadowsocks.System { *; }", - "-keep class me.dm7.**", - "-keep class com.google.android.gms.**", - "-keepattributes *Annotation*", - "-dontnote com.j256.ormlite.**", - "-dontnote org.xbill.**", - "-dontwarn org.xbill.**") +proguardOptions in Android ++= Seq( + "-keep class com.github.shadowsocks.System { *; }", + "-dontnote com.google.android.gms.internal.**", + "-dontnote com.j256.ormlite.**", + "-dontnote me.dm7.barcodescannerview.**", + "-dontnote org.xbill.**", + "-dontwarn org.xbill.**") lazy val nativeBuild = TaskKey[Unit]("native-build", "Build native executables") diff --git a/src/main/scala/com/github/shadowsocks/ShadowsocksNatService.scala b/src/main/scala/com/github/shadowsocks/ShadowsocksNatService.scala index 90390661..f213f3aa 100644 --- a/src/main/scala/com/github/shadowsocks/ShadowsocksNatService.scala +++ b/src/main/scala/com/github/shadowsocks/ShadowsocksNatService.scala @@ -45,12 +45,11 @@ import java.net.{Inet6Address, InetAddress} import java.util.Locale import android.content._ -import android.net.{ConnectivityManager, Network} import android.os._ -import android.util.{Log, SparseArray} -import com.github.shadowsocks.utils._ +import android.util.Log import com.github.shadowsocks.ShadowsocksApplication.app import com.github.shadowsocks.database.Profile +import com.github.shadowsocks.utils._ import scala.collection.JavaConversions._ import scala.collection.mutable.ArrayBuffer @@ -71,78 +70,6 @@ class ShadowsocksNatService extends BaseService { var redsocksProcess: Process = _ var pdnsdProcess: Process = _ - private val dnsAddressCache = new SparseArray[String] - - def getNetId(network: Network): Int = { - network.getClass.getDeclaredField("netId").get(network).asInstanceOf[Int] - } - - def restoreDnsForAllNetwork() { - val manager = getSystemService(Context.CONNECTIVITY_SERVICE).asInstanceOf[ConnectivityManager] - val networks = manager.getAllNetworks - val cmdBuf = new ArrayBuffer[String]() - networks.foreach(network => { - val netId = getNetId(network) - val oldDns = dnsAddressCache.get(netId) - if (oldDns != null) { - cmdBuf.append("ndc resolver setnetdns %d \"\" %s".formatLocal(Locale.ENGLISH, netId, oldDns)) - dnsAddressCache.remove(netId) - } - }) - if (cmdBuf.nonEmpty) Console.runRootCommand(cmdBuf.toArray) - } - - def setDnsForAllNetwork(dns: String) { - val manager = getSystemService(Context.CONNECTIVITY_SERVICE).asInstanceOf[ConnectivityManager] - val networks = manager.getAllNetworks - if (networks == null) return - - val cmdBuf = new ArrayBuffer[String]() - networks.foreach(network => { - val networkInfo = manager.getNetworkInfo(network) - if (networkInfo == null) return - if (networkInfo.isConnected) { - val netId = getNetId(network) - val curDnsList = manager.getLinkProperties(network).getDnsServers - if (curDnsList != null) { - import scala.collection.JavaConverters._ - val curDns = curDnsList.asScala.map(ip => ip.getHostAddress).mkString(" ") - if (curDns != dns) { - dnsAddressCache.put(netId, curDns) - cmdBuf.append("ndc resolver setnetdns %d \"\" %s".formatLocal(Locale.ENGLISH, netId, dns)) - } - } - } - }) - if (cmdBuf.nonEmpty) Console.runRootCommand(cmdBuf.toArray) - } - - def setupDns() { - setDnsForAllNetwork("127.0.0.1") - } - - def resetDns() = { - restoreDnsForAllNetwork() - } - - def flushDns() { - if (Utils.isLollipopOrAbove) { - val manager = getSystemService(Context.CONNECTIVITY_SERVICE).asInstanceOf[ConnectivityManager] - val networks = manager.getAllNetworks - val cmdBuf = new ArrayBuffer[String]() - networks.foreach(network => { - val networkInfo = manager.getNetworkInfo(network) - if (networkInfo.isAvailable) { - val netId = network.getClass.getDeclaredField("netId").get(network).asInstanceOf[Int] - cmdBuf.append("ndc resolver flushnet %d".formatLocal(Locale.ENGLISH, netId)) - } - }) - Console.runRootCommand(cmdBuf.toArray) - } else { - Console.runRootCommand("ndc resolver flushdefaultif", "ndc resolver flushif wlan0") - } - } - def startShadowsocksDaemon() { if (profile.route != Route.ALL) { val acl: Array[Array[String]] = profile.route match { @@ -376,7 +303,7 @@ class ShadowsocksNatService extends BaseService { stopRunner(true) } else if (handleConnection) { // Set DNS - flushDns() + Utils.flushDns() changeState(State.CONNECTED) notification = new ShadowsocksNotification(this, profile.name, true) } else { diff --git a/src/main/scala/com/github/shadowsocks/utils/Utils.scala b/src/main/scala/com/github/shadowsocks/utils/Utils.scala index c5c79121..ecdf46f9 100644 --- a/src/main/scala/com/github/shadowsocks/utils/Utils.scala +++ b/src/main/scala/com/github/shadowsocks/utils/Utils.scala @@ -129,10 +129,17 @@ object Utils { } } + // Because /sys/class/net/* isn't accessible since API level 24 + def flushDns() = Console.runRootCommand("for if in /sys/class/net/*; do " + + "if [ \"down\" != $(cat $if/operstate) ]; then " + // up or unknown + "ndc resolver flushif ${if##*/}; " + + "fi " + + "done") + // Blocked > 3 seconds def toggleAirplaneMode(context: Context) = { if (Console.isRoot) { - Console.runRootCommand("ndc resolver flushdefaultif", "ndc resolver flushif wlan0") + flushDns() true } else if (Build.VERSION.SDK_INT < 17) { toggleBelowApiLevel17(context)