diff --git a/src/main/AndroidManifest.xml b/src/main/AndroidManifest.xml index bbb2dbc7..17ac37ec 100644 --- a/src/main/AndroidManifest.xml +++ b/src/main/AndroidManifest.xml @@ -1,7 +1,7 @@ + android:versionCode="114" + android:versionName="2.7.6"> diff --git a/src/main/scala/com/github/shadowsocks/ShadowsocksVpnService.scala b/src/main/scala/com/github/shadowsocks/ShadowsocksVpnService.scala index 6770929d..d444fdc5 100644 --- a/src/main/scala/com/github/shadowsocks/ShadowsocksVpnService.scala +++ b/src/main/scala/com/github/shadowsocks/ShadowsocksVpnService.scala @@ -63,7 +63,7 @@ class ShadowsocksVpnService extends VpnService with BaseService { private lazy val application = getApplication.asInstanceOf[ShadowsocksApplication] val TAG = "ShadowsocksVpnService" - val VPN_MTU = 1400 + val VPN_MTU = 1500 val PRIVATE_VLAN = "26.26.26.%s" var conn: ParcelFileDescriptor = null var notificationManager: NotificationManager = null @@ -103,11 +103,6 @@ class ShadowsocksVpnService extends VpnService with BaseService { null } - override def onDestroy() { - super.onDestroy() - if (vpnThread != null) vpnThread.stopThread() - } - override def onCreate() { super.onCreate() @@ -115,9 +110,6 @@ class ShadowsocksVpnService extends VpnService with BaseService { notificationManager = getSystemService(Context.NOTIFICATION_SERVICE) .asInstanceOf[NotificationManager] - - vpnThread = new ShadowsocksVpnThread(this) - vpnThread.start() } override def onRevoke() { @@ -126,6 +118,11 @@ class ShadowsocksVpnService extends VpnService with BaseService { override def stopRunner() { + if (vpnThread != null) { + vpnThread.stopThread() + vpnThread = null + } + // channge the state changeState(State.STOPPING) @@ -185,6 +182,14 @@ class ShadowsocksVpnService extends VpnService with BaseService { override def startRunner(c: Config) { + if (vpnThread != null) { + vpnThread.stopThread() + vpnThread = null + } + + vpnThread = new ShadowsocksVpnThread(this) + vpnThread.start() + config = c // ensure the VPNService is prepared diff --git a/src/main/scala/com/github/shadowsocks/ShadowsocksVpnThread.scala b/src/main/scala/com/github/shadowsocks/ShadowsocksVpnThread.scala index eb679fad..fd49f7de 100644 --- a/src/main/scala/com/github/shadowsocks/ShadowsocksVpnThread.scala +++ b/src/main/scala/com/github/shadowsocks/ShadowsocksVpnThread.scala @@ -45,43 +45,38 @@ import java.util.concurrent.Executors import android.net.{LocalServerSocket, LocalSocket, LocalSocketAddress} import android.util.Log +object ShadowsocksVpn { + @volatile var serverSocket: LocalServerSocket = null +} + class ShadowsocksVpnThread(vpnService: ShadowsocksVpnService) extends Thread { val TAG = "ShadowsocksVpnService" val PATH = "shadowsocks_protect" var isRunning: Boolean = true - var serverSocket: LocalServerSocket = null def stopThread() { isRunning = false - if (serverSocket != null) { - serverSocket.close() - serverSocket = null - } } override def run(): Unit = { try { - if (serverSocket != null) { - serverSocket.close() - serverSocket = null + if (ShadowsocksVpn.serverSocket == null) { + ShadowsocksVpn.serverSocket = new LocalServerSocket(PATH) } - serverSocket = new LocalServerSocket(PATH) } catch { case e: IOException => Log.e(TAG, "unable to bind", e) - vpnService.stopBackgroundService() return } val pool = Executors.newFixedThreadPool(4) while (isRunning) { - try { - val socket = serverSocket.accept() + val socket = ShadowsocksVpn.serverSocket.accept() pool.execute(new Runnable { override def run() { @@ -126,7 +121,10 @@ class ShadowsocksVpnThread(vpnService: ShadowsocksVpnService) extends Thread { }}) } catch { - case e: IOException => Log.e(TAG, "Error when accept socket", e) + case e: IOException => { + Log.e(TAG, "Error when accept socket", e) + return + } } } }