Recover unexpected process exit on MIUI
This commit is contained in:
@@ -196,10 +196,7 @@ class ShadowsocksNatService extends BaseService {
|
||||
}
|
||||
|
||||
if (BuildConfig.DEBUG) Log.d(TAG, cmd.mkString(" "))
|
||||
sslocalProcess = new ProcessBuilder()
|
||||
.command(cmd)
|
||||
.redirectErrorStream(true)
|
||||
.start()
|
||||
sslocalProcess = new GuardedProcess(cmd)
|
||||
}
|
||||
|
||||
def startTunnel() {
|
||||
@@ -225,10 +222,7 @@ class ShadowsocksNatService extends BaseService {
|
||||
|
||||
if (BuildConfig.DEBUG) Log.d(TAG, cmd.mkString(" "))
|
||||
|
||||
sstunnelProcess = new ProcessBuilder()
|
||||
.command(cmd)
|
||||
.redirectErrorStream(true)
|
||||
.start()
|
||||
sstunnelProcess = new GuardedProcess(cmd)
|
||||
|
||||
} else {
|
||||
val conf = ConfigUtils
|
||||
@@ -251,10 +245,7 @@ class ShadowsocksNatService extends BaseService {
|
||||
|
||||
if (BuildConfig.DEBUG) Log.d(TAG, cmdBuf.mkString(" "))
|
||||
|
||||
sstunnelProcess = new ProcessBuilder()
|
||||
.command(cmdBuf)
|
||||
.redirectErrorStream(true)
|
||||
.start()
|
||||
sstunnelProcess = new GuardedProcess(cmdBuf)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -277,10 +268,7 @@ class ShadowsocksNatService extends BaseService {
|
||||
|
||||
if (BuildConfig.DEBUG) Log.d(TAG, cmd)
|
||||
|
||||
pdnsdProcess = new ProcessBuilder()
|
||||
.command(cmd.split(" ").toSeq)
|
||||
.redirectErrorStream(true)
|
||||
.start()
|
||||
pdnsdProcess = new GuardedProcess(cmd.split(" ").toSeq)
|
||||
}
|
||||
|
||||
def getVersionName: String = {
|
||||
@@ -304,10 +292,7 @@ class ShadowsocksNatService extends BaseService {
|
||||
})
|
||||
|
||||
if (BuildConfig.DEBUG) Log.d(TAG, cmd)
|
||||
redsocksProcess = new ProcessBuilder()
|
||||
.command(cmd.split(" ").toSeq)
|
||||
.redirectErrorStream(true)
|
||||
.start()
|
||||
redsocksProcess = new GuardedProcess(cmd.split(" ").toSeq)
|
||||
}
|
||||
|
||||
/** Called when the activity is first created. */
|
||||
|
||||
@@ -256,18 +256,7 @@ class ShadowsocksVpnService extends VpnService with BaseService {
|
||||
}
|
||||
|
||||
val fd = startVpn()
|
||||
|
||||
if (fd != -1) {
|
||||
var tries = 1
|
||||
while (tries < 5) {
|
||||
Thread.sleep(1000 * tries)
|
||||
if (System.sendfd(fd, getApplicationInfo.dataDir + "/sock_path") != -1) {
|
||||
return true
|
||||
}
|
||||
tries += 1
|
||||
}
|
||||
}
|
||||
false
|
||||
sendFd(fd)
|
||||
}
|
||||
|
||||
def startShadowsocksDaemon() {
|
||||
@@ -307,10 +296,7 @@ class ShadowsocksVpnService extends VpnService with BaseService {
|
||||
|
||||
if (BuildConfig.DEBUG) Log.d(TAG, cmd.mkString(" "))
|
||||
|
||||
sslocalProcess = new ProcessBuilder()
|
||||
.command(cmd)
|
||||
.redirectErrorStream(true)
|
||||
.start()
|
||||
sslocalProcess = new GuardedProcess(cmd)
|
||||
}
|
||||
|
||||
def startDnsTunnel() = {
|
||||
@@ -335,10 +321,7 @@ class ShadowsocksVpnService extends VpnService with BaseService {
|
||||
|
||||
if (BuildConfig.DEBUG) Log.d(TAG, cmd.mkString(" "))
|
||||
|
||||
sstunnelProcess = new ProcessBuilder()
|
||||
.command(cmd)
|
||||
.redirectErrorStream(true)
|
||||
.start()
|
||||
sstunnelProcess = new GuardedProcess(cmd)
|
||||
}
|
||||
|
||||
def startDnsDaemon() {
|
||||
@@ -361,10 +344,7 @@ class ShadowsocksVpnService extends VpnService with BaseService {
|
||||
|
||||
if (BuildConfig.DEBUG) Log.d(TAG, cmd)
|
||||
|
||||
pdnsdProcess = new ProcessBuilder()
|
||||
.command(cmd.split(" ").toSeq)
|
||||
.redirectErrorStream(true)
|
||||
.start()
|
||||
pdnsdProcess = new GuardedProcess(cmd.split(" ").toSeq)
|
||||
}
|
||||
|
||||
override def getContext = getBaseContext
|
||||
@@ -454,14 +434,29 @@ class ShadowsocksVpnService extends VpnService with BaseService {
|
||||
|
||||
if (BuildConfig.DEBUG) Log.d(TAG, cmd)
|
||||
|
||||
tun2socksProcess = new ProcessBuilder()
|
||||
.command(cmd.split(" ").toSeq)
|
||||
.redirectErrorStream(true)
|
||||
.start()
|
||||
tun2socksProcess = new GuardedProcess(cmd.split(" ").toSeq, new Runnable {
|
||||
override def run(): Unit = {
|
||||
sendFd(fd)
|
||||
}
|
||||
})
|
||||
|
||||
fd
|
||||
}
|
||||
|
||||
def sendFd(fd: Int): Boolean = {
|
||||
if (fd != -1) {
|
||||
var tries = 1
|
||||
while (tries < 5) {
|
||||
Thread.sleep(1000 * tries)
|
||||
if (System.sendfd(fd, getApplicationInfo.dataDir + "/sock_path") != -1) {
|
||||
return true
|
||||
}
|
||||
tries += 1
|
||||
}
|
||||
}
|
||||
false
|
||||
}
|
||||
|
||||
override def getTag = TAG
|
||||
|
||||
override def getServiceMode = Mode.VPN
|
||||
|
||||
Reference in New Issue
Block a user