diff --git a/.github/faq.md b/.github/faq.md
index 75726121..848e607b 100644
--- a/.github/faq.md
+++ b/.github/faq.md
@@ -29,7 +29,8 @@ The exclamation mark in the Wi-Fi/cellular icon appears because the system fails
1. Broken VPNService implementation, especially for IPv6;
2. Aggressive (or called broken) background service killing policy.
-Fixes for MIUI: [#772](https://github.com/shadowsocks/shadowsocks-android/issues/772)
+* Fixes for MIUI: [#772](https://github.com/shadowsocks/shadowsocks-android/issues/772)
+* Fixes for Huawei: [#1091 (comment)](https://github.com/shadowsocks/shadowsocks-android/issues/1091#issuecomment-276949836)
### How to pause Shadowsocks service?
diff --git a/.github/issue_template.md b/.github/issue_template.md
index d5edcba1..bc91020f 100644
--- a/.github/issue_template.md
+++ b/.github/issue_template.md
@@ -30,7 +30,7 @@ _Put an `x` inside the [ ] that applies._
* [ ] Per-App Proxy
* [ ] Bypass mode
* [ ] UDP Forwarding
-* KCP Parameters: (leave blank if not enabled)
+* Plugin configuration (if applicable):
* [ ] Auto Connect
* [ ] TCP Fast Open
* [ ] NAT mode
diff --git a/.gitignore b/.gitignore
index 5cdc29d1..ecec4bea 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,33 +1,11 @@
-classes
-bin
-gen
target
local.properties
-.classpath
-.project
-.settings
-tests/bin
-tests/gen
-tests/local.properties
-NUL
-gen_*
-*.class
-*.o
local.sbt
-.deps
/proguard-sbt.txt
#Intellij IDEA
-*.iml
-*.ipr
-*.iws
.idea/
-out/
.d
-#NDK
-src/main/obj
-src/main/libs
-src/main/assets/armeabi-v7a/*
-src/main/assets/x86/*
-jni/Application.mk
+mobile/src/main/libs
+mobile/src/main/obj
diff --git a/.gitmodules b/.gitmodules
index 713a88a5..c14024db 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -1,35 +1,39 @@
-[submodule "src/main/jni/shadowsocks-libev"]
- path = src/main/jni/shadowsocks-libev
+[submodule "mobile/src/main/jni/shadowsocks-libev"]
+ path = mobile/src/main/jni/shadowsocks-libev
url = https://github.com/shadowsocks/shadowsocks-libev
-[submodule "src/main/jni/badvpn"]
- path = src/main/jni/badvpn
+[submodule "mobile/src/main/jni/badvpn"]
+ path = mobile/src/main/jni/badvpn
url = https://github.com/shadowsocks/badvpn.git
branch = shadowsocks-android
-[submodule "src/main/jni/libancillary"]
- path = src/main/jni/libancillary
+[submodule "mobile/src/main/jni/libancillary"]
+ path = mobile/src/main/jni/libancillary
url = https://github.com/shadowsocks/libancillary.git
branch = shadowsocks-android
-[submodule "src/main/jni/libevent"]
- path = src/main/jni/libevent
+[submodule "mobile/src/main/jni/libevent"]
+ path = mobile/src/main/jni/libevent
url = https://github.com/shadowsocks/libevent.git
branch = shadowsocks-android
-[submodule "src/main/jni/redsocks"]
- path = src/main/jni/redsocks
+[submodule "mobile/src/main/jni/redsocks"]
+ path = mobile/src/main/jni/redsocks
url = https://github.com/shadowsocks/redsocks.git
branch = shadowsocks-android
-[submodule "src/main/jni/pdnsd"]
- path = src/main/jni/pdnsd
+[submodule "mobile/src/main/jni/pdnsd"]
+ path = mobile/src/main/jni/pdnsd
url = https://github.com/shadowsocks/pdnsd.git
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
-[submodule "src/main/jni/mbedtls"]
- path = src/main/jni/mbedtls
+[submodule "mobile/src/main/jni/mbedtls"]
+ path = mobile/src/main/jni/mbedtls
url = https://github.com/ARMmbed/mbedtls
-[submodule "src/main/jni/pcre"]
- path = src/main/jni/pcre
+[submodule "mobile/src/main/jni/pcre"]
+ path = mobile/src/main/jni/pcre
url = https://android.googlesource.com/platform/external/pcre
+[submodule "mobile/src/main/jni/libsodium"]
+ path = mobile/src/main/jni/libsodium
+ url = https://github.com/jedisct1/libsodium.git
+ branch = stable
+[submodule "mobile/src/main/jni/libev"]
+ path = mobile/src/main/jni/libev
+ url = https://github.com/shadowsocks/libev.git
+[submodule "mobile/src/main/jni/libudns"]
+ path = mobile/src/main/jni/libudns
+ url = https://github.com/shadowsocks/libudns.git
diff --git a/.travis.yml b/.travis.yml
index febc039b..62338c27 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -7,7 +7,6 @@ env:
global:
- NDK_VERSION=r12b
- NDK_CCACHE=ccache
- - GOROOT_BOOTSTRAP=$GOROOT
- ANDROID_NDK_HOME=$HOME/.android/android-ndk-${NDK_VERSION}
- SBTPATH=$HOME/.sbt
- PATH=${ANDROID_NDK_HOME}:${ANDROID_HOME}/tools:${ANDROID_HOME}/platform-tools:${PATH}
@@ -50,4 +49,4 @@ install:
fi
script:
- - $SBTPATH/sbt -DNPROC=$(nproc) native-build android:package-debug
+ - $SBTPATH/sbt android:package
diff --git a/README.md b/README.md
index 04564ceb..4799fdf4 100644
--- a/README.md
+++ b/README.md
@@ -12,7 +12,6 @@ A [shadowsocks](http://shadowsocks.org) client for Android, written in Scala.
* JDK 1.8
* SBT 0.13.0+
-* Go 1.4+
* Android SDK
- Build Tools 25+
- Android Support Repository and Google Repository (see `build.sbt` for version)
@@ -22,16 +21,15 @@ 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_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 `local.properties` from `local.properties.example` with your own key information
+* Create `mobile/local.properties` from `mobile/local.properties.example` with your own key information
* Invoke the building like this
```bash
- git submodule update --init
+ git submodule update --init --recursive
# Build the App
- sbt native-build clean android:package-release
+ sbt clean android:package-release
```
### TRANSLATE
@@ -54,8 +52,8 @@ Translators can go to [POEditor](https://poeditor.com/join/project/u5VHO9vhSf) t
shadowsocks-libev: GPLv3
pdnsd: GPLv3
libev: GPLv2
- kcptun: MIT
libsodium: ISC
+ libudns: LGPL
### LICENSE
diff --git a/build.sbt b/build.sbt
index 963ea618..bd13b300 100644
--- a/build.sbt
+++ b/build.sbt
@@ -1,71 +1,45 @@
-scalaVersion := "2.11.8"
-dexMaxHeap := "4g"
+lazy val commonSettings = Seq(
+ scalaVersion := "2.11.8",
+ dexMaxHeap := "4g",
-enablePlugins(AndroidApp)
-android.useSupportVectors
+ organization := "com.github.shadowsocks",
-name := "shadowsocks"
-version := "3.4.2"
-versionCode := Some(174)
+ platformTarget := "android-25",
-// Speed up ndk-build by reading nproc from environment
-// and default to 8
-val nproc = sys.props.getOrElse("NPROC", default = "8")
-ndkArgs := Seq(s"-j$nproc")
+ compileOrder := CompileOrder.JavaThenScala,
+ javacOptions ++= "-source" :: "1.7" :: "-target" :: "1.7" :: Nil,
+ scalacOptions ++= "-target:jvm-1.7" :: "-Xexperimental" :: Nil,
+ ndkArgs := "-j" :: java.lang.Runtime.getRuntime.availableProcessors.toString :: Nil,
-platformTarget := "android-25"
+ proguardVersion := "5.3.2",
+ proguardCache := Seq(),
-compileOrder := CompileOrder.JavaThenScala
-javacOptions ++= "-source" :: "1.7" :: "-target" :: "1.7" :: Nil
-scalacOptions ++= "-target:jvm-1.7" :: "-Xexperimental" :: Nil
+ shrinkResources := true,
+ typedResources := false
+)
-proguardVersion := "5.3.2"
-proguardCache := Seq()
-proguardOptions ++=
- "-keep class com.github.shadowsocks.System { *; }" ::
- "-dontwarn com.google.android.gms.internal.**" ::
- "-dontwarn com.j256.ormlite.**" ::
- "-dontwarn okio.**" ::
- "-dontwarn org.xbill.**" ::
- Nil
+val supportLibsVersion = "25.1.1"
+lazy val root = Project(id = "shadowsocks-android", base = file("."))
+ .settings(commonSettings)
+ .aggregate(plugin, mobile)
-shrinkResources := true
-typedResources := false
-resConfigs := Seq("ja", "ru", "zh-rCN", "zh-rTW")
+install in Android := (install in (mobile, Android)).value
+run in Android := (run in (mobile, Android)).evaluated
-val supportLibsVersion = "25.1.0"
-val playServicesVersion = "10.0.1"
-resolvers += Resolver.jcenterRepo
-libraryDependencies ++=
- "com.android.support" % "cardview-v7" % supportLibsVersion ::
- "com.android.support" % "customtabs" % supportLibsVersion ::
- "com.android.support" % "design" % supportLibsVersion ::
- "com.android.support" % "gridlayout-v7" % supportLibsVersion ::
- "com.android.support" % "preference-v14" % supportLibsVersion ::
- "com.futuremind.recyclerfastscroll" % "fastscroll" % "0.2.5" ::
- "com.evernote" % "android-job" % "1.1.4" ::
- "com.github.jorgecastilloprz" % "fabprogresscircle" % "1.01" ::
- "com.google.android.gms" % "play-services-ads" % playServicesVersion ::
- "com.google.android.gms" % "play-services-analytics" % playServicesVersion ::
- "com.google.android.gms" % "play-services-gcm" % playServicesVersion ::
- "com.j256.ormlite" % "ormlite-android" % "5.0" ::
- "com.mikepenz" % "crossfader" % "1.5.0" ::
- "com.mikepenz" % "fastadapter" % "2.1.5" ::
- "com.mikepenz" % "iconics-core" % "2.8.2" ::
- "com.mikepenz" % "materialdrawer" % "5.8.1" ::
- "com.mikepenz" % "materialize" % "1.0.0" ::
- "com.squareup.okhttp3" % "okhttp" % "3.5.0" ::
- "com.twofortyfouram" % "android-plugin-api-for-locale" % "1.0.2" ::
- "dnsjava" % "dnsjava" % "2.1.7" ::
- "eu.chainfire" % "libsuperuser" % "1.0.0.201608240809" ::
- "net.glxn.qrgen" % "android" % "2.0" ::
- Nil
+lazy val plugin = project
+ .settings(commonSettings)
+ .settings(
+ libraryDependencies += "com.android.support" % "preference-v14" % supportLibsVersion
+ )
-lazy val nativeBuild = TaskKey[Unit]("native-build", "Build native executables")
-nativeBuild := {
- val logger = streams.value.log
- Process("./build.sh") ! logger match {
- case 0 => // Success!
- case n => sys.error(s"Native build script exit code: $n")
- }
-}
+lazy val mobile = project
+ .settings(commonSettings)
+ .settings(
+ libraryDependencies ++=
+ "com.android.support" % "cardview-v7" % supportLibsVersion ::
+ "com.android.support" % "customtabs" % supportLibsVersion ::
+ "com.android.support" % "design" % supportLibsVersion ::
+ "com.android.support" % "gridlayout-v7" % supportLibsVersion ::
+ Nil
+ )
+ .dependsOn(plugin)
diff --git a/build.sh b/build.sh
deleted file mode 100755
index 5a646eab..00000000
--- a/build.sh
+++ /dev/null
@@ -1,16 +0,0 @@
-#!/bin/bash
-
-function try () {
-"$@" || exit -1
-}
-
-pushd src/main
-# Clean up old binaries (no longer used)
-rm -rf assets/armeabi-v7a assets/x86 libs/armeabi-v7a libs/x86
-mkdir -p libs/armeabi-v7a libs/x86
-popd
-
-# Build kcptun
-pushd kcptun
-try ./make.bash
-popd
diff --git a/kcptun/go b/kcptun/go
deleted file mode 160000
index c3f75e65..00000000
--- a/kcptun/go
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit c3f75e654ddb95bd53351294337649c08e9f9409
diff --git a/kcptun/kcptun b/kcptun/kcptun
deleted file mode 160000
index c532a50e..00000000
--- a/kcptun/kcptun
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit c532a50e1aeeaa9dee2428b374c3651a5c95258a
diff --git a/kcptun/make.bash b/kcptun/make.bash
deleted file mode 100755
index 2eb1454d..00000000
--- a/kcptun/make.bash
+++ /dev/null
@@ -1,69 +0,0 @@
-#!/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/gopath
-export GOBIN=$GOPATH/bin
-mkdir -p $GOBIN
-export PATH=$GOROOT/bin:$PATH
-
-pushd kcptun/client
-
-echo "Get dependences for kcptun"
-go get -u github.com/xtaci/kcp-go
-go get -u github.com/xtaci/smux
-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 -ldflags="-s -w"
-try $ANDROID_ARM_STRIP client
-try mv client $DIR/../src/main/libs/armeabi-v7a/libkcptun.so
-
-echo "Cross compile kcptun for x86"
-try env CGO_ENABLED=1 CC=$ANDROID_X86_CC GOOS=android GOARCH=386 go build -ldflags="-s -w"
-try $ANDROID_X86_STRIP client
-try mv client $DIR/../src/main/libs/x86/libkcptun.so
-popd
-
-echo "Successfully build kcptun"
diff --git a/mobile/build.sbt b/mobile/build.sbt
new file mode 100644
index 00000000..c20f1f1a
--- /dev/null
+++ b/mobile/build.sbt
@@ -0,0 +1,38 @@
+enablePlugins(AndroidApp)
+android.useSupportVectors
+
+name := "shadowsocks"
+version := "4.0.1"
+versionCode := Some(176)
+
+proguardOptions ++=
+ "-keep class com.github.shadowsocks.JniHelper { *; }" ::
+ "-dontwarn com.google.android.gms.internal.**" ::
+ "-dontwarn com.j256.ormlite.**" ::
+ "-dontwarn okio.**" ::
+ "-dontwarn org.xbill.**" ::
+ Nil
+
+resConfigs := Seq("ja", "ru", "zh-rCN", "zh-rTW")
+
+val playServicesVersion = "10.0.1"
+resolvers += Resolver.jcenterRepo
+libraryDependencies ++=
+ "com.futuremind.recyclerfastscroll" % "fastscroll" % "0.2.5" ::
+ "com.evernote" % "android-job" % "1.1.5" ::
+ "com.github.jorgecastilloprz" % "fabprogresscircle" % "1.01" ::
+ "com.google.android.gms" % "play-services-ads" % playServicesVersion ::
+ "com.google.android.gms" % "play-services-analytics" % playServicesVersion ::
+ "com.google.android.gms" % "play-services-gcm" % playServicesVersion ::
+ "com.j256.ormlite" % "ormlite-android" % "5.0" ::
+ "com.mikepenz" % "crossfader" % "1.5.0" ::
+ "com.mikepenz" % "fastadapter" % "2.1.6" ::
+ "com.mikepenz" % "iconics-core" % "2.8.2" ::
+ "com.mikepenz" % "materialdrawer" % "5.8.1" ::
+ "com.mikepenz" % "materialize" % "1.0.0" ::
+ "com.squareup.okhttp3" % "okhttp" % "3.6.0" ::
+ "com.twofortyfouram" % "android-plugin-api-for-locale" % "1.0.2" ::
+ "dnsjava" % "dnsjava" % "2.1.8" ::
+ "eu.chainfire" % "libsuperuser" % "1.0.0.201608240809" ::
+ "net.glxn.qrgen" % "android" % "2.0" ::
+ Nil
diff --git a/gfwlist/gen.pl b/mobile/gfwlist/gen.pl
similarity index 100%
rename from gfwlist/gen.pl
rename to mobile/gfwlist/gen.pl
diff --git a/gfwlist/gen.py b/mobile/gfwlist/gen.py
similarity index 100%
rename from gfwlist/gen.py
rename to mobile/gfwlist/gen.py
diff --git a/lint.xml b/mobile/lint.xml
similarity index 100%
rename from lint.xml
rename to mobile/lint.xml
diff --git a/local.properties.example b/mobile/local.properties.example
similarity index 100%
rename from local.properties.example
rename to mobile/local.properties.example
diff --git a/src/main/AndroidManifest.xml b/mobile/src/main/AndroidManifest.xml
similarity index 96%
rename from src/main/AndroidManifest.xml
rename to mobile/src/main/AndroidManifest.xml
index 5594a06b..0f77f4df 100644
--- a/src/main/AndroidManifest.xml
+++ b/mobile/src/main/AndroidManifest.xml
@@ -2,7 +2,6 @@
xmlns:tools="http://schemas.android.com/tools" package="com.github.shadowsocks">
-
@@ -18,14 +17,10 @@
android:targetSdkVersion="25"/>
http
shadowsocks-libev: GPLv3
pdnsd: GPLv3
libev: GPLv2
- kcptun: MIT
libsodium: ISC
+ libudns: LGPL