Merge branch 'develop' into beta
This commit is contained in:
@@ -17,10 +17,6 @@
|
||||
path = mobile/src/main/jni/redsocks
|
||||
url = https://github.com/shadowsocks/redsocks.git
|
||||
branch = shadowsocks-android
|
||||
[submodule "mobile/src/main/jni/pdnsd"]
|
||||
path = mobile/src/main/jni/pdnsd
|
||||
url = https://github.com/shadowsocks/pdnsd.git
|
||||
branch = shadowsocks-android
|
||||
[submodule "mobile/src/main/jni/mbedtls"]
|
||||
path = mobile/src/main/jni/mbedtls
|
||||
url = https://github.com/ARMmbed/mbedtls
|
||||
|
||||
@@ -18,7 +18,7 @@ lazy val commonSettings = Seq(
|
||||
typedResources := false
|
||||
)
|
||||
|
||||
val supportLibsVersion = "25.1.1"
|
||||
val supportLibsVersion = "25.2.0"
|
||||
lazy val root = Project(id = "shadowsocks-android", base = file("."))
|
||||
.settings(commonSettings)
|
||||
.aggregate(plugin, mobile)
|
||||
|
||||
+2
-2
@@ -2,8 +2,8 @@ enablePlugins(AndroidApp)
|
||||
android.useSupportVectors
|
||||
|
||||
name := "shadowsocks"
|
||||
version := "4.0.4"
|
||||
versionCode := Some(179)
|
||||
version := "4.1.0"
|
||||
versionCode := Some(180)
|
||||
|
||||
proguardOptions ++=
|
||||
"-keep class com.github.shadowsocks.JniHelper { *; }" ::
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1 @@
|
||||
127.0.0.1 localhost
|
||||
@@ -54,7 +54,14 @@ public class JniHelper {
|
||||
? new ErrnoException("kill", errno) : new Exception("kill failed: " + errno);
|
||||
}
|
||||
|
||||
@Deprecated // Use Process.destroy() since API 24
|
||||
public static int waitpidCompat(Process process) throws Exception {
|
||||
if (Build.VERSION.SDK_INT >= 24) throw new UnsupportedOperationException("Never call this method in OpenJDK!");
|
||||
return waitpid(process);
|
||||
}
|
||||
|
||||
private static native int sigterm(Process process);
|
||||
private static native int waitpid(Process process);
|
||||
public static native int sendFd(int fd, String path);
|
||||
public static native void close(int fd);
|
||||
}
|
||||
|
||||
@@ -239,23 +239,6 @@ LOCAL_CFLAGS := -O2 -std=gnu99 -DUSE_IPTABLES \
|
||||
|
||||
include $(BUILD_SHARED_EXECUTABLE)
|
||||
|
||||
########################################################
|
||||
## pdnsd
|
||||
########################################################
|
||||
|
||||
include $(CLEAR_VARS)
|
||||
|
||||
PDNSD_SOURCES := $(wildcard $(LOCAL_PATH)/pdnsd/src/*.c)
|
||||
|
||||
LOCAL_MODULE := pdnsd
|
||||
LOCAL_SRC_FILES := $(PDNSD_SOURCES:$(LOCAL_PATH)/%=%)
|
||||
LOCAL_CFLAGS := -DANDROID -Wall -O2 -I$(LOCAL_PATH)/pdnsd \
|
||||
-I$(LOCAL_PATH)/include/pdnsd -I$(LOCAL_PATH)/libancillary
|
||||
LOCAL_STATIC_LIBRARIES := libancillary
|
||||
LOCAL_LDLIBS := -llog
|
||||
|
||||
include $(BUILD_SHARED_EXECUTABLE)
|
||||
|
||||
########################################################
|
||||
## shadowsocks-libev local
|
||||
########################################################
|
||||
@@ -494,6 +477,17 @@ LOCAL_SRC_FILES := $(addprefix pcre/, $(libpcre_src_files))
|
||||
|
||||
include $(BUILD_STATIC_LIBRARY)
|
||||
|
||||
########################################################
|
||||
## overture
|
||||
########################################################
|
||||
|
||||
include $(CLEAR_VARS)
|
||||
|
||||
LOCAL_MODULE := overture
|
||||
LOCAL_SRC_FILES := overture/$(TARGET_ARCH_ABI)/liboverture.so
|
||||
|
||||
include $(PREBUILT_SHARED_LIBRARY)
|
||||
|
||||
# Import cpufeatures
|
||||
$(call import-module,android/cpufeatures)
|
||||
|
||||
|
||||
@@ -14,6 +14,7 @@
|
||||
#include <sys/stat.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/socket.h>
|
||||
#include <sys/wait.h>
|
||||
#include <ancillary.h>
|
||||
|
||||
#define LOGI(...) do { __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__); } while(0)
|
||||
@@ -41,6 +42,17 @@ jint Java_com_github_shadowsocks_jnihelper_sigterm(JNIEnv *env, jobject thiz, jo
|
||||
return kill(pid, SIGTERM) == -1 && errno != ESRCH ? errno : 0;
|
||||
}
|
||||
|
||||
jint Java_com_github_shadowsocks_jnihelper_waitpid(JNIEnv *env, jobject thiz, jobject process) {
|
||||
if (!env->IsInstanceOf(process, ProcessImpl)) {
|
||||
THROW(env, "java/lang/ClassCastException",
|
||||
"Unsupported process object. Only java.lang.ProcessManager$ProcessImpl is accepted.");
|
||||
return -1;
|
||||
}
|
||||
jint pid = env->GetIntField(process, ProcessImpl_pid);
|
||||
int status;
|
||||
return waitpid(pid, &status, WNOHANG);
|
||||
}
|
||||
|
||||
void Java_com_github_shadowsocks_jnihelper_close(JNIEnv *env, jobject thiz, jint fd) {
|
||||
close(fd);
|
||||
}
|
||||
@@ -84,11 +96,11 @@ static JNINativeMethod method_table[] = {
|
||||
{ "sendFd", "(ILjava/lang/String;)I",
|
||||
(void*) Java_com_github_shadowsocks_jnihelper_sendfd },
|
||||
{ "sigterm", "(Ljava/lang/Process;)I",
|
||||
(void*) Java_com_github_shadowsocks_jnihelper_sigterm }
|
||||
(void*) Java_com_github_shadowsocks_jnihelper_sigterm },
|
||||
{ "waitpid", "(Ljava/lang/Process;)I",
|
||||
(void*) Java_com_github_shadowsocks_jnihelper_waitpid }
|
||||
};
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* Register several native methods for one class.
|
||||
*/
|
||||
|
||||
BIN
Binary file not shown.
BIN
Binary file not shown.
Submodule mobile/src/main/jni/pdnsd deleted from f6b0a56c74
@@ -123,6 +123,23 @@ trait BaseService extends Service {
|
||||
false
|
||||
} else true
|
||||
|
||||
def getExternalIp(): String = {
|
||||
val url = "http://icanhazip.com"
|
||||
val client = new OkHttpClient.Builder()
|
||||
.connectTimeout(10, TimeUnit.SECONDS)
|
||||
.writeTimeout(10, TimeUnit.SECONDS)
|
||||
.readTimeout(30, TimeUnit.SECONDS)
|
||||
.build()
|
||||
val request = new Request.Builder()
|
||||
.url(url)
|
||||
.build()
|
||||
val response = client.newCall(request).execute()
|
||||
if (response.isSuccessful)
|
||||
response.body.string.trim
|
||||
else
|
||||
""
|
||||
}
|
||||
|
||||
def connect() {
|
||||
if (profile.host == "198.199.101.152") {
|
||||
val holder = app.containerHolder
|
||||
|
||||
@@ -115,7 +115,12 @@ class GuardedProcess(cmd: String*) {
|
||||
private def destroyProcess() {
|
||||
if (Build.VERSION.SDK_INT < 24) {
|
||||
JniHelper.sigtermCompat(process)
|
||||
process.waitFor()
|
||||
var tries = 0
|
||||
while (JniHelper.waitpidCompat(process) == 0 && tries < 3) {
|
||||
Log.w(TAG, "still waiting for process " + Commandline.toString(cmd))
|
||||
Thread.sleep(200)
|
||||
tries += 1
|
||||
}
|
||||
}
|
||||
process.destroy()
|
||||
}
|
||||
|
||||
@@ -197,15 +197,17 @@ class ShadowsocksApplication extends Application {
|
||||
|
||||
def copyAssets() {
|
||||
val assetManager = getAssets
|
||||
var files: Array[String] = null
|
||||
try files = assetManager.list("acl") catch {
|
||||
case e: IOException =>
|
||||
Log.e(TAG, e.getMessage)
|
||||
app.track(e)
|
||||
for (f <- List("acl", "overture")) {
|
||||
var files: Array[String] = null
|
||||
try files = assetManager.list(f) catch {
|
||||
case e: IOException =>
|
||||
Log.e(TAG, e.getMessage)
|
||||
app.track(e)
|
||||
}
|
||||
if (files != null) for (file <- files) autoClose(assetManager.open(f + "/" + file))(in =>
|
||||
autoClose(new FileOutputStream(new File(getFilesDir, file)))(out =>
|
||||
IOUtils.copy(in, out)))
|
||||
}
|
||||
if (files != null) for (file <- files) autoClose(assetManager.open("acl/" + file))(in =>
|
||||
autoClose(new FileOutputStream(new File(getFilesDir, file)))(out =>
|
||||
IOUtils.copy(in, out)))
|
||||
editor.putInt(Key.currentVersionCode, BuildConfig.VERSION_CODE).apply()
|
||||
}
|
||||
|
||||
|
||||
@@ -49,7 +49,7 @@ class ShadowsocksNatService extends BaseService {
|
||||
var sslocalProcess: GuardedProcess = _
|
||||
var sstunnelProcess: GuardedProcess = _
|
||||
var redsocksProcess: GuardedProcess = _
|
||||
var pdnsdProcess: GuardedProcess = _
|
||||
var overtureProcess: GuardedProcess = _
|
||||
var su: Shell.Interactive = _
|
||||
|
||||
def startShadowsocksDaemon() {
|
||||
@@ -83,21 +83,38 @@ class ShadowsocksNatService extends BaseService {
|
||||
}
|
||||
|
||||
def startDnsDaemon() {
|
||||
val reject = if (profile.ipv6) "224.0.0.0/3" else "224.0.0.0/3, ::/0"
|
||||
IOUtils.writeString(new File(getFilesDir, "pdnsd-nat.conf"), profile.route match {
|
||||
val externalIp = getExternalIp()
|
||||
IOUtils.writeString(new File(getFilesDir, "overture-nat.conf"), profile.route match {
|
||||
case Acl.BYPASS_CHN | Acl.BYPASS_LAN_CHN | Acl.GFWLIST | Acl.CUSTOM_RULES =>
|
||||
ConfigUtils.PDNSD_DIRECT.formatLocal(Locale.ENGLISH, "", getCacheDir.getAbsolutePath,
|
||||
"127.0.0.1", profile.localPort + 53, "114.114.114.114, 223.5.5.5, 1.2.4.8",
|
||||
getBlackList, reject, profile.localPort + 63, reject)
|
||||
ConfigUtils.OVERTURE_DIRECT.formatLocal(Locale.ENGLISH,
|
||||
profile.localPort + 53, // Local Port
|
||||
"119.29.29.29", // Primary DNS 1
|
||||
"udp", // DNS type of Primary DNS 1
|
||||
"114.114.114.114", // Primary DNS 2
|
||||
"udp", // DNS type of Primary DNS 2
|
||||
profile.remoteDns, // Alternative DNS
|
||||
"127.0.0.1:" + profile.localPort, // Local SOCKS5 Proxy
|
||||
externalIp) // External IP
|
||||
case Acl.CHINALIST =>
|
||||
ConfigUtils.PDNSD_DIRECT.formatLocal(Locale.ENGLISH, "", getCacheDir.getAbsolutePath,
|
||||
"127.0.0.1", profile.localPort + 53, "8.8.8.8, 8.8.4.4, 208.67.222.222",
|
||||
"", reject, profile.localPort + 63, reject)
|
||||
ConfigUtils.OVERTURE_LOCAL.formatLocal(Locale.ENGLISH,
|
||||
profile.localPort + 53, // Local Port
|
||||
"119.29.29.29", // Primary DNS
|
||||
"127.0.0.1:" + profile.localPort, // Local SOCKS5 Proxy
|
||||
externalIp, // External IP
|
||||
"114.114.114.114", // Alternative DNS
|
||||
"127.0.0.1:" + profile.localPort, // Local SOCKS5 Proxy
|
||||
externalIp) // External IP
|
||||
case _ =>
|
||||
ConfigUtils.PDNSD_LOCAL.formatLocal(Locale.ENGLISH, "", getCacheDir.getAbsolutePath,
|
||||
"127.0.0.1", profile.localPort + 53, profile.localPort + 63, reject)
|
||||
ConfigUtils.OVERTURE_LOCAL.formatLocal(Locale.ENGLISH,
|
||||
profile.localPort + 53, // Local Port
|
||||
profile.remoteDns, // Primary DNS
|
||||
"127.0.0.1:" + profile.localPort, // Local SOCKS5 Proxy
|
||||
externalIp, // External IP
|
||||
"208.67.222.222", // Alternative DNS
|
||||
"127.0.0.1:" + profile.localPort, // Local SOCKS5 Proxy
|
||||
externalIp) // External IP
|
||||
})
|
||||
pdnsdProcess = new GuardedProcess(getApplicationInfo.nativeLibraryDir + "/libpdnsd.so", "-c", "pdnsd-nat.conf")
|
||||
overtureProcess = new GuardedProcess(getApplicationInfo.nativeLibraryDir + "/liboverture.so", "-c", "overture-nat.conf")
|
||||
.start()
|
||||
}
|
||||
|
||||
@@ -111,11 +128,13 @@ class ShadowsocksNatService extends BaseService {
|
||||
/** Called when the activity is first created. */
|
||||
def handleConnection() {
|
||||
|
||||
startDNSTunnel()
|
||||
startRedsocksDaemon()
|
||||
startShadowsocksDaemon()
|
||||
|
||||
if (!profile.udpdns) startDnsDaemon()
|
||||
if (!profile.udpdns)
|
||||
startDnsDaemon()
|
||||
else
|
||||
startDNSTunnel()
|
||||
|
||||
setupIptables()
|
||||
|
||||
@@ -143,9 +162,9 @@ class ShadowsocksNatService extends BaseService {
|
||||
redsocksProcess.destroy()
|
||||
redsocksProcess = null
|
||||
}
|
||||
if (pdnsdProcess != null) {
|
||||
pdnsdProcess.destroy()
|
||||
pdnsdProcess = null
|
||||
if (overtureProcess != null) {
|
||||
overtureProcess.destroy()
|
||||
overtureProcess = null
|
||||
}
|
||||
|
||||
su.addCommand("iptables -t nat -F OUTPUT")
|
||||
|
||||
@@ -45,8 +45,7 @@ class ShadowsocksVpnService extends VpnService with BaseService {
|
||||
private var notification: ShadowsocksNotification = _
|
||||
|
||||
var sslocalProcess: GuardedProcess = _
|
||||
var sstunnelProcess: GuardedProcess = _
|
||||
var pdnsdProcess: GuardedProcess = _
|
||||
var overtureProcess: GuardedProcess = _
|
||||
var tun2socksProcess: GuardedProcess = _
|
||||
|
||||
override def onBind(intent: Intent): IBinder = {
|
||||
@@ -94,17 +93,13 @@ class ShadowsocksVpnService extends VpnService with BaseService {
|
||||
sslocalProcess.destroy()
|
||||
sslocalProcess = null
|
||||
}
|
||||
if (sstunnelProcess != null) {
|
||||
sstunnelProcess.destroy()
|
||||
sstunnelProcess = null
|
||||
}
|
||||
if (tun2socksProcess != null) {
|
||||
tun2socksProcess.destroy()
|
||||
tun2socksProcess = null
|
||||
}
|
||||
if (pdnsdProcess != null) {
|
||||
pdnsdProcess.destroy()
|
||||
pdnsdProcess = null
|
||||
if (overtureProcess != null) {
|
||||
overtureProcess.destroy()
|
||||
overtureProcess = null
|
||||
}
|
||||
}
|
||||
|
||||
@@ -149,15 +144,14 @@ class ShadowsocksVpnService extends VpnService with BaseService {
|
||||
/** Called when the activity is first created. */
|
||||
def handleConnection() {
|
||||
|
||||
val fd = startVpn()
|
||||
if (!sendFd(fd)) throw new Exception("sendFd failed")
|
||||
|
||||
startShadowsocksDaemon()
|
||||
|
||||
if (!profile.udpdns) {
|
||||
startDnsDaemon()
|
||||
startDnsTunnel()
|
||||
}
|
||||
|
||||
val fd = startVpn()
|
||||
if (!sendFd(fd)) throw new Exception("sendFd failed")
|
||||
}
|
||||
|
||||
override protected def buildPluginCommandLine(): ArrayBuffer[String] = super.buildPluginCommandLine() += "-V"
|
||||
@@ -182,33 +176,41 @@ class ShadowsocksVpnService extends VpnService with BaseService {
|
||||
sslocalProcess = new GuardedProcess(cmd: _*).start()
|
||||
}
|
||||
|
||||
def startDnsTunnel(): Unit =
|
||||
sstunnelProcess = new GuardedProcess(getApplicationInfo.nativeLibraryDir + "/libss-tunnel.so",
|
||||
"-V",
|
||||
"-t", "10",
|
||||
"-b", "127.0.0.1",
|
||||
"-l", (profile.localPort + 63).toString,
|
||||
"-L" , profile.remoteDns.trim + ":53",
|
||||
"-c", buildShadowsocksConfig("ss-tunnel-vpn.conf")).start()
|
||||
|
||||
def startDnsDaemon() {
|
||||
val reject = if (profile.ipv6) "224.0.0.0/3" else "224.0.0.0/3, ::/0"
|
||||
IOUtils.writeString(new File(getFilesDir, "pdnsd-vpn.conf"), profile.route match {
|
||||
val externalIp = getExternalIp()
|
||||
IOUtils.writeString(new File(getFilesDir, "overture-vpn.conf"), profile.route match {
|
||||
case Acl.BYPASS_CHN | Acl.BYPASS_LAN_CHN | Acl.GFWLIST | Acl.CUSTOM_RULES =>
|
||||
ConfigUtils.PDNSD_DIRECT.formatLocal(Locale.ENGLISH, "protect = \"protect_path\";", getCacheDir.getAbsolutePath,
|
||||
"0.0.0.0", profile.localPort + 53, "114.114.114.114, 223.5.5.5, 1.2.4.8",
|
||||
getBlackList, reject, profile.localPort + 63, reject)
|
||||
ConfigUtils.OVERTURE_DIRECT.formatLocal(Locale.ENGLISH,
|
||||
profile.localPort + 53, // Local Port
|
||||
"119.29.29.29", // Primary DNS 1
|
||||
"udp", // DNS type of Primary DNS 1
|
||||
"114.114.114.114", // Primary DNS 2
|
||||
"udp", // DNS type of Primary DNS 2
|
||||
"208.67.222.222", // Alternative DNS
|
||||
"127.0.0.1:" + profile.localPort, // Local SOCKS5 Proxy
|
||||
externalIp) // External IP
|
||||
case Acl.CHINALIST =>
|
||||
ConfigUtils.PDNSD_DIRECT.formatLocal(Locale.ENGLISH, "protect = \"protect_path\";", getCacheDir.getAbsolutePath,
|
||||
"0.0.0.0", profile.localPort + 53, "8.8.8.8, 8.8.4.4, 208.67.222.222",
|
||||
"", reject, profile.localPort + 63, reject)
|
||||
ConfigUtils.OVERTURE_LOCAL.formatLocal(Locale.ENGLISH,
|
||||
profile.localPort + 53, // Local Port
|
||||
"119.29.29.29", // Primary DNS
|
||||
"127.0.0.1:" + profile.localPort, // Local SOCKS5 Proxy
|
||||
externalIp, // External IP
|
||||
"114.114.114.114", // Alternative DNS
|
||||
"127.0.0.1:" + profile.localPort, // Local SOCKS5 Proxy
|
||||
externalIp) // External IP
|
||||
case _ =>
|
||||
ConfigUtils.PDNSD_LOCAL.formatLocal(Locale.ENGLISH, "protect = \"protect_path\";", getCacheDir.getAbsolutePath,
|
||||
"0.0.0.0", profile.localPort + 53, profile.localPort + 63, reject)
|
||||
ConfigUtils.OVERTURE_LOCAL.formatLocal(Locale.ENGLISH,
|
||||
profile.localPort + 53, // Local Port
|
||||
profile.remoteDns, // Primary DNS
|
||||
"127.0.0.1:" + profile.localPort, // Local SOCKS5 Proxy
|
||||
externalIp, // External IP
|
||||
"208.67.222.222", // Alternative DNS
|
||||
"127.0.0.1:" + profile.localPort, // Local SOCKS5 Proxy
|
||||
externalIp) // External IP
|
||||
})
|
||||
val cmd = Array(getApplicationInfo.nativeLibraryDir + "/libpdnsd.so", "-c", "pdnsd-vpn.conf")
|
||||
val cmd = Array(getApplicationInfo.nativeLibraryDir + "/liboverture.so", "-c", "overture-vpn.conf", "-V")
|
||||
|
||||
pdnsdProcess = new GuardedProcess(cmd: _*).start()
|
||||
overtureProcess = new GuardedProcess(cmd: _*).start()
|
||||
}
|
||||
|
||||
def startVpn(): Int = {
|
||||
|
||||
@@ -46,84 +46,95 @@ object ConfigUtils {
|
||||
" type = socks5;\n" +
|
||||
"}\n"
|
||||
|
||||
val PDNSD_LOCAL =
|
||||
val OVERTURE_DIRECT =
|
||||
"""
|
||||
|global {
|
||||
| perm_cache = 2048;
|
||||
| %s
|
||||
| cache_dir = "%s";
|
||||
| server_ip = %s;
|
||||
| server_port = %d;
|
||||
| query_method = tcp_only;
|
||||
| min_ttl = 15m;
|
||||
| max_ttl = 1w;
|
||||
| timeout = 10;
|
||||
| daemon = off;
|
||||
|}
|
||||
|
|
||||
|server {
|
||||
| label = "local";
|
||||
| ip = 127.0.0.1;
|
||||
| port = %d;
|
||||
| reject = %s;
|
||||
| reject_policy = negate;
|
||||
| reject_recursively = on;
|
||||
|}
|
||||
|
|
||||
|rr {
|
||||
| name=localhost;
|
||||
| reverse=on;
|
||||
| a=127.0.0.1;
|
||||
| owner=localhost;
|
||||
| soa=localhost,root.localhost,42,86400,900,86400,86400;
|
||||
|}
|
||||
|{
|
||||
| "BindAddress": ":%d",
|
||||
| "PrimaryDNS": [
|
||||
| {
|
||||
| "Name": "Primary-1",
|
||||
| "Address": "%s:53",
|
||||
| "Protocol": "%s",
|
||||
| "Socks5Address": "",
|
||||
| "Timeout": 6,
|
||||
| "EDNSClientSubnet": {
|
||||
| "Policy": "disable",
|
||||
| "ExternalIP": ""
|
||||
| }
|
||||
| },
|
||||
| {
|
||||
| "Name": "Primary-2",
|
||||
| "Address": "%s:53",
|
||||
| "Protocol": "%s",
|
||||
| "Socks5Address": "",
|
||||
| "Timeout": 6,
|
||||
| "EDNSClientSubnet": {
|
||||
| "Policy": "disable",
|
||||
| "ExternalIP": ""
|
||||
| }
|
||||
| }
|
||||
| ],
|
||||
| "AlternativeDNS":[
|
||||
| {
|
||||
| "Name": "Alternative",
|
||||
| "Address": "%s:53",
|
||||
| "Protocol": "tcp",
|
||||
| "Socks5Address": "%s",
|
||||
| "Timeout": 6,
|
||||
| "EDNSClientSubnet":{
|
||||
| "Policy": "auto",
|
||||
| "ExternalIP": "%s"
|
||||
| }
|
||||
| }
|
||||
| ],
|
||||
| "RedirectIPv6Record": true,
|
||||
| "IPNetworkFile": "china_ip_list.txt",
|
||||
| "DomainFile": "gfwlist.txt",
|
||||
| "DomainBase64Decode": true,
|
||||
| "HostsFile": "hosts",
|
||||
| "MinimumTTL": 3600,
|
||||
| "CacheSize" : 4096
|
||||
|}
|
||||
""".stripMargin
|
||||
|
||||
val PDNSD_DIRECT =
|
||||
val OVERTURE_LOCAL =
|
||||
"""
|
||||
|global {
|
||||
| perm_cache = 2048;
|
||||
| %s
|
||||
| cache_dir = "%s";
|
||||
| server_ip = %s;
|
||||
| server_port = %d;
|
||||
| query_method = udp_only;
|
||||
| min_ttl = 15m;
|
||||
| max_ttl = 1w;
|
||||
| timeout = 10;
|
||||
| daemon = off;
|
||||
| par_queries = 4;
|
||||
|}
|
||||
|
|
||||
|server {
|
||||
| label = "remote-servers";
|
||||
| ip = %s;
|
||||
| timeout = 3;
|
||||
| query_method = udp_only;
|
||||
| %s
|
||||
| policy = included;
|
||||
| reject = %s;
|
||||
| reject_policy = fail;
|
||||
| reject_recursively = on;
|
||||
|}
|
||||
|
|
||||
|server {
|
||||
| label = "local-server";
|
||||
| ip = 127.0.0.1;
|
||||
| query_method = tcp_only;
|
||||
| port = %d;
|
||||
| reject = %s;
|
||||
| reject_policy = negate;
|
||||
| reject_recursively = on;
|
||||
|}
|
||||
|
|
||||
|rr {
|
||||
| name=localhost;
|
||||
| reverse=on;
|
||||
| a=127.0.0.1;
|
||||
| owner=localhost;
|
||||
| soa=localhost,root.localhost,42,86400,900,86400,86400;
|
||||
|}
|
||||
|{
|
||||
| "BindAddress": ":%d",
|
||||
| "PrimaryDNS": [
|
||||
| {
|
||||
| "Name": "Primary",
|
||||
| "Address": "%s:53",
|
||||
| "Protocol": "tcp",
|
||||
| "Socks5Address": "%s",
|
||||
| "Timeout": 6,
|
||||
| "EDNSClientSubnet": {
|
||||
| "Policy": "auto",
|
||||
| "ExternalIP": "%s"
|
||||
| }
|
||||
| }
|
||||
| ],
|
||||
| "AlternativeDNS":[
|
||||
| {
|
||||
| "Name": "Alternative",
|
||||
| "Address": "%s:53",
|
||||
| "Protocol": "tcp",
|
||||
| "Socks5Address": "%s",
|
||||
| "Timeout": 6,
|
||||
| "EDNSClientSubnet":{
|
||||
| "Policy": "auto",
|
||||
| "ExternalIP": "%s"
|
||||
| }
|
||||
| }
|
||||
| ],
|
||||
| "RedirectIPv6Record": true,
|
||||
| "IPNetworkFile": "",
|
||||
| "DomainFile": "",
|
||||
| "DomainBase64Decode": true,
|
||||
| "HostsFile": "hosts",
|
||||
| "MinimumTTL": 3600,
|
||||
| "CacheSize" : 4096
|
||||
|}
|
||||
""".stripMargin
|
||||
}
|
||||
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
* 0.0.3:
|
||||
* Update support library version to 25.2.0.
|
||||
* 0.0.2:
|
||||
* Add `getOrDefault` to `PluginOptions`;
|
||||
* Update support library version to 25.1.1.
|
||||
|
||||
+1
-1
@@ -2,7 +2,7 @@ enablePlugins(AndroidLib)
|
||||
android.useSupportVectors
|
||||
|
||||
name := "plugin"
|
||||
version := "0.0.2"
|
||||
version := "0.0.3-SNAPSHOT"
|
||||
|
||||
pomExtra in Global := {
|
||||
<url>https://github.com/shadowsocks/shadowsocks-android</url>
|
||||
|
||||
Reference in New Issue
Block a user