Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
de7e516204 |
@@ -1,7 +1,7 @@
|
|||||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
package="com.github.shadowsocks"
|
package="com.github.shadowsocks"
|
||||||
android:versionCode="113"
|
android:versionCode="114"
|
||||||
android:versionName="2.7.5">
|
android:versionName="2.7.6">
|
||||||
|
|
||||||
<uses-permission android:name="android.permission.INTERNET"/>
|
<uses-permission android:name="android.permission.INTERNET"/>
|
||||||
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
|
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
|
||||||
|
|||||||
@@ -63,7 +63,7 @@ class ShadowsocksVpnService extends VpnService with BaseService {
|
|||||||
|
|
||||||
private lazy val application = getApplication.asInstanceOf[ShadowsocksApplication]
|
private lazy val application = getApplication.asInstanceOf[ShadowsocksApplication]
|
||||||
val TAG = "ShadowsocksVpnService"
|
val TAG = "ShadowsocksVpnService"
|
||||||
val VPN_MTU = 1400
|
val VPN_MTU = 1500
|
||||||
val PRIVATE_VLAN = "26.26.26.%s"
|
val PRIVATE_VLAN = "26.26.26.%s"
|
||||||
var conn: ParcelFileDescriptor = null
|
var conn: ParcelFileDescriptor = null
|
||||||
var notificationManager: NotificationManager = null
|
var notificationManager: NotificationManager = null
|
||||||
@@ -103,11 +103,6 @@ class ShadowsocksVpnService extends VpnService with BaseService {
|
|||||||
null
|
null
|
||||||
}
|
}
|
||||||
|
|
||||||
override def onDestroy() {
|
|
||||||
super.onDestroy()
|
|
||||||
if (vpnThread != null) vpnThread.stopThread()
|
|
||||||
}
|
|
||||||
|
|
||||||
override def onCreate() {
|
override def onCreate() {
|
||||||
super.onCreate()
|
super.onCreate()
|
||||||
|
|
||||||
@@ -115,9 +110,6 @@ class ShadowsocksVpnService extends VpnService with BaseService {
|
|||||||
|
|
||||||
notificationManager = getSystemService(Context.NOTIFICATION_SERVICE)
|
notificationManager = getSystemService(Context.NOTIFICATION_SERVICE)
|
||||||
.asInstanceOf[NotificationManager]
|
.asInstanceOf[NotificationManager]
|
||||||
|
|
||||||
vpnThread = new ShadowsocksVpnThread(this)
|
|
||||||
vpnThread.start()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
override def onRevoke() {
|
override def onRevoke() {
|
||||||
@@ -126,6 +118,11 @@ class ShadowsocksVpnService extends VpnService with BaseService {
|
|||||||
|
|
||||||
override def stopRunner() {
|
override def stopRunner() {
|
||||||
|
|
||||||
|
if (vpnThread != null) {
|
||||||
|
vpnThread.stopThread()
|
||||||
|
vpnThread = null
|
||||||
|
}
|
||||||
|
|
||||||
// channge the state
|
// channge the state
|
||||||
changeState(State.STOPPING)
|
changeState(State.STOPPING)
|
||||||
|
|
||||||
@@ -185,6 +182,14 @@ class ShadowsocksVpnService extends VpnService with BaseService {
|
|||||||
|
|
||||||
override def startRunner(c: Config) {
|
override def startRunner(c: Config) {
|
||||||
|
|
||||||
|
if (vpnThread != null) {
|
||||||
|
vpnThread.stopThread()
|
||||||
|
vpnThread = null
|
||||||
|
}
|
||||||
|
|
||||||
|
vpnThread = new ShadowsocksVpnThread(this)
|
||||||
|
vpnThread.start()
|
||||||
|
|
||||||
config = c
|
config = c
|
||||||
|
|
||||||
// ensure the VPNService is prepared
|
// ensure the VPNService is prepared
|
||||||
|
|||||||
@@ -45,43 +45,38 @@ import java.util.concurrent.Executors
|
|||||||
import android.net.{LocalServerSocket, LocalSocket, LocalSocketAddress}
|
import android.net.{LocalServerSocket, LocalSocket, LocalSocketAddress}
|
||||||
import android.util.Log
|
import android.util.Log
|
||||||
|
|
||||||
|
object ShadowsocksVpn {
|
||||||
|
@volatile var serverSocket: LocalServerSocket = null
|
||||||
|
}
|
||||||
|
|
||||||
class ShadowsocksVpnThread(vpnService: ShadowsocksVpnService) extends Thread {
|
class ShadowsocksVpnThread(vpnService: ShadowsocksVpnService) extends Thread {
|
||||||
|
|
||||||
val TAG = "ShadowsocksVpnService"
|
val TAG = "ShadowsocksVpnService"
|
||||||
val PATH = "shadowsocks_protect"
|
val PATH = "shadowsocks_protect"
|
||||||
|
|
||||||
var isRunning: Boolean = true
|
var isRunning: Boolean = true
|
||||||
var serverSocket: LocalServerSocket = null
|
|
||||||
|
|
||||||
def stopThread() {
|
def stopThread() {
|
||||||
isRunning = false
|
isRunning = false
|
||||||
if (serverSocket != null) {
|
|
||||||
serverSocket.close()
|
|
||||||
serverSocket = null
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
override def run(): Unit = {
|
override def run(): Unit = {
|
||||||
|
|
||||||
try {
|
try {
|
||||||
if (serverSocket != null) {
|
if (ShadowsocksVpn.serverSocket == null) {
|
||||||
serverSocket.close()
|
ShadowsocksVpn.serverSocket = new LocalServerSocket(PATH)
|
||||||
serverSocket = null
|
|
||||||
}
|
}
|
||||||
serverSocket = new LocalServerSocket(PATH)
|
|
||||||
} catch {
|
} catch {
|
||||||
case e: IOException =>
|
case e: IOException =>
|
||||||
Log.e(TAG, "unable to bind", e)
|
Log.e(TAG, "unable to bind", e)
|
||||||
vpnService.stopBackgroundService()
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
val pool = Executors.newFixedThreadPool(4)
|
val pool = Executors.newFixedThreadPool(4)
|
||||||
|
|
||||||
while (isRunning) {
|
while (isRunning) {
|
||||||
|
|
||||||
try {
|
try {
|
||||||
val socket = serverSocket.accept()
|
val socket = ShadowsocksVpn.serverSocket.accept()
|
||||||
|
|
||||||
pool.execute(new Runnable {
|
pool.execute(new Runnable {
|
||||||
override def run() {
|
override def run() {
|
||||||
@@ -126,7 +121,10 @@ class ShadowsocksVpnThread(vpnService: ShadowsocksVpnService) extends Thread {
|
|||||||
|
|
||||||
}})
|
}})
|
||||||
} catch {
|
} catch {
|
||||||
case e: IOException => Log.e(TAG, "Error when accept socket", e)
|
case e: IOException => {
|
||||||
|
Log.e(TAG, "Error when accept socket", e)
|
||||||
|
return
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user