Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
4817539ca2 | ||
|
|
03c857536d | ||
|
|
14038cd152 | ||
|
|
935314a1c5 | ||
|
|
7263bf11a4 | ||
|
|
e766ae2244 | ||
|
|
f3ed157145 | ||
|
|
eb0d5ceccc | ||
|
|
2ffbf4c56f | ||
|
|
9ee3bab7e0 | ||
|
|
70a7317a1e | ||
|
|
43caaa684f | ||
|
|
586c5e2ae4 | ||
|
|
416d93062f | ||
|
|
66ceed8607 |
+1
-2
@@ -14,6 +14,7 @@ gen_*
|
|||||||
*.class
|
*.class
|
||||||
*.o
|
*.o
|
||||||
local.sbt
|
local.sbt
|
||||||
|
.deps
|
||||||
|
|
||||||
#Intellij IDEA
|
#Intellij IDEA
|
||||||
*.iml
|
*.iml
|
||||||
@@ -27,7 +28,5 @@ out/
|
|||||||
src/main/obj
|
src/main/obj
|
||||||
src/main/libs
|
src/main/libs
|
||||||
src/main/assets/armeabi-v7a/*
|
src/main/assets/armeabi-v7a/*
|
||||||
!src/main/assets/armeabi-v7a/kcptun
|
|
||||||
src/main/assets/x86/*
|
src/main/assets/x86/*
|
||||||
!src/main/assets/x86/kcptun
|
|
||||||
jni/Application.mk
|
jni/Application.mk
|
||||||
|
|||||||
@@ -24,3 +24,9 @@
|
|||||||
path = src/main/jni/pdnsd
|
path = src/main/jni/pdnsd
|
||||||
url = https://github.com/shadowsocks/pdnsd.git
|
url = https://github.com/shadowsocks/pdnsd.git
|
||||||
branch = shadowsocks-android
|
branch = shadowsocks-android
|
||||||
|
[submodule "kcptun/kcptun"]
|
||||||
|
path = kcptun/kcptun
|
||||||
|
url = https://github.com/shadowsocks/kcptun
|
||||||
|
[submodule "kcptun/go"]
|
||||||
|
path = kcptun/go
|
||||||
|
url = https://github.com/shadowsocks/go
|
||||||
|
|||||||
@@ -31,6 +31,7 @@ install:
|
|||||||
- ./travis-ci/setup.sh
|
- ./travis-ci/setup.sh
|
||||||
- export NDK_CCACHE=ccache
|
- export NDK_CCACHE=ccache
|
||||||
- export ARCH=`uname -m`
|
- export ARCH=`uname -m`
|
||||||
|
- export GOROOT_BOOTSTRAP=$HOME/.android/go
|
||||||
- export ANDROID_NDK_HOME=$HOME/.android/android-ndk-r12b
|
- export ANDROID_NDK_HOME=$HOME/.android/android-ndk-r12b
|
||||||
- export ANDROID_HOME=$HOME/.android/android-sdk-linux
|
- export ANDROID_HOME=$HOME/.android/android-sdk-linux
|
||||||
- export PATH=${ANDROID_NDK_HOME}:${ANDROID_HOME}/tools:${ANDROID_HOME}/platform-tools:${PATH}
|
- export PATH=${ANDROID_NDK_HOME}:${ANDROID_HOME}/tools:${ANDROID_HOME}/platform-tools:${PATH}
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ A [shadowsocks](http://shadowsocks.org) client for Android, written in Scala.
|
|||||||
|
|
||||||
* JDK 1.8
|
* JDK 1.8
|
||||||
* SBT 0.13.0+
|
* SBT 0.13.0+
|
||||||
|
* GO 1.4+
|
||||||
* Android SDK r25+
|
* Android SDK r25+
|
||||||
* Android NDK r12b+
|
* Android NDK r12b+
|
||||||
|
|
||||||
@@ -19,6 +20,7 @@ A [shadowsocks](http://shadowsocks.org) client for Android, written in Scala.
|
|||||||
|
|
||||||
* Set environment variable `ANDROID_HOME` to `/path/to/android-sdk`
|
* Set environment variable `ANDROID_HOME` to `/path/to/android-sdk`
|
||||||
* Set environment variable `ANDROID_NDK_HOME` to `/path/to/android-ndk`
|
* Set environment variable `ANDROID_NDK_HOME` to `/path/to/android-ndk`
|
||||||
|
* Set environment variable `GOROOT_BOOTSTRAP` to `/path/to/go`
|
||||||
* Create your key following the instructions at https://developer.android.com/studio/publish/app-signing.html
|
* Create your key following the instructions at https://developer.android.com/studio/publish/app-signing.html
|
||||||
* Put your key in ~/.keystore
|
* Put your key in ~/.keystore
|
||||||
* Create `local.properties` from `local.properties.example` with your own key information
|
* Create `local.properties` from `local.properties.example` with your own key information
|
||||||
@@ -26,33 +28,11 @@ A [shadowsocks](http://shadowsocks.org) client for Android, written in Scala.
|
|||||||
|
|
||||||
```bash
|
```bash
|
||||||
git submodule update --init
|
git submodule update --init
|
||||||
|
|
||||||
# Build the App
|
# Build the App
|
||||||
sbt native-build clean android:package-release
|
sbt native-build clean android:package-release
|
||||||
```
|
```
|
||||||
|
|
||||||
#### BUILD on Mac OS X (with HomeBrew)
|
|
||||||
|
|
||||||
* Install Android SDK and NDK by run `brew install android-ndk android-sdk`
|
|
||||||
* Add `export ANDROID_HOME=/usr/local/Cellar/android-sdk/$version` to your .bashrc , then reopen the shell to load it.
|
|
||||||
* Add `export ANDROID_NDK_HOME=/usr/local/Cellar/android-ndk/$version` to your .bashrc , then reopen the shell to load it.
|
|
||||||
* echo "y" | android update sdk --filter tools,platform-tools,build-tools-23.0.2,android-23,extra-google-m2repository --no-ui -a
|
|
||||||
* echo "y" | android update sdk --filter extra-android-m2repository --no-ui --no-https -a
|
|
||||||
* Create your key following the instructions at http://developer.android.com/guide/publishing/app-signing.html#cert
|
|
||||||
* Put your key in ~/.keystore
|
|
||||||
* Create `local.properties` from `local.properties.example` with your own key information .
|
|
||||||
* Invoke the building like this
|
|
||||||
|
|
||||||
```bash
|
|
||||||
git submodule update --init
|
|
||||||
|
|
||||||
# Build native binaries
|
|
||||||
./build.sh
|
|
||||||
|
|
||||||
# Build the apk
|
|
||||||
sbt clean android:package-release
|
|
||||||
```
|
|
||||||
|
|
||||||
## OPEN SOURCE LICENSES
|
## OPEN SOURCE LICENSES
|
||||||
|
|
||||||
* shadowsocks-libev: [GPLv3](https://github.com/shadowsocks/shadowsocks-libev/blob/master/LICENSE)
|
* shadowsocks-libev: [GPLv3](https://github.com/shadowsocks/shadowsocks-libev/blob/master/LICENSE)
|
||||||
@@ -62,6 +42,7 @@ A [shadowsocks](http://shadowsocks.org) client for Android, written in Scala.
|
|||||||
* pdnsd: [GPLv3](https://github.com/shadowsocks/shadowsocks-android/blob/master/src/main/jni/pdnsd/COPYING)
|
* pdnsd: [GPLv3](https://github.com/shadowsocks/shadowsocks-android/blob/master/src/main/jni/pdnsd/COPYING)
|
||||||
* libev: [GPLv2](https://github.com/shadowsocks/shadowsocks-android/blob/master/src/main/jni/libev/LICENSE)
|
* libev: [GPLv2](https://github.com/shadowsocks/shadowsocks-android/blob/master/src/main/jni/libev/LICENSE)
|
||||||
* libevent: [BSD](https://github.com/shadowsocks/libevent/blob/master/LICENSE)
|
* libevent: [BSD](https://github.com/shadowsocks/libevent/blob/master/LICENSE)
|
||||||
|
* kcptun: [MIT](https://github.com/xtaci/kcptun)
|
||||||
|
|
||||||
### LICENSE
|
### LICENSE
|
||||||
|
|
||||||
|
|||||||
@@ -4,19 +4,25 @@ function try () {
|
|||||||
"$@" || exit -1
|
"$@" || exit -1
|
||||||
}
|
}
|
||||||
|
|
||||||
try pushd src/main
|
# Build native binaries
|
||||||
|
pushd src/main
|
||||||
# Build
|
|
||||||
#try $ANDROID_NDK_HOME/ndk-build clean
|
|
||||||
try $ANDROID_NDK_HOME/ndk-build -j8
|
try $ANDROID_NDK_HOME/ndk-build -j8
|
||||||
|
|
||||||
# copy executables
|
rm -rf assets/armeabi-v7a
|
||||||
|
rm -rf assets/x86
|
||||||
|
mkdir -p assets/armeabi-v7a
|
||||||
|
mkdir -p assets/x86
|
||||||
|
|
||||||
|
#copy executables
|
||||||
for app in pdnsd redsocks ss-local ss-tunnel tun2socks
|
for app in pdnsd redsocks ss-local ss-tunnel tun2socks
|
||||||
do
|
do
|
||||||
rm -f assets/armeabi-v7a/$app
|
echo $app
|
||||||
rm -f assets/x86/$app
|
|
||||||
try mv libs/armeabi-v7a/$app assets/armeabi-v7a/
|
try mv libs/armeabi-v7a/$app assets/armeabi-v7a/
|
||||||
try mv libs/x86/$app assets/x86/
|
try mv libs/x86/$app assets/x86/
|
||||||
done
|
done
|
||||||
|
popd
|
||||||
|
|
||||||
try popd
|
# Build kcptun
|
||||||
|
pushd kcptun
|
||||||
|
try ./make.bash
|
||||||
|
popd
|
||||||
|
|||||||
Submodule
+1
Submodule kcptun/go added at f3e7e7b69f
Submodule
+1
Submodule kcptun/kcptun added at eced3949b2
Executable
+65
@@ -0,0 +1,65 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
function try () {
|
||||||
|
"$@" || exit -1
|
||||||
|
}
|
||||||
|
|
||||||
|
[ -z "$ANDROID_NDK_HOME" ] && ANDROID_NDK_HOME=~/android-ndk-r12b
|
||||||
|
|
||||||
|
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
|
||||||
|
DEPS=$DIR/.deps
|
||||||
|
ANDROID_ARM_TOOLCHAIN=$DEPS/android-toolchain-16-arm
|
||||||
|
ANDROID_X86_TOOLCHAIN=$DEPS/android-toolchain-16-x86
|
||||||
|
|
||||||
|
ANDROID_ARM_CC=$ANDROID_ARM_TOOLCHAIN/bin/arm-linux-androideabi-gcc
|
||||||
|
ANDROID_ARM_STRIP=$ANDROID_ARM_TOOLCHAIN/bin/arm-linux-androideabi-strip
|
||||||
|
|
||||||
|
ANDROID_X86_CC=$ANDROID_X86_TOOLCHAIN/bin/i686-linux-android-gcc
|
||||||
|
ANDROID_X86_STRIP=$ANDROID_X86_TOOLCHAIN/bin/i686-linux-android-strip
|
||||||
|
|
||||||
|
|
||||||
|
if [ ! -d "$DEPS" ]; then
|
||||||
|
mkdir -p $DEPS
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ ! -d "$ANDROID_ARM_TOOLCHAIN" ]; then
|
||||||
|
echo "Make standalone toolchain for ARM arch"
|
||||||
|
$ANDROID_NDK_HOME/build/tools/make_standalone_toolchain.py --arch arm \
|
||||||
|
--api 16 --install-dir $ANDROID_ARM_TOOLCHAIN
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ ! -d "$ANDROID_X86_TOOLCHAIN" ]; then
|
||||||
|
echo "Make standalone toolchain for X86 arch"
|
||||||
|
$ANDROID_NDK_HOME/build/tools/make_standalone_toolchain.py --arch x86 \
|
||||||
|
--api 16 --install-dir $ANDROID_X86_TOOLCHAIN
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ ! -d "$DIR/go/bin" ]; then
|
||||||
|
echo "Build the custom go"
|
||||||
|
|
||||||
|
pushd $DIR/go/src
|
||||||
|
try ./make.bash
|
||||||
|
popd
|
||||||
|
fi
|
||||||
|
|
||||||
|
export GOROOT=$DIR/go
|
||||||
|
export GOPATH=$DEPS
|
||||||
|
export PATH=$GOROOT/bin:$PATH
|
||||||
|
|
||||||
|
pushd kcptun/client
|
||||||
|
|
||||||
|
echo "Get dependences for kcptun"
|
||||||
|
go get
|
||||||
|
|
||||||
|
echo "Cross compile kcptun for arm"
|
||||||
|
try env CGO_ENABLED=1 CC=$ANDROID_ARM_CC GOOS=android GOARCH=arm GOARM=7 go build
|
||||||
|
try $ANDROID_ARM_STRIP client
|
||||||
|
try mv client $DIR/../src/main/assets/armeabi-v7a/kcptun
|
||||||
|
|
||||||
|
echo "Cross compile kcptun for x86"
|
||||||
|
try env CGO_ENABLED=1 CC=$ANDROID_X86_CC GOOS=android GOARCH=386 go build
|
||||||
|
try $ANDROID_X86_STRIP client
|
||||||
|
try mv client $DIR/../src/main/assets/x86/kcptun
|
||||||
|
popd
|
||||||
|
|
||||||
|
echo "Successfully build kcptun"
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
xmlns:tools="http://schemas.android.com/tools" package="com.github.shadowsocks"
|
xmlns:tools="http://schemas.android.com/tools" package="com.github.shadowsocks"
|
||||||
android:versionCode="142"
|
android:versionCode="144"
|
||||||
android:versionName="3.0.0">
|
android:versionName="3.0.2">
|
||||||
|
|
||||||
<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"/>
|
||||||
|
|||||||
Binary file not shown.
@@ -296,6 +296,7 @@ along with this program. If not, see <a href="http://www.gnu.org/licenses/">http
|
|||||||
<li>pdnsd: <a href="https://github.com/shadowsocks/shadowsocks-android/blob/master/src/main/jni/pdnsd/COPYING">GPLv3</a></li>
|
<li>pdnsd: <a href="https://github.com/shadowsocks/shadowsocks-android/blob/master/src/main/jni/pdnsd/COPYING">GPLv3</a></li>
|
||||||
<li>libev: <a href="https://github.com/shadowsocks/libevent/blob/shadowsocks-android/LICENSE">GPLv2</a></li>
|
<li>libev: <a href="https://github.com/shadowsocks/libevent/blob/shadowsocks-android/LICENSE">GPLv2</a></li>
|
||||||
<li>libevent: <a href="https://github.com/shadowsocks/shadowsocks-android/blob/master/src/main/jni/libevent/LICENSE">BSD</a></li>
|
<li>libevent: <a href="https://github.com/shadowsocks/shadowsocks-android/blob/master/src/main/jni/libevent/LICENSE">BSD</a></li>
|
||||||
|
<li>kcptun: <a href="https://github.com/xtaci/kcptun/commits/master/LICENSE.md">MIT</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
</body>
|
</body>
|
||||||
|
|||||||
Binary file not shown.
@@ -43,10 +43,12 @@ import java.util.{Timer, TimerTask}
|
|||||||
|
|
||||||
import android.app.Service
|
import android.app.Service
|
||||||
import android.content.{BroadcastReceiver, Context, Intent, IntentFilter}
|
import android.content.{BroadcastReceiver, Context, Intent, IntentFilter}
|
||||||
|
import android.net.ConnectivityManager
|
||||||
import android.os.{Handler, RemoteCallbackList}
|
import android.os.{Handler, RemoteCallbackList}
|
||||||
import android.text.TextUtils
|
import android.text.TextUtils
|
||||||
import android.util.Log
|
import android.util.Log
|
||||||
import android.widget.Toast
|
import android.widget.Toast
|
||||||
|
|
||||||
import com.github.kevinsawicki.http.HttpRequest
|
import com.github.kevinsawicki.http.HttpRequest
|
||||||
import com.github.shadowsocks.aidl.{IShadowsocksService, IShadowsocksServiceCallback}
|
import com.github.shadowsocks.aidl.{IShadowsocksService, IShadowsocksServiceCallback}
|
||||||
import com.github.shadowsocks.utils._
|
import com.github.shadowsocks.utils._
|
||||||
@@ -71,6 +73,16 @@ trait BaseService extends Service {
|
|||||||
}
|
}
|
||||||
var closeReceiverRegistered: Boolean = _
|
var closeReceiverRegistered: Boolean = _
|
||||||
|
|
||||||
|
var kcptunProcess: GuardedProcess = _
|
||||||
|
private val networkReceiver: BroadcastReceiver = (context: Context, intent: Intent) => {
|
||||||
|
val cm = context.getSystemService(Context.CONNECTIVITY_SERVICE).asInstanceOf[ConnectivityManager]
|
||||||
|
val activeNetwork = cm.getActiveNetworkInfo()
|
||||||
|
val isConnected = activeNetwork != null && activeNetwork.isConnected()
|
||||||
|
|
||||||
|
if (isConnected && profile.kcp && kcptunProcess != null) kcptunProcess.restart()
|
||||||
|
}
|
||||||
|
var networkReceiverRegistered: Boolean = _
|
||||||
|
|
||||||
val binder = new IShadowsocksService.Stub {
|
val binder = new IShadowsocksService.Stub {
|
||||||
override def getState: Int = {
|
override def getState: Int = {
|
||||||
state
|
state
|
||||||
@@ -162,6 +174,14 @@ trait BaseService extends Service {
|
|||||||
closeReceiverRegistered = true
|
closeReceiverRegistered = true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (profile.kcp && !networkReceiverRegistered) {
|
||||||
|
// register network change receiver
|
||||||
|
val filter = new IntentFilter()
|
||||||
|
filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION)
|
||||||
|
registerReceiver(networkReceiver, filter)
|
||||||
|
networkReceiverRegistered = true
|
||||||
|
}
|
||||||
|
|
||||||
app.track(getClass.getSimpleName, "start")
|
app.track(getClass.getSimpleName, "start")
|
||||||
|
|
||||||
changeState(State.CONNECTING)
|
changeState(State.CONNECTING)
|
||||||
@@ -177,6 +197,10 @@ trait BaseService extends Service {
|
|||||||
unregisterReceiver(closeReceiver)
|
unregisterReceiver(closeReceiver)
|
||||||
closeReceiverRegistered = false
|
closeReceiverRegistered = false
|
||||||
}
|
}
|
||||||
|
if (networkReceiverRegistered) {
|
||||||
|
unregisterReceiver(networkReceiver)
|
||||||
|
networkReceiverRegistered = false
|
||||||
|
}
|
||||||
|
|
||||||
// Make sure update total traffic when stopping the runner
|
// Make sure update total traffic when stopping the runner
|
||||||
updateTrafficTotal(TrafficMonitor.txTotal, TrafficMonitor.rxTotal)
|
updateTrafficTotal(TrafficMonitor.txTotal, TrafficMonitor.rxTotal)
|
||||||
|
|||||||
@@ -56,6 +56,7 @@ class GuardedProcess(cmd: Seq[String]) extends Process {
|
|||||||
@volatile private var guardThread: Thread = _
|
@volatile private var guardThread: Thread = _
|
||||||
@volatile private var isDestroyed: Boolean = _
|
@volatile private var isDestroyed: Boolean = _
|
||||||
@volatile private var process: Process = _
|
@volatile private var process: Process = _
|
||||||
|
@volatile private var isRestart = false
|
||||||
|
|
||||||
def start(onRestartCallback: () => Unit = null): GuardedProcess = {
|
def start(onRestartCallback: () => Unit = null): GuardedProcess = {
|
||||||
val semaphore = new Semaphore(1)
|
val semaphore = new Semaphore(1)
|
||||||
@@ -76,9 +77,13 @@ class GuardedProcess(cmd: Seq[String]) extends Process {
|
|||||||
semaphore.release
|
semaphore.release
|
||||||
process.waitFor
|
process.waitFor
|
||||||
|
|
||||||
if (currentTimeMillis - startTime < 1000) {
|
if (isRestart) {
|
||||||
Log.w(TAG, "process exit too fast, stop guard: " + cmd)
|
isRestart = false
|
||||||
isDestroyed = true
|
} else {
|
||||||
|
if (currentTimeMillis - startTime < 1000) {
|
||||||
|
Log.w(TAG, "process exit too fast, stop guard: " + cmd)
|
||||||
|
isDestroyed = true
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} catch {
|
} catch {
|
||||||
@@ -108,6 +113,11 @@ class GuardedProcess(cmd: Seq[String]) extends Process {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
def restart() {
|
||||||
|
isRestart = true
|
||||||
|
process.destroy()
|
||||||
|
}
|
||||||
|
|
||||||
def exitValue: Int = throw new UnsupportedOperationException
|
def exitValue: Int = throw new UnsupportedOperationException
|
||||||
def getErrorStream: InputStream = throw new UnsupportedOperationException
|
def getErrorStream: InputStream = throw new UnsupportedOperationException
|
||||||
def getInputStream: InputStream = throw new UnsupportedOperationException
|
def getInputStream: InputStream = throw new UnsupportedOperationException
|
||||||
|
|||||||
@@ -481,7 +481,7 @@ class Shadowsocks extends AppCompatActivity with ServiceBoundContext {
|
|||||||
private def updatePreferenceScreen(profile: Profile) {
|
private def updatePreferenceScreen(profile: Profile) {
|
||||||
if (profile.host == "198.199.101.152") if (adView == null) {
|
if (profile.host == "198.199.101.152") if (adView == null) {
|
||||||
adView = new AdView(this)
|
adView = new AdView(this)
|
||||||
adView.setAdUnitId("ca-app-pub-9097031975646651/7760346322")
|
adView.setAdUnitId("ca-app-pub-4984938374218635/1433320509")
|
||||||
adView.setAdSize(AdSize.SMART_BANNER)
|
adView.setAdSize(AdSize.SMART_BANNER)
|
||||||
preferences.getView.asInstanceOf[ViewGroup].addView(adView, 1)
|
preferences.getView.asInstanceOf[ViewGroup].addView(adView, 1)
|
||||||
adView.loadAd(new AdRequest.Builder().build())
|
adView.loadAd(new AdRequest.Builder().build())
|
||||||
|
|||||||
@@ -65,7 +65,6 @@ class ShadowsocksNatService extends BaseService {
|
|||||||
private var notification: ShadowsocksNotification = _
|
private var notification: ShadowsocksNotification = _
|
||||||
val myUid = android.os.Process.myUid()
|
val myUid = android.os.Process.myUid()
|
||||||
|
|
||||||
var kcptunProcess: Process = _
|
|
||||||
var sslocalProcess: Process = _
|
var sslocalProcess: Process = _
|
||||||
var sstunnelProcess: Process = _
|
var sstunnelProcess: Process = _
|
||||||
var redsocksProcess: Process = _
|
var redsocksProcess: Process = _
|
||||||
|
|||||||
@@ -63,7 +63,6 @@ class ShadowsocksVpnService extends VpnService with BaseService {
|
|||||||
var vpnThread: ShadowsocksVpnThread = _
|
var vpnThread: ShadowsocksVpnThread = _
|
||||||
private var notification: ShadowsocksNotification = _
|
private var notification: ShadowsocksNotification = _
|
||||||
|
|
||||||
var kcptunProcess: Process = _
|
|
||||||
var sslocalProcess: Process = _
|
var sslocalProcess: Process = _
|
||||||
var sstunnelProcess: Process = _
|
var sstunnelProcess: Process = _
|
||||||
var pdnsdProcess: Process = _
|
var pdnsdProcess: Process = _
|
||||||
@@ -183,25 +182,25 @@ class ShadowsocksVpnService extends VpnService with BaseService {
|
|||||||
/** Called when the activity is first created. */
|
/** Called when the activity is first created. */
|
||||||
def handleConnection: Boolean = {
|
def handleConnection: Boolean = {
|
||||||
|
|
||||||
|
val fd = startVpn()
|
||||||
|
if (!sendFd(fd)) return false
|
||||||
|
|
||||||
|
if (profile.kcp) {
|
||||||
|
startKcptunDaemon()
|
||||||
|
}
|
||||||
|
|
||||||
|
startShadowsocksDaemon()
|
||||||
|
|
||||||
|
if (profile.udpdns && profile.kcp) {
|
||||||
|
startShadowsocksUDPDaemon()
|
||||||
|
}
|
||||||
|
|
||||||
if (!profile.udpdns) {
|
if (!profile.udpdns) {
|
||||||
startDnsDaemon()
|
startDnsDaemon()
|
||||||
startDnsTunnel()
|
startDnsTunnel()
|
||||||
}
|
}
|
||||||
|
|
||||||
startShadowsocksDaemon()
|
true
|
||||||
|
|
||||||
if (profile.udpdns) {
|
|
||||||
startShadowsocksUDPDaemon()
|
|
||||||
}
|
|
||||||
|
|
||||||
val fd = startVpn()
|
|
||||||
val ret = sendFd(fd)
|
|
||||||
|
|
||||||
if (ret && profile.kcp) {
|
|
||||||
startKcptunDaemon()
|
|
||||||
}
|
|
||||||
|
|
||||||
ret
|
|
||||||
}
|
}
|
||||||
|
|
||||||
def startKcptunDaemon() {
|
def startKcptunDaemon() {
|
||||||
@@ -275,6 +274,8 @@ class ShadowsocksVpnService extends VpnService with BaseService {
|
|||||||
|
|
||||||
if (profile.auth) cmd += "-A"
|
if (profile.auth) cmd += "-A"
|
||||||
|
|
||||||
|
if (profile.udpdns && !profile.kcp) cmd += "-u"
|
||||||
|
|
||||||
if (profile.route != Route.ALL) {
|
if (profile.route != Route.ALL) {
|
||||||
cmd += "--acl"
|
cmd += "--acl"
|
||||||
cmd += (getApplicationInfo.dataDir + "/acl.list")
|
cmd += (getApplicationInfo.dataDir + "/acl.list")
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
export ARCH=`uname -m`
|
export ARCH=`uname -m`
|
||||||
|
export GOROOT_BOOTSTRAP=$HOME/.android/go
|
||||||
export ANDROID_NDK_HOME=$HOME/.android/android-ndk-r12b
|
export ANDROID_NDK_HOME=$HOME/.android/android-ndk-r12b
|
||||||
export ANDROID_HOME=$HOME/.android/android-sdk-linux
|
export ANDROID_HOME=$HOME/.android/android-sdk-linux
|
||||||
export PATH=${ANDROID_NDK_HOME}:${ANDROID_HOME}/tools:${ANDROID_HOME}/platform-tools:${PATH}
|
export PATH=${ANDROID_NDK_HOME}:${ANDROID_HOME}/tools:${ANDROID_HOME}/platform-tools:${PATH}
|
||||||
@@ -21,5 +22,13 @@ if [ ! -d "$ANDROID_NDK_HOME" ]; then
|
|||||||
popd
|
popd
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
if [ ! -d "$GOROOT_BOOTSTRAP" ]; then
|
||||||
|
mkdir -p $GOROOT_BOOTSTRAP
|
||||||
|
pushd $HOME/.android
|
||||||
|
wget https://storage.googleapis.com/golang/go1.6.3.linux-amd64.tar.gz
|
||||||
|
tar xf go1.6.3.linux-amd64.tar.gz
|
||||||
|
popd
|
||||||
|
fi
|
||||||
|
|
||||||
( sleep 5 && while [ 1 ]; do sleep 1; echo y; done ) | android update sdk --filter tools,platform-tools,build-tools-24.0.0,android-23,android-24,extra-google-m2repository --no-ui -a
|
( sleep 5 && while [ 1 ]; do sleep 1; echo y; done ) | android update sdk --filter tools,platform-tools,build-tools-24.0.0,android-23,android-24,extra-google-m2repository --no-ui -a
|
||||||
( sleep 5 && while [ 1 ]; do sleep 1; echo y; done ) | android update sdk --filter extra-android-m2repository --no-ui -a
|
( sleep 5 && while [ 1 ]; do sleep 1; echo y; done ) | android update sdk --filter extra-android-m2repository --no-ui -a
|
||||||
|
|||||||
Reference in New Issue
Block a user