diff --git a/src/main/scala/com/github/shadowsocks/Shadowsocks.scala b/src/main/scala/com/github/shadowsocks/Shadowsocks.scala index d652c121..326d90cd 100644 --- a/src/main/scala/com/github/shadowsocks/Shadowsocks.scala +++ b/src/main/scala/com/github/shadowsocks/Shadowsocks.scala @@ -63,9 +63,7 @@ import com.github.shadowsocks.database._ import com.github.shadowsocks.utils.CloseUtils._ import com.github.shadowsocks.utils._ import com.google.android.gms.ads.{AdRequest, AdSize, AdView} -import eu.chainfire.libsuperuser.Shell -import scala.collection.mutable.ArrayBuffer import scala.util.Random object Typefaces { @@ -189,8 +187,8 @@ class Shadowsocks extends AppCompatActivity with ServiceBoundContext { } override def binderDied { - detachService - crashRecovery + detachService() + app.crashRecovery() attachService } @@ -228,23 +226,6 @@ class Shadowsocks extends AppCompatActivity with ServiceBoundContext { } } - def crashRecovery() { - val cmd = new ArrayBuffer[String]() - - for (task <- Array("ss-local", "ss-tunnel", "pdnsd", "redsocks", "tun2socks", "kcptun")) { - cmd.append("killall %s".formatLocal(Locale.ENGLISH, task)) - cmd.append("rm -f %1$s/%2$s-nat.conf %1$s/%2$s-vpn.conf" - .formatLocal(Locale.ENGLISH, getApplicationInfo.dataDir, task)) - } - if (app.isNatEnabled) { - cmd.append("iptables -t nat -F OUTPUT") - cmd.append("echo done") - val result = Shell.SU.run(cmd.toArray) - if (result != null && !result.isEmpty) return // fallback to SH - } - Shell.SH.run(cmd.toArray) - } - def cancelStart() { clearDialog() changeSwitch(checked = false) @@ -463,17 +444,11 @@ class Shadowsocks extends AppCompatActivity with ServiceBoundContext { handler.removeCallbacksAndMessages(null) } - def reset() { - crashRecovery() - - app.copyAssets() - } - def recovery() { if (serviceStarted) serviceStop() val h = showProgress(R.string.recovering) Utils.ThrowableFuture { - reset() + app.copyAssets() h.sendEmptyMessage(0) } } diff --git a/src/main/scala/com/github/shadowsocks/ShadowsocksApplication.scala b/src/main/scala/com/github/shadowsocks/ShadowsocksApplication.scala index cc0bd613..066eb684 100644 --- a/src/main/scala/com/github/shadowsocks/ShadowsocksApplication.scala +++ b/src/main/scala/com/github/shadowsocks/ShadowsocksApplication.scala @@ -62,6 +62,8 @@ import com.google.android.gms.tagmanager.{ContainerHolder, TagManager} import com.j256.ormlite.logger.LocalLog import eu.chainfire.libsuperuser.Shell +import scala.collection.mutable.ArrayBuffer + object ShadowsocksApplication { var app: ShadowsocksApplication = _ @@ -207,7 +209,25 @@ class ShadowsocksApplication extends Application { IOUtils.copy(in, out))) } + def crashRecovery() { + val cmd = new ArrayBuffer[String]() + + for (task <- Array("ss-local", "ss-tunnel", "pdnsd", "redsocks", "tun2socks", "kcptun")) { + cmd.append("killall %s".formatLocal(Locale.ENGLISH, task)) + cmd.append("rm -f %1$s/%2$s-nat.conf %1$s/%2$s-vpn.conf" + .formatLocal(Locale.ENGLISH, getApplicationInfo.dataDir, task)) + } + if (app.isNatEnabled) { + cmd.append("iptables -t nat -F OUTPUT") + cmd.append("echo done") + val result = Shell.SU.run(cmd.toArray) + if (result != null && !result.isEmpty) return // fallback to SH + } + Shell.SH.run(cmd.toArray) + } + def copyAssets() { + crashRecovery() // ensure executables are killed before writing to them copyAssets(System.getABI) copyAssets("acl") Shell.SH.run(EXECUTABLES.map("chmod 755 " + getApplicationInfo.dataDir + '/' + _))