From 8657ef87f47050e0203b49218f02e26d1fd0c11e Mon Sep 17 00:00:00 2001 From: Mygod Date: Fri, 11 Mar 2016 20:39:01 +0800 Subject: [PATCH] Crash recovery for NAT mode Bugfix: when NAT process is killed, Internet access is gone. Reproduce with: adb shell killall com.github.shadowsocks:nat One circumstance it cannot recover from is when updating to a new version, where both processes are killed at the same time. But a reset will be executed when the new version is launched. --- .../scala/com/github/shadowsocks/Shadowsocks.scala | 12 ++++-------- .../shadowsocks/ShadowsocksDeathRecipient.scala | 1 + 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/src/main/scala/com/github/shadowsocks/Shadowsocks.scala b/src/main/scala/com/github/shadowsocks/Shadowsocks.scala index a7660d8a..39878af8 100644 --- a/src/main/scala/com/github/shadowsocks/Shadowsocks.scala +++ b/src/main/scala/com/github/shadowsocks/Shadowsocks.scala @@ -275,7 +275,7 @@ class Shadowsocks } } - private def crashRecovery() { + def crashRecovery() { val cmd = new ArrayBuffer[String]() for (task <- Array("ss-local", "ss-tunnel", "pdnsd", "redsocks", "tun2socks")) { @@ -477,7 +477,9 @@ class Shadowsocks handler.removeCallbacksAndMessages(null) } - def install() { + def reset() { + crashRecovery() + copyAssets(System.getABI) val ab = new ArrayBuffer[String] @@ -487,12 +489,6 @@ class Shadowsocks Console.runCommand(ab.toArray) } - def reset() { - crashRecovery() - - install() - } - def recovery() { serviceStop() val h = showProgress(R.string.recovering) diff --git a/src/main/scala/com/github/shadowsocks/ShadowsocksDeathRecipient.scala b/src/main/scala/com/github/shadowsocks/ShadowsocksDeathRecipient.scala index 1fddc083..5d3ab775 100644 --- a/src/main/scala/com/github/shadowsocks/ShadowsocksDeathRecipient.scala +++ b/src/main/scala/com/github/shadowsocks/ShadowsocksDeathRecipient.scala @@ -16,6 +16,7 @@ class ShadowsocksDeathRecipient(val mContext: ServiceBoundContext) mContext match { case ss: Shadowsocks => ss.deattachService + ss.crashRecovery ss.attachService case _ => }