Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
cf2f17dfff | ||
|
|
a64eb8ac58 | ||
|
|
9ab9230960 | ||
|
|
8f6357d9cf | ||
|
|
73462b08af | ||
|
|
6d07c03bc7 | ||
|
|
953f59ea43 | ||
|
|
6df5179734 | ||
|
|
2f312486a1 | ||
|
|
88d5c01cb0 | ||
|
|
2b05da3aff | ||
|
|
c5a98a9b12 | ||
|
|
5633ae7b21 | ||
|
|
92af48f528 | ||
|
|
59f02cfa53 | ||
|
|
bd782dae98 | ||
|
|
ea738d17d7 | ||
|
|
915b1a74b1 | ||
|
|
9898ab88e0 | ||
|
|
c082a23c37 | ||
|
|
6636cf815d | ||
|
|
6df8f14fb2 | ||
|
|
0b88881fa4 | ||
|
|
85532a6b48 | ||
|
|
93274ffb04 | ||
|
|
fcd6ed847a | ||
|
|
36c4d80ee4 | ||
|
|
e864873ee4 | ||
|
|
80411c61d6 | ||
|
|
adb7285d54 | ||
|
|
7356eded16 | ||
|
|
1268376b68 | ||
|
|
b71019149f | ||
|
|
451e9c1fd3 | ||
|
|
9d5c9456c9 | ||
|
|
4988faf574 | ||
|
|
189058b5c4 | ||
|
|
529ee3a929 | ||
|
|
90cc3dbf2d | ||
|
|
6fe38f76be | ||
|
|
4df1d68501 | ||
|
|
9eceefcceb | ||
|
|
af6e58ec46 | ||
|
|
64c8529705 | ||
|
|
b1670679d7 | ||
|
|
5ac1343b5d | ||
|
|
41f4f3a3bc | ||
|
|
c21bd74302 | ||
|
|
a8822330a3 | ||
|
|
1cf6e4802c | ||
|
|
f64014eb7b | ||
|
|
2f6f991e6e | ||
|
|
90e00a3857 | ||
|
|
9c97dc9bf6 | ||
|
|
7d2e0a515f | ||
|
|
c920c0daa4 | ||
|
|
8e3854b496 | ||
|
|
ad42167b2e | ||
|
|
3bf0963c5a | ||
|
|
c3315d35ed | ||
|
|
103dc10a0a | ||
|
|
36c94b8d83 | ||
|
|
df72b29302 |
@@ -29,7 +29,8 @@ _Put an `x` inside the [ ] that applies._
|
||||
* [ ] IPv6 route
|
||||
* [ ] Per-App Proxy
|
||||
* [ ] Bypass mode
|
||||
* [ ] UDP Forwarding
|
||||
* Remote DNS: 8.8.8.8
|
||||
* [ ] DNS Forwarding
|
||||
* Plugin configuration (if applicable):
|
||||
* [ ] Auto Connect
|
||||
* [ ] TCP Fast Open
|
||||
|
||||
+12
@@ -10,3 +10,15 @@ local.sbt
|
||||
mobile/src/main/libs
|
||||
mobile/src/main/obj
|
||||
mobile/src/main/jni/overture
|
||||
|
||||
mobile/src/overture/.deps
|
||||
mobile/src/overture/bin
|
||||
mobile/src/overture/pkg
|
||||
|
||||
mobile/src/overture/src/github.com/Sirupsen
|
||||
mobile/src/overture/src/github.com/mattn
|
||||
mobile/src/overture/src/github.com/miekg
|
||||
mobile/src/overture/src/github.com/shawn1m
|
||||
mobile/src/overture/src/github.com/tools
|
||||
mobile/src/overture/src/golang.org
|
||||
mobile/src/overture/src/gopkg.in
|
||||
|
||||
+6
-3
@@ -33,6 +33,9 @@
|
||||
[submodule "mobile/src/main/jni/libudns"]
|
||||
path = mobile/src/main/jni/libudns
|
||||
url = https://github.com/shadowsocks/libudns.git
|
||||
[submodule "mobile/src/overture"]
|
||||
path = mobile/src/overture
|
||||
url = https://github.com/shadowsocks/overture-android.git
|
||||
[submodule "mobile/src/overture/go"]
|
||||
path = mobile/src/overture/go
|
||||
url = https://github.com/shadowsocks/go.git
|
||||
[submodule "mobile/src/overture/src/github.com/shadowsocks/overture"]
|
||||
path = mobile/src/overture/src/github.com/shadowsocks/overture
|
||||
url = https://github.com/shadowsocks/overture.git
|
||||
|
||||
@@ -16,7 +16,7 @@ A [shadowsocks](http://shadowsocks.org) client for Android, written in Scala.
|
||||
* Android SDK
|
||||
- Build Tools 25+
|
||||
- Android Support Repository and Google Repository (see `build.sbt` for version)
|
||||
* Android NDK r14+
|
||||
- Android NDK r14+
|
||||
|
||||
### BUILD
|
||||
|
||||
@@ -47,13 +47,13 @@ Translators can go to [POEditor](https://poeditor.com/join/project/u5VHO9vhSf) t
|
||||
<ul>
|
||||
<li>redsocks: <a href="https://github.com/shadowsocks/redsocks/blob/shadowsocks-android/README">APL 2.0</a></li>
|
||||
<li>mbed TLS: <a href="https://github.com/ARMmbed/mbedtls/blob/development/LICENSE">APL 2.0</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/libevent/blob/master/LICENSE">BSD</a></li>
|
||||
<li>tun2socks: <a href="https://github.com/shadowsocks/badvpn/blob/shadowsocks-android/COPYING">BSD</a></li>
|
||||
<li>pcre: <a href="https://android.googlesource.com/platform/external/pcre/+/master/dist2/LICENCE">BSD</a></li>
|
||||
<li>libancillary: <a href="https://github.com/shadowsocks/libancillary/blob/shadowsocks-android/COPYING">BSD</a></li>
|
||||
<li>shadowsocks-libev: <a href="https://github.com/shadowsocks/shadowsocks-libev/blob/master/LICENSE">GPLv3</a></li>
|
||||
<li>overture: <a href="https://github.com/shawn1m/overture/blob/master/LICENSE">MIT</a></li>
|
||||
<li>libev: <a href="https://github.com/shadowsocks/shadowsocks-libev/blob/master/libev/LICENSE">GPLv2</a></li>
|
||||
<li>libev: <a href="https://github.com/shadowsocks/libev/blob/master/LICENSE">GPLv2</a></li>
|
||||
<li>libsodium: <a href="https://github.com/jedisct1/libsodium/blob/master/LICENSE">ISC</a></li>
|
||||
<li>libudns: <a href="https://github.com/shadowsocks/libudns/blob/master/COPYING.LGPL">LGPL</a></li>
|
||||
</ul>
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
lazy val commonSettings = Seq(
|
||||
scalaVersion := "2.11.8",
|
||||
scalaVersion := "2.11.9",
|
||||
dexMaxHeap := "4g",
|
||||
|
||||
organization := "com.github.shadowsocks",
|
||||
@@ -10,15 +10,18 @@ lazy val commonSettings = Seq(
|
||||
javacOptions ++= "-source" :: "1.7" :: "-target" :: "1.7" :: Nil,
|
||||
scalacOptions ++= "-target:jvm-1.7" :: "-Xexperimental" :: Nil,
|
||||
ndkArgs := "-j" :: java.lang.Runtime.getRuntime.availableProcessors.toString :: Nil,
|
||||
ndkAbiFilter := Seq("armeabi-v7a", "arm64-v8a", "x86"),
|
||||
|
||||
proguardVersion := "5.3.2",
|
||||
proguardVersion := "5.3.3",
|
||||
proguardCache := Seq(),
|
||||
|
||||
shrinkResources := true,
|
||||
typedResources := false
|
||||
typedResources := false,
|
||||
|
||||
resConfigs := Seq("ja", "ko", "ru", "zh-rCN", "zh-rTW")
|
||||
)
|
||||
|
||||
val supportLibsVersion = "25.2.0"
|
||||
val supportLibsVersion = "25.3.1"
|
||||
lazy val root = Project(id = "shadowsocks-android", base = file("."))
|
||||
.settings(commonSettings)
|
||||
.aggregate(plugin, mobile)
|
||||
|
||||
+14
-13
@@ -1,43 +1,44 @@
|
||||
enablePlugins(AndroidApp)
|
||||
enablePlugins(AndroidGms)
|
||||
|
||||
android.useSupportVectors
|
||||
|
||||
name := "shadowsocks"
|
||||
version := "4.1.2"
|
||||
versionCode := Some(182)
|
||||
version := "4.1.7"
|
||||
versionCode := Some(187)
|
||||
|
||||
proguardOptions ++=
|
||||
"-keep class com.github.shadowsocks.JniHelper { *; }" ::
|
||||
"-dontwarn com.google.android.gms.internal.**" ::
|
||||
"-dontwarn com.j256.ormlite.**" ::
|
||||
"-dontwarn okio.**" ::
|
||||
"-dontwarn org.xbill.**" ::
|
||||
"-keep class com.github.shadowsocks.JniHelper { *; }" ::
|
||||
Nil
|
||||
|
||||
resConfigs := Seq("ja", "ru", "zh-rCN", "zh-rTW")
|
||||
|
||||
val playServicesVersion = "10.2.0"
|
||||
val playServicesVersion = "10.2.4"
|
||||
resolvers += Resolver.jcenterRepo
|
||||
libraryDependencies ++=
|
||||
"com.futuremind.recyclerfastscroll" % "fastscroll" % "0.2.5" ::
|
||||
"com.evernote" % "android-job" % "1.1.7" ::
|
||||
"com.evernote" % "android-job" % "1.1.10" ::
|
||||
"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.google.firebase" % "firebase-config" % playServicesVersion ::
|
||||
"com.j256.ormlite" % "ormlite-android" % "5.0" ::
|
||||
"com.mikepenz" % "crossfader" % "1.5.0" ::
|
||||
"com.mikepenz" % "fastadapter" % "2.1.7" ::
|
||||
"com.mikepenz" % "iconics-core" % "2.8.2" ::
|
||||
"com.mikepenz" % "materialdrawer" % "5.8.2" ::
|
||||
"com.mikepenz" % "fastadapter" % "2.5.2" ::
|
||||
"com.mikepenz" % "iconics-core" % "2.8.4" ::
|
||||
"com.mikepenz" % "materialdrawer" % "5.9.1" ::
|
||||
"com.mikepenz" % "materialize" % "1.0.1" ::
|
||||
"com.squareup.okhttp3" % "okhttp" % "3.6.0" ::
|
||||
"com.squareup.okhttp3" % "okhttp" % "3.7.0" ::
|
||||
"com.twofortyfouram" % "android-plugin-api-for-locale" % "1.0.2" ::
|
||||
"dnsjava" % "dnsjava" % "2.1.8" ::
|
||||
"eu.chainfire" % "libsuperuser" % "1.0.0.201608240809" ::
|
||||
"eu.chainfire" % "libsuperuser" % "1.0.0.201704021214" ::
|
||||
"net.glxn.qrgen" % "android" % "2.0" ::
|
||||
Nil
|
||||
|
||||
lazy val goBuild = TaskKey[Unit]("go-build", "Build go and kcptun")
|
||||
lazy val goBuild = TaskKey[Unit]("go-build", "Build go and overture")
|
||||
goBuild := {
|
||||
Process(Seq("mobile/src/overture/make.bash", minSdkVersion.value)) ! streams.value.log match {
|
||||
case 0 => // Success!
|
||||
|
||||
@@ -0,0 +1,50 @@
|
||||
{
|
||||
"project_info": {
|
||||
"project_number": "261400168171",
|
||||
"firebase_url": "https://admob-app-id-3330146721.firebaseio.com",
|
||||
"project_id": "admob-app-id-3330146721",
|
||||
"storage_bucket": "admob-app-id-3330146721.appspot.com"
|
||||
},
|
||||
"client": [
|
||||
{
|
||||
"client_info": {
|
||||
"mobilesdk_app_id": "1:261400168171:android:dbdd6331c434162f",
|
||||
"android_client_info": {
|
||||
"package_name": "com.github.shadowsocks"
|
||||
}
|
||||
},
|
||||
"oauth_client": [
|
||||
{
|
||||
"client_id": "261400168171-sfik8o3pj7e243583olorh7s5974vab1.apps.googleusercontent.com",
|
||||
"client_type": 1,
|
||||
"android_info": {
|
||||
"package_name": "com.github.shadowsocks",
|
||||
"certificate_hash": "58a90f84cfe99d4280aec677c9a1292fae131677"
|
||||
}
|
||||
},
|
||||
{
|
||||
"client_id": "261400168171-g7aelv5bu012ojr7dod7lq09c9anjimh.apps.googleusercontent.com",
|
||||
"client_type": 3
|
||||
}
|
||||
],
|
||||
"api_key": [
|
||||
{
|
||||
"current_key": "AIzaSyCee3fAad7nb3YsxeUO9mqqHFfAvsSCbVs"
|
||||
}
|
||||
],
|
||||
"services": {
|
||||
"analytics_service": {
|
||||
"status": 1
|
||||
},
|
||||
"appinvite_service": {
|
||||
"status": 1,
|
||||
"other_platform_oauth_client": []
|
||||
},
|
||||
"ads_service": {
|
||||
"status": 2
|
||||
}
|
||||
}
|
||||
}
|
||||
],
|
||||
"configuration_version": "1"
|
||||
}
|
||||
@@ -275,7 +275,7 @@ img {
|
||||
<body>
|
||||
<p>A <a href="http://shadowsocks.org">Shadowsocks</a> client for Android, written in Scala.</p>
|
||||
<p>Copyright (C) 2017 by Max Lv <a href="mailto:max.c.lv@gmail.com">max.c.lv@gmail.com</a></p>
|
||||
<p>Copyright (C) 2017 by Mygod Studio <a href="contact-shadowsocks-android@mygod.be">contact-shadowsocks-android@mygod.be</a></p>
|
||||
<p>Copyright (C) 2017 by Mygod Studio <a href="mailto:contact-shadowsocks-android@mygod.be">contact-shadowsocks-android@mygod.be</a></p>
|
||||
<p>This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
@@ -291,13 +291,13 @@ along with this program. If not, see <a href="http://www.gnu.org/licenses/">http
|
||||
<ul>
|
||||
<li>redsocks: <a href="https://github.com/shadowsocks/redsocks/blob/shadowsocks-android/README">APL 2.0</a></li>
|
||||
<li>mbed TLS: <a href="https://github.com/ARMmbed/mbedtls/blob/development/LICENSE">APL 2.0</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/libevent/blob/master/LICENSE">BSD</a></li>
|
||||
<li>tun2socks: <a href="https://github.com/shadowsocks/badvpn/blob/shadowsocks-android/COPYING">BSD</a></li>
|
||||
<li>pcre: <a href="https://android.googlesource.com/platform/external/pcre/+/master/dist2/LICENCE">BSD</a></li>
|
||||
<li>libancillary: <a href="https://github.com/shadowsocks/libancillary/blob/shadowsocks-android/COPYING">BSD</a></li>
|
||||
<li>shadowsocks-libev: <a href="https://github.com/shadowsocks/shadowsocks-libev/blob/master/LICENSE">GPLv3</a></li>
|
||||
<li>overture: <a href="https://github.com/shawn1m/overture/blob/master/LICENSE">MIT</a></li>
|
||||
<li>libev: <a href="https://github.com/shadowsocks/shadowsocks-libev/blob/master/libev/LICENSE">GPLv2</a></li>
|
||||
<li>libev: <a href="https://github.com/shadowsocks/libev/blob/master/LICENSE">GPLv2</a></li>
|
||||
<li>libsodium: <a href="https://github.com/jedisct1/libsodium/blob/master/LICENSE">ISC</a></li>
|
||||
<li>libudns: <a href="https://github.com/shadowsocks/libudns/blob/master/COPYING.LGPL">LGPL</a></li>
|
||||
</ul>
|
||||
|
||||
@@ -26,10 +26,12 @@ include $(CLEAR_VARS)
|
||||
|
||||
SODIUM_SOURCE := \
|
||||
crypto_aead/chacha20poly1305/sodium/aead_chacha20poly1305.c \
|
||||
crypto_core/salsa20/ref/core_salsa20.c \
|
||||
crypto_generichash/blake2/ref/blake2b-compress-ref.c \
|
||||
crypto_generichash/blake2/ref/blake2b-ref.c \
|
||||
crypto_generichash/blake2/ref/generichash_blake2b.c \
|
||||
crypto_aead/xchacha20poly1305/sodium/aead_xchacha20poly1305.c \
|
||||
crypto_core/hchacha20/core_hchacha20.c \
|
||||
crypto_core/salsa/ref/core_salsa_ref.c \
|
||||
crypto_generichash/blake2b/ref/blake2b-compress-ref.c \
|
||||
crypto_generichash/blake2b/ref/blake2b-ref.c \
|
||||
crypto_generichash/blake2b/ref/generichash_blake2b.c \
|
||||
crypto_onetimeauth/poly1305/onetimeauth_poly1305.c \
|
||||
crypto_onetimeauth/poly1305/donna/poly1305_donna.c \
|
||||
crypto_pwhash/crypto_pwhash.c \
|
||||
@@ -41,10 +43,10 @@ SODIUM_SOURCE := \
|
||||
crypto_pwhash/argon2/pwhash_argon2i.c \
|
||||
crypto_scalarmult/curve25519/scalarmult_curve25519.c \
|
||||
crypto_stream/chacha20/stream_chacha20.c \
|
||||
crypto_stream/chacha20/ref/stream_chacha20_ref.c \
|
||||
crypto_stream/salsa20/ref/stream_salsa20_ref.c \
|
||||
crypto_stream/salsa20/ref/xor_salsa20_ref.c \
|
||||
crypto_verify/16/ref/verify_16.c \
|
||||
crypto_stream/chacha20/ref/chacha20_ref.c \
|
||||
crypto_stream/salsa20/stream_salsa20.c \
|
||||
crypto_stream/salsa20/ref/salsa20_ref.c \
|
||||
crypto_verify/sodium/verify.c \
|
||||
randombytes/randombytes.c \
|
||||
randombytes/sysrandom/randombytes_sysrandom.c \
|
||||
sodium/core.c \
|
||||
|
||||
Submodule mobile/src/main/jni/badvpn updated: 057ed9f364...af4a5647ea
Submodule mobile/src/main/jni/libsodium updated: e160de24fd...70170c28c8
Submodule mobile/src/main/jni/shadowsocks-libev updated: de0cebb62e...33fe5adc19
Binary file not shown.
@@ -7,7 +7,7 @@
|
||||
<string name="profile">"プロファイル"</string>
|
||||
<string name="profile_summary">"新規作成または既存ファイルを開く"</string>
|
||||
<string name="nat">"NAT モード (デバックのみ)"</string>
|
||||
<string name="nat_summary">"VPNモードからNATモードに切り替えるにはROOT権限が必要です"</string>
|
||||
<string name="nat_summary">"VPN モードから NAT モードに切り替えるには ROOT 権限が必要です"</string>
|
||||
<string name="remote_dns">"リモートDNS"</string>
|
||||
<string name="stat_summary">"送信済み: \t%3$s\t↑\t%1$s/s
|
||||
受信済み: \t%4$s\t↓\t%2$s/s"</string>
|
||||
@@ -19,7 +19,6 @@
|
||||
<string name="connection_test_error_status_code">"ステータスコード無効(#%d)"</string>
|
||||
|
||||
<!-- proxy category -->
|
||||
<string name="proxy_cat">"サーバー設定"</string>
|
||||
<string name="profile_name">"サーバー名"</string>
|
||||
<string name="proxy">"サーバーアドレス"</string>
|
||||
<string name="remote_port">"リモートポート"</string>
|
||||
@@ -28,11 +27,8 @@
|
||||
<string name="enc_method">"暗号化方式"</string>
|
||||
|
||||
<!-- feature category -->
|
||||
<string name="feature_cat">"ファンクション設定"</string>
|
||||
<string name="ipv6">"IPv6プロキシ"</string>
|
||||
<string name="ipv6_summary">"リモートサーバーにIPv6パケットを転送"</string>
|
||||
<string name="onetime_auth">"ワンタイム認証"</string>
|
||||
<string name="onetime_auth_summary">"ワンタイム認証を使用する"</string>
|
||||
<string name="ipv6">"IPv6 プロキシ"</string>
|
||||
<string name="ipv6_summary">"リモートサーバーに IPv6 パケットを転送"</string>
|
||||
<string name="route_list">"プロキシ方式"</string>
|
||||
<string name="route_entry_gfwlist">"中国本土からアクセス不可なアドレス以外を迂回する"</string>
|
||||
<string name="proxied_apps">"アプリ別のプロキシを使用"</string>
|
||||
@@ -42,28 +38,25 @@
|
||||
<string name="bypass_apps_summary">"このモードを選択した場合、指定したアプリのパケットはプロキシを経由しない"</string>
|
||||
<string name="auto_connect">"自動接続"</string>
|
||||
<string name="auto_connect_summary">"システム起動時にバックグラウンドで本サービスを開始"</string>
|
||||
<string name="tcp_fastopen_summary">"使用するにはROOT権限が必要"</string>
|
||||
<string name="tcp_fastopen_summary">"使用するには ROOT 権限が必要"</string>
|
||||
<string name="tcp_fastopen_summary_unsupported">"ご利用のカーネルバージョンはサポートしておりません:%s < 3.7.1"</string>
|
||||
<string name="udp_dns">"UDP転送"</string>
|
||||
<string name="udp_dns_summary">"UDPプロトコルでリモードサーバーにパケットを転送"</string>
|
||||
<string name="udp_dns">"DNS 転送"</string>
|
||||
<string name="udp_dns_summary">"DNS プロトコルでリモードサーバーにパケットを転送"</string>
|
||||
|
||||
<!-- notification category -->
|
||||
<string name="forward_success">"バックグラウンドでサービスを開始しました"</string>
|
||||
<string name="invalid_server">"サーバーが無効です"</string>
|
||||
<string name="service_failed">"リモートサーバーに接続できません"</string>
|
||||
<string name="method_unsafe">"注意:現在の暗号化方式は安全ではありません"</string>
|
||||
<string name="nat_deprecated">"注意:Android 5.0及びそれ以降のバージョンではNATモードの使用はお勧めしません"</string>
|
||||
<string name="nat_no_root">"NATモードはROOT権限が必要です"</string>
|
||||
<string name="switch_to_vpn">"VPNモードに切り替える"</string>
|
||||
<string name="nat_deprecated">"注意:Android 5.0 及びそれ以降のバージョンでは NAT モードの使用はお勧めしません"</string>
|
||||
<string name="nat_no_root">"NAT モードは ROOT 権限が必要です"</string>
|
||||
<string name="switch_to_vpn">"VPN モードに切り替える"</string>
|
||||
<string name="stop">"中止"</string>
|
||||
<string name="stopping">"停止中……"</string>
|
||||
<string name="vpn_error">"バックグランドサービスの起動に失敗しました:%s"</string>
|
||||
<string name="reboot_required">"VPNサービスの起動に失敗しました、デバイスの再起動を試みて下さい"</string>
|
||||
<string name="profile_invalid_input">"有効なデータが見つかりません"</string>
|
||||
<string name="reboot_required">"VPN サービスの起動に失敗しました、デバイスの再起動を試みて下さい"</string>
|
||||
<string name="profile_invalid_input">"有効なプロファイルが見つかりません"</string>
|
||||
|
||||
<!-- alert category -->
|
||||
<string name="yes">"はい"</string>
|
||||
<string name="no">"いいえ"</string>
|
||||
<string name="close">"閉じる"</string>
|
||||
<string name="profile_empty">"プロファイルを選択して下さい"</string>
|
||||
<string name="proxy_empty">"サーバアドレスやパスワードの入力が必要です"</string>
|
||||
@@ -74,9 +67,10 @@
|
||||
<!-- menu category -->
|
||||
<string name="profiles">"プロファイル"</string>
|
||||
<string name="settings">"オプション設定"</string>
|
||||
<string name="faq">"質問"</string>
|
||||
<string name="faq">"よくある質問"</string>
|
||||
<string name="recovery">"リセット"</string>
|
||||
<string name="about">"本アプリについて"</string>
|
||||
<string name="about_title">"Shadowsocks %s"</string>
|
||||
<string name="edit">"編集"</string>
|
||||
<string name="share">"共有"</string>
|
||||
<string name="add_profile">"プロファイルを追加"</string>
|
||||
@@ -85,24 +79,22 @@
|
||||
<string name="action_import">"クリップボードからインポート"</string>
|
||||
<string name="action_export_msg">"クリップボードの出力に成功しました"</string>
|
||||
<string name="action_export_err">"クリップボードの出力に失敗しました"</string>
|
||||
<string name="action_import_msg">"インポートは成功しました"</string>
|
||||
<string name="action_import_err">"インポートは失敗しました"</string>
|
||||
<string name="action_import_msg">"インポートに成功しました"</string>
|
||||
<string name="action_import_err">"インポートに失敗しました"</string>
|
||||
|
||||
<!-- profile -->
|
||||
<string name="profile_config">"プロファイル編集"</string>
|
||||
<string name="unsaved_changes_prompt">"編集は保存されておりません、保存しますか?"</string>
|
||||
<string name="apply">"適応する"</string>
|
||||
<string name="delete">"削除する"</string>
|
||||
<string name="delete_confirm_prompt">"このプロファイルを削除しますか?"</string>
|
||||
<string name="share_qr_nfc">"QRコード/NFC"</string>
|
||||
<string name="add_profile_dialog">"シャドーソックスにプロファイルを追加しますか"</string>
|
||||
<string name="add_profile_methods_scan_qr_code">"QRコードを読み取る"</string>
|
||||
<string name="add_profile_methods_manual_settings">"手動でセットアップ"</string>
|
||||
<string name="delete">"削除"</string>
|
||||
<string name="delete_confirm_prompt">"このプロファイルを削除しますか"</string>
|
||||
<string name="share_qr_nfc">"QR コード / NFC"</string>
|
||||
<string name="add_profile_dialog">"Shadowsocks用プロファイルを追加しますか"</string>
|
||||
<string name="add_profile_methods_scan_qr_code">"QR コードを読み取る"</string>
|
||||
<string name="add_profile_methods_manual_settings">"手動設定"</string>
|
||||
<string name="add_profile_scanner_not_installed">"Zxingに準拠したQRコードスキャンアプリをインストールして下さい"</string>
|
||||
<plurals name="removed">
|
||||
<item quantity="other">"削除済み"</item>
|
||||
</plurals>
|
||||
<string name="undo">"撤回"</string>
|
||||
<string name="undo">"元に戻す"</string>
|
||||
|
||||
<!-- tasker -->
|
||||
<string name="toggle_service_state">"サービスを開始"</string>
|
||||
@@ -114,28 +106,30 @@
|
||||
<!-- status -->
|
||||
<string name="sent">"送信済み:"</string>
|
||||
<string name="received">"受信済み:"</string>
|
||||
<string name="connecting">"接続中..."</string>
|
||||
<string name="connecting">"接続中…"</string>
|
||||
<string name="vpn_connected">"接続済み、タップして接続状況をチェック"</string>
|
||||
<string name="nat_connected">"接続済み"</string>
|
||||
<string name="not_connected">"接続されませんでした"</string>
|
||||
|
||||
<!-- kcp -->
|
||||
<string name="kcp_summary">"KCP プロトコル を有効にする"</string>
|
||||
<string name="kcp_port">"KCP ポート"</string>
|
||||
<string name="kcp_port_summary">"%d(リモート KCPTUN サーバーのポート番号)"</string>
|
||||
<string name="kcpcli">"KCP パラメータ"</string>
|
||||
<string name="not_connected">"未接続"</string>
|
||||
|
||||
<!-- acl -->
|
||||
<string name="custom_rules">"カスタムルール"</string>
|
||||
<string name="action_selection">"選択"</string>
|
||||
<string name="action_add_rule">"ルールを追加"</string>
|
||||
<string name="action_add_rule">"ルールを追加…"</string>
|
||||
<string name="edit_rule">"ルールを編集"</string>
|
||||
<string name="route_entry_all">"すべて"</string>
|
||||
<string name="route_entry_bypass_lan">"LANアドレスを迂回する"</string>
|
||||
<string name="route_entry_bypass_lan">"LAN アドレスを迂回する"</string>
|
||||
<string name="route_entry_bypass_chn">"中国本土のアドレスを迂回する"</string>
|
||||
<string name="route_entry_bypass_lan_chn">"LAN及び中国本土のアドレスを迂回する"</string>
|
||||
<string name="route_entry_bypass_lan_chn">"LAN 及び中国本土のアドレスを迂回する"</string>
|
||||
<string name="route_entry_chinalist">"中国本土のアドレス以外を迂回する"</string>
|
||||
<string name="proxied_apps_summary_v21">"選択したアプリにプロキシを設定する"</string>
|
||||
<string name="acl_rule_templates_generic">"サブネット/ホストネームPCREパターン"</string>
|
||||
<string name="acl_rule_templates_domain">"ドメイン及びサブドメイン"</string>
|
||||
<string name="acl_rule_templates_generic">"サブネット/ホスト名 PCRE パターン"</string>
|
||||
<string name="acl_rule_templates_domain">"ドメイン及び全てのサブドメイン"</string>
|
||||
|
||||
<!-- plugin -->
|
||||
<string name="plugin">"プラグイン"</string>
|
||||
<string name="plugin_configure">"設定..."</string>
|
||||
<string name="plugin_disabled">"無効"</string>
|
||||
<string name="plugin_unknown">"不明なプラグイン"</string>
|
||||
<string name="plugin_untrusted">"警告:このプラグインは信頼されていないソースからの可能性があります"</string>
|
||||
<string name="profile_plugin">"プラグイン"</string>
|
||||
</resources>
|
||||
@@ -0,0 +1,48 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="quick_toggle">"켜기/끄기"</string>
|
||||
|
||||
<!-- misc -->
|
||||
<string name="profile">"프로필"</string>
|
||||
<string name="profile_summary">"다른 프로필로 전환하거나 새 프로필 추가"</string>
|
||||
<string name="nat">"NAT 모드 (지원 중단)"</string>
|
||||
<string name="nat_summary">"VPN 모드 대신 NAT 모드를 사용합니다. 루트 권한이 필요합니다."</string>
|
||||
<string name="remote_dns">"원격 DNS"</string>
|
||||
<string name="stat_summary">"송신: \t\t\t\t\t%3$s\t↑\t%1$s/s
|
||||
수신: \t%4$s\t↓\t%2$s/s "</string>
|
||||
<string name="stat_profiles">"%1$s↑\t%2$s↓"</string>
|
||||
<string name="traffic_summary">"%1$s/s↑\t%2$s/s↓"</string>
|
||||
<plurals name="bytes">
|
||||
<item quantity="other">"바이트"</item>
|
||||
</plurals>
|
||||
<string name="connection_test_pending">"인터넷 연결 상태 검사하기"</string>
|
||||
<string name="connection_test_testing">"검사 중…"</string>
|
||||
<string name="connection_test_available">"성공: %dms"</string>
|
||||
<string name="connection_test_error">"인터넷 연결을 찾을 수 없습니다: %s"</string>
|
||||
<string name="connection_test_fail">"인터넷에 연결할 수 없습니다"</string>
|
||||
<string name="connection_test_error_status_code">"오류 코드: #%d"</string>
|
||||
|
||||
<!-- proxy category -->
|
||||
<string name="profile_name">"프로필 이름"</string>
|
||||
<string name="proxy">"서버 주소"</string>
|
||||
<string name="remote_port">"원격 포트"</string>
|
||||
<string name="port">"로컬 포트"</string>
|
||||
<string name="sitekey">"비밀번호"</string>
|
||||
<string name="enc_method">"암호화 방법"</string>
|
||||
|
||||
<!-- feature category -->
|
||||
<string name="ipv6">"IPv6 라우팅"</string>
|
||||
<string name="ipv6_summary">"IPv6 트래픽도 원격으로 리다이렉트 합니다"</string>
|
||||
<string name="route_list">"라우팅 대상"</string>
|
||||
<string name="proxied_apps">"원하는 앱만 프락시 적용하기"</string>
|
||||
<string name="proxied_apps_summary">"선택한 앱에만 프락시를 적용합니다. Android 4.x 이하에서는 NAT 모드를 써야 합니다."</string>
|
||||
<string name="on">"활성화"</string>
|
||||
<string name="bypass_apps">"선택된 앱들만 프록시 적용 제외하기"</string>
|
||||
<string name="bypass_apps_summary">"이 옵션을 활성화하면 선택된 앱들은 프락시를 사용하지 않습니다"</string>
|
||||
<string name="auto_connect">"자동 접속"</string>
|
||||
<string name="auto_connect_summary">"장치가 켜질 때 Shadowsocks를 자동으로 활성화합니다"</string>
|
||||
<string name="tcp_fastopen_summary">"루트 권한이 필요합니다"</string>
|
||||
<string name="tcp_fastopen_summary_unsupported">"지원하지 않는 버전의 커널입니다: %s < 3.7.1"</string>
|
||||
<string name="udp_dns">"DNS 포워딩"</string>
|
||||
<string name="udp_dns_summary">"모든 DNS 요청을 외부로 포워딩 합니다"</string>
|
||||
</resources>
|
||||
@@ -2,26 +2,31 @@
|
||||
<resources>
|
||||
<string name="quick_toggle">"Подключение"</string>
|
||||
|
||||
<!-- global/misc category -->
|
||||
<string name="misc_cat">"Разное"</string>
|
||||
<!-- misc -->
|
||||
<string name="profile">"Профиль"</string>
|
||||
<string name="profile_summary">"Переключить на другой профиль или добавить новые"</string>
|
||||
<string name="nat">"Режим NAT (не рекомендуется)"</string>
|
||||
<string name="nat_summary">"Использовать режим NAT вместо VPN. Требует ROOT прав."</string>
|
||||
<string name="stat_summary">"Отправлено: \t\t\t\t\t%3$s\t↑\t%1$s/s
|
||||
<string name="remote_dns">"Удалённый DNS"</string>
|
||||
<string name="stat_summary">"Отправлено: \t%3$s\t↑\t%1$s/s
|
||||
Получено: \t%4$s\t↓\t%2$s/s"</string>
|
||||
<string name="stat_profiles">"
|
||||
%1$s↑\t%2$s↓"</string>
|
||||
<string name="traffic_summary">"%1$s/s↑\t%2$s/s↓"</string>
|
||||
<string name="connection_test_pending">"Проверить подключение"</string>
|
||||
<plurals name="bytes">
|
||||
<item quantity="one">"байт"</item>
|
||||
<item quantity="few">"байта"</item>
|
||||
<item quantity="many">"байт"</item>
|
||||
<item quantity="other">"байт"</item>
|
||||
</plurals>
|
||||
<string name="connection_test_pending">"Проверить соединение"</string>
|
||||
<string name="connection_test_testing">"Проверка…"</string>
|
||||
<string name="connection_test_available">"Успешно: %dms задержка"</string>
|
||||
<string name="connection_test_error">"Сбой проверки интернет подключения: %s"</string>
|
||||
<string name="connection_test_fail">"Интернет Недоступен"</string>
|
||||
<string name="connection_test_available">"Успешно: задержка %d мс"</string>
|
||||
<string name="connection_test_error">"Сбой проверки интернет-соединения: %s"</string>
|
||||
<string name="connection_test_fail">"Интернет недоступен"</string>
|
||||
<string name="connection_test_error_status_code">"Код ошибки: #%d"</string>
|
||||
|
||||
<!-- proxy category -->
|
||||
<string name="proxy_cat">"Настройки Сервера"</string>
|
||||
<string name="profile_name">"Имя Профиля"</string>
|
||||
<string name="proxy">"Сервер"</string>
|
||||
<string name="remote_port">"Удалённый порт"</string>
|
||||
@@ -30,17 +35,8 @@
|
||||
<string name="enc_method">"Метод Шифрования"</string>
|
||||
|
||||
<!-- feature category -->
|
||||
<string name="feature_cat">"Дополнительные Настройки"</string>
|
||||
<string name="ipv6">"IPv6 Маршрут"</string>
|
||||
<string name="ipv6_summary">"Перенаправлять IPv6 траффик на удалённый сервер"</string>
|
||||
<string name="onetime_auth">"Единоразовая Аутентификация"</string>
|
||||
<string name="onetime_auth_summary">"Включить единоразовую аутентификацию"</string>
|
||||
<string name="http_proxy">"HTTP Прокси"</string>
|
||||
<string name="http_proxy_summary">"Локальный HTTP прокси"</string>
|
||||
<string name="dns_proxy">"DNS Прокси"</string>
|
||||
<string name="dns_proxy_summary">"Перенаправлять DNS запросы на удалённый сервер"</string>
|
||||
<string name="auto_set_gfwlist">"CHN Маршрут"</string>
|
||||
<string name="auto_set_gfwlist_summary">"Игнорировать все сайты находящиеся в Китае"</string>
|
||||
<string name="ipv6_summary">"Перенаправлять трафик IPv6 на удалённый сервер"</string>
|
||||
<string name="route_list">"Маршрут"</string>
|
||||
<string name="route_entry_gfwlist">"Список GFW"</string>
|
||||
<string name="proxied_apps">"Прокси для выбранных приложений"</string>
|
||||
@@ -52,27 +48,26 @@
|
||||
<string name="auto_connect_summary">"Запускать Shadowsocks при включении"</string>
|
||||
<string name="tcp_fastopen_summary">"Переключение требует наличия ROOT прав"</string>
|
||||
<string name="tcp_fastopen_summary_unsupported">"Неподдерживаемая версия ядра: %s < 3.7.1"</string>
|
||||
<string name="udp_dns">"Проброс UDP"</string>
|
||||
<string name="udp_dns_summary">"Пробрасывать UDP пакеты на удалённый сервер"</string>
|
||||
<string name="udp_dns">"Перенаправление DNS"</string>
|
||||
<string name="udp_dns_summary">"Перенаправлять все DNS-запросы на удалённый сервер"</string>
|
||||
|
||||
<!-- notification category -->
|
||||
<string name="forward_success">"Shadowsocks запущен."</string>
|
||||
<string name="invalid_server">"Неправильное имя сервера"</string>
|
||||
<string name="service_failed">"Ошибка при подключении к удалённому серверу"</string>
|
||||
<string name="method_unsafe">"ВНИМАНИЕ:В настоящее время метод шифрования является небезопасным"</string>
|
||||
<string name="nat_deprecated">"ВНИМАНИЕ:режим NAT не работает в Android 5.0"</string>
|
||||
<string name="nat_deprecated">"ВНИМАНИЕ: режим NAT не рекомендуется, начиная с Android 5.0"</string>
|
||||
<string name="nat_no_root">"Режим NAT требует наличия ROOT прав"</string>
|
||||
<string name="switch_to_vpn">"Переключить на режим VPN"</string>
|
||||
<string name="stop">"Остановить"</string>
|
||||
<string name="stopping">"Останавливается…"</string>
|
||||
<string name="vpn_error">"%s"</string>
|
||||
<string name="reboot_required">"Сбой запуска VPN сервиса. Требуется перезагрузка Вашего устройства."</string>
|
||||
<string name="reboot_required">"Не удалось запустить службу VPN. Возможно, требуется перезагрузить ваше устройство."</string>
|
||||
|
||||
<!-- alert category -->
|
||||
<string name="close">"Закрыть"</string>
|
||||
<string name="profile_empty">"Пожалуйста, выберите профиль"</string>
|
||||
<string name="proxy_empty">"Прокси/Пароль не должны быть пустыми"</string>
|
||||
<string name="connect">"Подключить"</string>
|
||||
<string name="initializing">"Инициализация…"</string>
|
||||
<string name="recovering">"Сброс…"</string>
|
||||
<string name="loading">"Загрузка…"</string>
|
||||
<string name="remove_profile">"Удалить этот профиль %s?"</string>
|
||||
|
||||
<!-- menu category -->
|
||||
@@ -81,11 +76,8 @@
|
||||
<string name="recovery">"Сброс"</string>
|
||||
<string name="about">"О приложении"</string>
|
||||
<string name="about_title">"Shadowsocks %s"</string>
|
||||
<string name="edit">"Изменить"</string>
|
||||
<string name="share">"Поделиться"</string>
|
||||
<string name="flush_dnscache">"Очистить кэш DNS"</string>
|
||||
<string name="flush_dnscache_summary">"Работает только в режиме NAT. Требует наличия ROOT прав."</string>
|
||||
<string name="flush_dnscache_no_root">"Очистка кэша DNS не работает без налиичя ROOT прав"</string>
|
||||
<string name="flushing">"Очистка"</string>
|
||||
<string name="add_profile">"Добавить Профиль"</string>
|
||||
<string name="action_apply_all">"Применить настройки для всех профилей"</string>
|
||||
<string name="action_export">"Экспортировать в буфер обмена"</string>
|
||||
@@ -94,13 +86,26 @@
|
||||
<string name="action_export_err">"Сбой экспорта."</string>
|
||||
<string name="action_import_msg">"Успешный импорт!"</string>
|
||||
<string name="action_import_err">"Сбой импорта."</string>
|
||||
|
||||
<!-- profile -->
|
||||
<string name="profile_config">"Настройка профиля"</string>
|
||||
<string name="delete">"Удалить"</string>
|
||||
<string name="delete_confirm_prompt">"Вы уверены, что хотите удалить этот профиль?"</string>
|
||||
<string name="share_qr_nfc">"QR-код/NFC"</string>
|
||||
<string name="add_profile_dialog">"Добавить этот Профиль Shadowsocks?"</string>
|
||||
<string name="add_profile_methods_scan_qr_code">"Сканировать QR код"</string>
|
||||
<string name="add_profile_methods_manual_settings">"Настройка вручную"</string>
|
||||
<string name="add_profile_methods_scan_qr_code">"Сканировать QR-код"</string>
|
||||
<string name="add_profile_methods_manual_settings">"Ручные настройки"</string>
|
||||
<string name="add_profile_scanner_not_installed">"Пожалуйста, установите любое ZXing-совместимое приложение для сканирования QR-кодов."</string>
|
||||
<plurals name="removed">
|
||||
<item quantity="one">"Удалено"</item>
|
||||
<item quantity="few">"Удалено %d элемента"</item>
|
||||
<item quantity="many">"Удалено %d элементов"</item>
|
||||
<item quantity="other">"Удалено %d элементов"</item>
|
||||
</plurals>
|
||||
<string name="undo">"Вернуть"</string>
|
||||
|
||||
<!-- tasker -->
|
||||
<string name="toggle_service_state">"Запустить сервисStart the service"</string>
|
||||
<string name="toggle_service_state">"Запустить службу"</string>
|
||||
<string name="start_service_default">"Подключиться к текущему серверу"</string>
|
||||
<string name="start_service">"Подключиться к %s"</string>
|
||||
<string name="stop_service">"Переключить на %s"</string>
|
||||
@@ -109,16 +114,30 @@
|
||||
<!-- status -->
|
||||
<string name="sent">"Отправлено:"</string>
|
||||
<string name="received">"Получено:"</string>
|
||||
<string name="connecting">"Соединение..."</string>
|
||||
<string name="vpn_connected">"Подключено, нажмите для проверки соединения"</string>
|
||||
<string name="nat_connected">"Подключено"</string>
|
||||
<string name="not_connected">"Не подключено"</string>
|
||||
|
||||
<!-- kcp -->
|
||||
<string name="kcp_summary">"Включить Shadowsocks над KCPTUN"</string>
|
||||
<string name="kcp_port">"KCP порт"</string>
|
||||
<string name="kcp_port_summary">"%d (KCPTUN омер порта удалённого сервера)"</string>
|
||||
<string name="kcpcli">"KCP параметры"</string>
|
||||
<!-- acl -->
|
||||
<string name="custom_rules">"Пользовательские правила"</string>
|
||||
<string name="action_selection">"Выделение..."</string>
|
||||
<string name="action_add_rule">"Добавить правило..."</string>
|
||||
<string name="edit_rule">"Редактировать правило"</string>
|
||||
<string name="route_entry_all">"Все"</string>
|
||||
<string name="route_entry_bypass_lan">"Обход LAN"</string>
|
||||
<string name="route_entry_bypass_chn">"Обходной Китай"</string>
|
||||
<string name="route_entry_bypass_lan_chn">"Обход LAN и Китай"</string>
|
||||
<string name="route_entry_bypass_lan">"Все, кроме LAN"</string>
|
||||
<string name="route_entry_bypass_chn">"Все, кроме Китая"</string>
|
||||
<string name="route_entry_bypass_lan_chn">"Все, кроме LAN и Китая"</string>
|
||||
<string name="route_entry_chinalist">"Список Китай"</string>
|
||||
<string name="proxied_apps_summary_v21">"Установить прокси для выбранных приложений"</string>
|
||||
<string name="acl_rule_templates_generic">"Подсеть/Регулярное выражение (PCRE) имени хоста"</string>
|
||||
<string name="acl_rule_templates_domain">"Доменное имя и все его поддомены"</string>
|
||||
|
||||
<!-- plugin -->
|
||||
<string name="plugin">"Плагин"</string>
|
||||
<string name="plugin_configure">"Настроить..."</string>
|
||||
<string name="plugin_disabled">"Отключён"</string>
|
||||
<string name="plugin_unknown">"Неизвестный плагин %s"</string>
|
||||
<string name="plugin_untrusted">"Предупреждение: этот плагин получен из недоверенного источника."</string>
|
||||
<string name="profile_plugin">"Плагин: %s"</string>
|
||||
</resources>
|
||||
@@ -20,7 +20,6 @@
|
||||
<string name="connection_test_error_status_code">"状态码无效(#%d)"</string>
|
||||
|
||||
<!-- proxy category -->
|
||||
<string name="proxy_cat">"服务器设置"</string>
|
||||
<string name="profile_name">"配置名称"</string>
|
||||
<string name="proxy">"服务器"</string>
|
||||
<string name="remote_port">"远程端口"</string>
|
||||
@@ -29,11 +28,8 @@
|
||||
<string name="enc_method">"加密方法"</string>
|
||||
|
||||
<!-- feature category -->
|
||||
<string name="feature_cat">"功能设置"</string>
|
||||
<string name="ipv6">"IPv6 路由"</string>
|
||||
<string name="ipv6_summary">"向远程服务器转发 IPv6 流量"</string>
|
||||
<string name="onetime_auth">"一次性认证"</string>
|
||||
<string name="onetime_auth_summary">"启用一次性认证"</string>
|
||||
<string name="route_list">"路由"</string>
|
||||
<string name="route_entry_gfwlist">"仅代理中国大陆无法访问的地址"</string>
|
||||
<string name="proxied_apps">"分应用代理"</string>
|
||||
@@ -45,14 +41,13 @@
|
||||
<string name="auto_connect_summary">"随系统启动后台服务"</string>
|
||||
<string name="tcp_fastopen_summary">"切换需要 ROOT 权限"</string>
|
||||
<string name="tcp_fastopen_summary_unsupported">"不支持的内核版本:%s < 3.7.1"</string>
|
||||
<string name="udp_dns">"UDP 转发"</string>
|
||||
<string name="udp_dns_summary">"由远程服务器转发 UDP 协议的数据包"</string>
|
||||
<string name="udp_dns">"DNS 转发"</string>
|
||||
<string name="udp_dns_summary">"通过 UDP 将所有 DNS 查询全部转发至远程服务器"</string>
|
||||
|
||||
<!-- notification category -->
|
||||
<string name="forward_success">"后台服务已开始运行。"</string>
|
||||
<string name="invalid_server">"服务器名无效"</string>
|
||||
<string name="service_failed">"无法连接远程服务器"</string>
|
||||
<string name="method_unsafe">"警告:当前使用的加密算法不安全"</string>
|
||||
<string name="nat_deprecated">"警告:在 Android 5.0 及更高版本中不建议使用 NAT 模式"</string>
|
||||
<string name="nat_no_root">"NAT 模式需要 ROOT 权限"</string>
|
||||
<string name="switch_to_vpn">"切换到 VPN 模式"</string>
|
||||
@@ -63,14 +58,12 @@
|
||||
<string name="profile_invalid_input">"未找到有效的配置文件。"</string>
|
||||
|
||||
<!-- alert category -->
|
||||
<string name="yes">"是"</string>
|
||||
<string name="no">"否"</string>
|
||||
<string name="close">"关闭"</string>
|
||||
<string name="profile_empty">"请选择配置文件"</string>
|
||||
<string name="proxy_empty">"代理服务器地址及密码不能为空"</string>
|
||||
<string name="connect">"连接"</string>
|
||||
<string name="recovering">"重置中…"</string>
|
||||
<string name="remove_profile">"删除此配置文件「%s」?"</string>
|
||||
<string name="remove_profile">"删除此配置文件“%s”?"</string>
|
||||
|
||||
<!-- menu category -->
|
||||
<string name="profiles">"配置文件"</string>
|
||||
@@ -92,8 +85,6 @@
|
||||
|
||||
<!-- profile -->
|
||||
<string name="profile_config">"配置文件设置"</string>
|
||||
<string name="unsaved_changes_prompt">"保存修改吗?"</string>
|
||||
<string name="apply">"应用"</string>
|
||||
<string name="delete">"删除"</string>
|
||||
<string name="delete_confirm_prompt">"您确定要删除此配置文件?"</string>
|
||||
<string name="share_qr_nfc">"二维码 / NFC"</string>
|
||||
@@ -121,12 +112,6 @@
|
||||
<string name="nat_connected">"已连接"</string>
|
||||
<string name="not_connected">"未连接"</string>
|
||||
|
||||
<!-- kcp -->
|
||||
<string name="kcp_summary">"启用 KCP 协议"</string>
|
||||
<string name="kcp_port">"KCP 端口"</string>
|
||||
<string name="kcp_port_summary">"%d(远端 KCPTUN 服务器的端口号)"</string>
|
||||
<string name="kcpcli">"KCP 参数"</string>
|
||||
|
||||
<!-- acl -->
|
||||
<string name="custom_rules">"自定义规则"</string>
|
||||
<string name="action_selection">"选择…"</string>
|
||||
@@ -140,4 +125,12 @@
|
||||
<string name="proxied_apps_summary_v21">"为应用程序分别设置代理"</string>
|
||||
<string name="acl_rule_templates_generic">"子网/域名 PCRE 正则表达式"</string>
|
||||
<string name="acl_rule_templates_domain">"域名及其子域名"</string>
|
||||
|
||||
<!-- plugin -->
|
||||
<string name="plugin">"插件"</string>
|
||||
<string name="plugin_configure">"配置…"</string>
|
||||
<string name="plugin_disabled">"禁用"</string>
|
||||
<string name="plugin_unknown">"未知插件 %s"</string>
|
||||
<string name="plugin_untrusted">"警告:该插件似乎并非来自已知的可信源。"</string>
|
||||
<string name="profile_plugin">"插件:%s"</string>
|
||||
</resources>
|
||||
@@ -2,8 +2,7 @@
|
||||
<resources>
|
||||
<string name="quick_toggle">"切換"</string>
|
||||
|
||||
<!-- global/misc category -->
|
||||
<string name="misc_cat">"其他"</string>
|
||||
<!-- misc -->
|
||||
<string name="profile">"設定檔"</string>
|
||||
<string name="profile_summary">"切換至其他設定檔或新增新設定檔"</string>
|
||||
<string name="nat">"NAT 模式 (已過時)"</string>
|
||||
@@ -19,7 +18,6 @@
|
||||
<string name="connection_test_error_status_code">"錯誤碼: #%d"</string>
|
||||
|
||||
<!-- proxy category -->
|
||||
<string name="proxy_cat">"伺服器設定"</string>
|
||||
<string name="profile_name">"設定檔名稱"</string>
|
||||
<string name="proxy">"伺服器"</string>
|
||||
<string name="remote_port">"遠端連接埠"</string>
|
||||
@@ -28,11 +26,8 @@
|
||||
<string name="enc_method">"加密方法"</string>
|
||||
|
||||
<!-- feature category -->
|
||||
<string name="feature_cat">"功能設定"</string>
|
||||
<string name="ipv6">"IPv6 路由"</string>
|
||||
<string name="ipv6_summary">"向遠端重新導向 IPv6 流量"</string>
|
||||
<string name="onetime_auth">"單次驗證"</string>
|
||||
<string name="onetime_auth_summary">"啟用單次驗證"</string>
|
||||
<string name="route_list">"路由"</string>
|
||||
<string name="route_entry_gfwlist">"GFW List"</string>
|
||||
<string name="proxied_apps">"個別應用程式的 Proxy"</string>
|
||||
@@ -44,14 +39,13 @@
|
||||
<string name="auto_connect_summary">"在裝置啟動時啟用 Shadowsocks"</string>
|
||||
<string name="tcp_fastopen_summary">"切換需要 ROOT 權限"</string>
|
||||
<string name="tcp_fastopen_summary_unsupported">"不支援的核心版本:%s < 3.7.1"</string>
|
||||
<string name="udp_dns">"UDP 轉送"</string>
|
||||
<string name="udp_dns_summary">"向遠端轉送 UDP 封包"</string>
|
||||
<string name="udp_dns">"DNS 轉送"</string>
|
||||
<string name="udp_dns_summary">"使用 UDP 向遠端轉送 DNS 封包"</string>
|
||||
|
||||
<!-- notification category -->
|
||||
<string name="forward_success">"Shadowsocks 已啟動。"</string>
|
||||
<string name="invalid_server">"伺服器名稱無效"</string>
|
||||
<string name="service_failed">"連線至遠端伺服器失敗"</string>
|
||||
<string name="method_unsafe">"警告:目前使用的加密方法不安全"</string>
|
||||
<string name="nat_deprecated">"警告:自 Android 5.0 開始, NAT 模式已過時"</string>
|
||||
<string name="nat_no_root">"NAT 模式需要 ROOT 權限"</string>
|
||||
<string name="switch_to_vpn">"切換至 VPN 模式"</string>
|
||||
@@ -62,8 +56,6 @@
|
||||
<string name="profile_invalid_input">"未找到有效的設定檔資料。"</string>
|
||||
|
||||
<!-- alert category -->
|
||||
<string name="yes">"是"</string>
|
||||
<string name="no">"否"</string>
|
||||
<string name="close">"關閉"</string>
|
||||
<string name="profile_empty">"請選擇設定檔"</string>
|
||||
<string name="proxy_empty">"Proxy 或密碼不可以空白"</string>
|
||||
@@ -91,8 +83,6 @@
|
||||
|
||||
<!-- profile -->
|
||||
<string name="profile_config">"設定檔設定"</string>
|
||||
<string name="unsaved_changes_prompt">"要儲存變更嗎?"</string>
|
||||
<string name="apply">"套用"</string>
|
||||
<string name="delete">"刪除"</string>
|
||||
<string name="delete_confirm_prompt">"您確定要移除這個設定檔嗎?"</string>
|
||||
<string name="share_qr_nfc">"QR 碼 / NFC"</string>
|
||||
@@ -120,12 +110,6 @@
|
||||
<string name="nat_connected">"已連線"</string>
|
||||
<string name="not_connected">"未連線"</string>
|
||||
|
||||
<!-- kcp -->
|
||||
<string name="kcp_summary">"啟用 KCP 協定"</string>
|
||||
<string name="kcp_port">"KCP 連接埠"</string>
|
||||
<string name="kcp_port_summary">"%d(遠端 KCPTUN 伺服器的連接埠號碼)"</string>
|
||||
<string name="kcpcli">"KCP 參數 (CLI)"</string>
|
||||
|
||||
<!-- acl -->
|
||||
<string name="custom_rules">"自訂規則"</string>
|
||||
<string name="action_selection">"選擇…"</string>
|
||||
@@ -139,4 +123,12 @@
|
||||
<string name="proxied_apps_summary_v21">"為已選擇的應用程式設定 Proxy"</string>
|
||||
<string name="acl_rule_templates_generic">"子網路/主機名稱 PCRE 模式"</string>
|
||||
<string name="acl_rule_templates_domain">"網域及其所有子網域"</string>
|
||||
</resources>
|
||||
|
||||
<!-- plugin -->
|
||||
<string name="plugin">"插件"</string>
|
||||
<string name="plugin_configure">"配置..."</string>
|
||||
<string name="plugin_disabled">"未啟用"</string>
|
||||
<string name="plugin_unknown">"未知插件 %s"</string>
|
||||
<string name="plugin_untrusted">"警告:該插件似乎不是來自一個已知的可信任源。"</string>
|
||||
<string name="profile_plugin">"插件: %s"</string>
|
||||
</resources>
|
||||
|
||||
@@ -19,6 +19,7 @@
|
||||
<item>AES-192-GCM</item>
|
||||
<item>AES-256-GCM</item>
|
||||
<item>CHACHA20-IETF-POLY1305</item>
|
||||
<item>XCHACHA20-IETF-POLY1305</item>
|
||||
</string-array>
|
||||
|
||||
<string-array name="enc_method_value">
|
||||
@@ -40,6 +41,7 @@
|
||||
<item>aes-192-gcm</item>
|
||||
<item>aes-256-gcm</item>
|
||||
<item>chacha20-ietf-poly1305</item>
|
||||
<item>xchacha20-ietf-poly1305</item>
|
||||
</string-array>
|
||||
|
||||
<string-array name="route_entry">
|
||||
|
||||
@@ -4,8 +4,7 @@
|
||||
<string name="app_name">Shadowsocks</string>
|
||||
<string name="quick_toggle">Toggle</string>
|
||||
|
||||
<!-- global/misc category -->
|
||||
<string name="misc_cat">Misc</string>
|
||||
<!-- misc -->
|
||||
<string name="profile">Profile</string>
|
||||
<string name="profile_summary">Switch to another profile or add new profiles</string>
|
||||
<string name="nat">NAT mode (deprecated)</string>
|
||||
@@ -53,8 +52,8 @@
|
||||
<string name="auto_connect_summary">Enable Shadowsocks on startup</string>
|
||||
<string name="tcp_fastopen_summary">Toggling requires ROOT permission</string>
|
||||
<string name="tcp_fastopen_summary_unsupported">Unsupported kernel version: %s < 3.7.1</string>
|
||||
<string name="udp_dns">UDP Forwarding</string>
|
||||
<string name="udp_dns_summary">Forward UDP packets to remote</string>
|
||||
<string name="udp_dns">DNS Forwarding</string>
|
||||
<string name="udp_dns_summary">Forward all DNS requests to remote</string>
|
||||
|
||||
<!-- notification category -->
|
||||
<string name="forward_success">Shadowsocks started.</string>
|
||||
|
||||
@@ -0,0 +1,7 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<defaultsMap>
|
||||
<entry>
|
||||
<key>proxy_url</key>
|
||||
<value>https://www.socks123.pw/get.php</value>
|
||||
</entry>
|
||||
</defaultsMap>
|
||||
@@ -21,10 +21,11 @@
|
||||
package com.github.shadowsocks
|
||||
|
||||
import java.io.{File, IOException}
|
||||
import java.net.InetAddress
|
||||
import java.util
|
||||
import java.util.concurrent.TimeUnit
|
||||
import java.util.{Timer, TimerTask}
|
||||
import java.net.InetAddress
|
||||
import java.net.Inet6Address
|
||||
|
||||
import android.app.Service
|
||||
import android.content.{BroadcastReceiver, Context, Intent, IntentFilter}
|
||||
@@ -124,12 +125,9 @@ trait BaseService extends Service {
|
||||
} else true
|
||||
|
||||
def connect() {
|
||||
if (profile.host == "198.199.101.152") {
|
||||
val holder = app.containerHolder
|
||||
val container = holder.getContainer
|
||||
val url = container.getString("proxy_url")
|
||||
val sig = Utils.getSignature(this)
|
||||
profile.name = profile.getName // save original name before it's (possibly) overwritten by IP addresses
|
||||
|
||||
if (profile.host == "198.199.101.152") {
|
||||
val client = new OkHttpClient.Builder()
|
||||
.dns(hostname => Utils.resolve(hostname, enableIPv6 = false) match {
|
||||
case Some(ip) => util.Arrays.asList(InetAddress.getByName(ip))
|
||||
@@ -140,10 +138,10 @@ trait BaseService extends Service {
|
||||
.readTimeout(30, TimeUnit.SECONDS)
|
||||
.build()
|
||||
val requestBody = new FormBody.Builder()
|
||||
.add("sig", sig)
|
||||
.add("sig", Utils.getSignature(this))
|
||||
.build()
|
||||
val request = new Request.Builder()
|
||||
.url(url)
|
||||
.url(app.remoteConfig.getString("proxy_url"))
|
||||
.post(requestBody)
|
||||
.build()
|
||||
|
||||
@@ -274,7 +272,6 @@ trait BaseService extends Service {
|
||||
|
||||
override def onCreate() {
|
||||
super.onCreate()
|
||||
app.refreshContainerHolder()
|
||||
app.updateAssets()
|
||||
}
|
||||
|
||||
@@ -299,23 +296,12 @@ trait BaseService extends Service {
|
||||
}
|
||||
}
|
||||
|
||||
def getBlackList: String = {
|
||||
val default = getString(R.string.black_list)
|
||||
try {
|
||||
val container = app.containerHolder.getContainer
|
||||
val update = container.getString("black_list_lite")
|
||||
val list = if (update == null || update.isEmpty) default else update
|
||||
"exclude = " + list + ";"
|
||||
} catch {
|
||||
case _: Exception => "exclude = " + default + ";"
|
||||
}
|
||||
}
|
||||
|
||||
protected def buildPluginCommandLine(): ArrayBuffer[String] = {
|
||||
val result = ArrayBuffer(pluginPath)
|
||||
if (TcpFastOpen.sendEnabled) result += "--fast-open"
|
||||
result
|
||||
}
|
||||
|
||||
protected final def buildShadowsocksConfig(file: String): String = {
|
||||
val config = new JSONObject()
|
||||
.put("server", profile.host)
|
||||
@@ -331,7 +317,7 @@ trait BaseService extends Service {
|
||||
|
||||
protected final def buildOvertureConfig(file: String): String = {
|
||||
val config = new JSONObject()
|
||||
.put("BindAddress", ":" + (profile.localPort + 53))
|
||||
.put("BindAddress", "127.0.0.1:" + (profile.localPort + 53))
|
||||
.put("RedirectIPv6Record", true)
|
||||
.put("DomainBase64Decode", true)
|
||||
.put("HostsFile", "hosts")
|
||||
@@ -340,7 +326,10 @@ trait BaseService extends Service {
|
||||
def makeDns(name: String, address: String, edns: Boolean = true) = {
|
||||
val dns = new JSONObject()
|
||||
.put("Name", name)
|
||||
.put("Address", address + ":53")
|
||||
.put("Address", (Utils.parseNumericAddress(address) match {
|
||||
case _: Inet6Address => '[' + address + ']'
|
||||
case _ => address
|
||||
}) + ":53")
|
||||
.put("Timeout", 6)
|
||||
.put("EDNSClientSubnet", new JSONObject().put("Policy", "disable"))
|
||||
if (edns) dns
|
||||
@@ -349,21 +338,25 @@ trait BaseService extends Service {
|
||||
else dns.put("Protocol", "udp")
|
||||
dns
|
||||
}
|
||||
val remoteDns = new JSONArray(profile.remoteDns.split(",").zipWithIndex.map {
|
||||
case (dns, i) => makeDns("UserDef-" + i, dns.trim)
|
||||
})
|
||||
profile.route match {
|
||||
case Acl.BYPASS_CHN | Acl.BYPASS_LAN_CHN | Acl.GFWLIST | Acl.CUSTOM_RULES => config
|
||||
.put("PrimaryDNS", new JSONArray(Array(
|
||||
makeDns("Primary-1", "119.29.29.29", edns = false),
|
||||
makeDns("Primary-2", "114.114.114.114", edns = false)
|
||||
)))
|
||||
.put("AlternativeDNS", new JSONArray().put(makeDns("Alternative", profile.remoteDns)))
|
||||
.put("AlternativeDNS", remoteDns)
|
||||
.put("IPNetworkFile", "china_ip_list.txt")
|
||||
.put("DomainFile", "gfwlist.txt")
|
||||
case Acl.CHINALIST => config
|
||||
.put("PrimaryDNS", new JSONArray().put(makeDns("Primary", "119.29.29.29")))
|
||||
.put("AlternativeDNS", new JSONArray().put(makeDns("Alternative", profile.remoteDns)))
|
||||
.put("AlternativeDNS", remoteDns)
|
||||
case _ => config
|
||||
.put("PrimaryDNS", new JSONArray().put(makeDns("Primary", profile.remoteDns)))
|
||||
.put("AlternativeDNS", new JSONArray().put(makeDns("Alternative", "208.67.222.222")))
|
||||
.put("PrimaryDNS", remoteDns)
|
||||
// no need to setup AlternativeDNS in Acl.ALL/BYPASS_LAN mode
|
||||
.put("OnlyPrimaryDNS", true)
|
||||
}
|
||||
IOUtils.writeString(new File(getFilesDir, file), config.toString)
|
||||
file
|
||||
|
||||
@@ -390,7 +390,7 @@ class MainActivity extends Activity with ServiceBoundContext with Drawer.OnDrawe
|
||||
|
||||
protected override def onResume() {
|
||||
super.onResume()
|
||||
app.refreshContainerHolder()
|
||||
app.remoteConfig.fetch()
|
||||
state match {
|
||||
case State.STOPPING | State.CONNECTING =>
|
||||
case _ => hideCircle()
|
||||
|
||||
@@ -352,15 +352,21 @@ final class ProfilesFragment extends ToolbarFragment with Toolbar.OnMenuItemClic
|
||||
|
||||
def onMenuItemClick(item: MenuItem): Boolean = item.getItemId match {
|
||||
case R.id.action_scan_qr_code =>
|
||||
def installScanner() = {
|
||||
Toast.makeText(getActivity, R.string.add_profile_scanner_not_installed, Toast.LENGTH_LONG).show()
|
||||
try startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=tw.com.quickmark"))) catch {
|
||||
case exc: ActivityNotFoundException => exc.printStackTrace()
|
||||
}
|
||||
}
|
||||
try startActivityForResult(new Intent("com.google.zxing.client.android.SCAN")
|
||||
.addCategory(Intent.CATEGORY_DEFAULT)
|
||||
.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_DOCUMENT),
|
||||
REQUEST_SCAN_QR_CODE) catch {
|
||||
case _: ActivityNotFoundException =>
|
||||
Toast.makeText(getActivity, R.string.add_profile_scanner_not_installed, Toast.LENGTH_LONG).show()
|
||||
try startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("market://details?id=tw.com.quickmark"))) catch {
|
||||
case exc: ActivityNotFoundException => exc.printStackTrace()
|
||||
}
|
||||
case _: ActivityNotFoundException => installScanner()
|
||||
case e: SecurityException =>
|
||||
e.printStackTrace()
|
||||
app.track(e)
|
||||
installScanner()
|
||||
}
|
||||
true
|
||||
case R.id.action_import =>
|
||||
|
||||
@@ -21,9 +21,7 @@
|
||||
package com.github.shadowsocks
|
||||
|
||||
import java.io.{File, FileOutputStream, IOException}
|
||||
import java.util
|
||||
import java.util.Locale
|
||||
import java.util.concurrent.TimeUnit
|
||||
|
||||
import android.annotation.SuppressLint
|
||||
import android.app.Application
|
||||
@@ -39,8 +37,8 @@ import com.github.shadowsocks.database.{DBHelper, Profile, ProfileManager}
|
||||
import com.github.shadowsocks.utils.CloseUtils._
|
||||
import com.github.shadowsocks.utils._
|
||||
import com.google.android.gms.analytics.{GoogleAnalytics, HitBuilders, StandardExceptionParser, Tracker}
|
||||
import com.google.android.gms.common.api.ResultCallback
|
||||
import com.google.android.gms.tagmanager.{ContainerHolder, TagManager}
|
||||
import com.google.firebase.FirebaseApp
|
||||
import com.google.firebase.remoteconfig.FirebaseRemoteConfig
|
||||
import com.j256.ormlite.logger.LocalLog
|
||||
import eu.chainfire.libsuperuser.Shell
|
||||
|
||||
@@ -61,8 +59,7 @@ object ShadowsocksApplication {
|
||||
class ShadowsocksApplication extends Application {
|
||||
import ShadowsocksApplication._
|
||||
|
||||
final val SIG_FUNC = "getSignature"
|
||||
var containerHolder: ContainerHolder = _
|
||||
lazy val remoteConfig = FirebaseRemoteConfig.getInstance()
|
||||
lazy val tracker: Tracker = GoogleAnalytics.getInstance(this).newTracker(R.xml.tracker)
|
||||
lazy val settings: SharedPreferences = PreferenceManager.getDefaultSharedPreferences(this)
|
||||
lazy val editor: SharedPreferences.Editor = settings.edit
|
||||
@@ -149,35 +146,16 @@ class ShadowsocksApplication extends Application {
|
||||
if (!BuildConfig.DEBUG) java.lang.System.setProperty(LocalLog.LOCAL_LOG_LEVEL_PROPERTY, "ERROR")
|
||||
AppCompatDelegate.setCompatVectorFromResourcesEnabled(true)
|
||||
checkChineseLocale(getResources.getConfiguration)
|
||||
val tm = TagManager.getInstance(this)
|
||||
val pending = tm.loadContainerPreferNonDefault("GTM-NT8WS8", R.raw.gtm_default_container)
|
||||
val callback = new ResultCallback[ContainerHolder] {
|
||||
override def onResult(holder: ContainerHolder) {
|
||||
if (!holder.getStatus.isSuccess) {
|
||||
return
|
||||
}
|
||||
containerHolder = holder
|
||||
val container = holder.getContainer
|
||||
container.registerFunctionCallMacroCallback(SIG_FUNC,
|
||||
(functionName: String, parameters: util.Map[String, AnyRef]) => {
|
||||
if (functionName == SIG_FUNC) {
|
||||
Utils.getSignature(getApplicationContext)
|
||||
}
|
||||
null
|
||||
})
|
||||
}
|
||||
}
|
||||
pending.setResultCallback(callback, 2, TimeUnit.SECONDS)
|
||||
|
||||
FirebaseApp.initializeApp(this)
|
||||
remoteConfig.setDefaults(R.xml.default_configs)
|
||||
remoteConfig.fetch().addOnCompleteListener(task => if (task.isSuccessful) remoteConfig.activateFetched())
|
||||
|
||||
JobManager.create(this).addJobCreator(DonaldTrump)
|
||||
|
||||
TcpFastOpen.enabled(settings.getBoolean(Key.tfo, TcpFastOpen.sendEnabled))
|
||||
}
|
||||
|
||||
def refreshContainerHolder() {
|
||||
val holder = app.containerHolder
|
||||
if (holder != null) holder.refresh()
|
||||
}
|
||||
|
||||
def crashRecovery() {
|
||||
val cmd = new ArrayBuffer[String]()
|
||||
|
||||
|
||||
@@ -74,7 +74,7 @@ class ShadowsocksNatService extends BaseService {
|
||||
"-t", "10",
|
||||
"-b", "127.0.0.1",
|
||||
"-l", (profile.localPort + 63).toString,
|
||||
"-L", profile.remoteDns.trim + ":53",
|
||||
"-L", profile.remoteDns.split(",").head.trim + ":53",
|
||||
"-c", buildShadowsocksConfig("ss-tunnel-nat.conf"))
|
||||
|
||||
if (profile.udpdns) cmd.append("-u")
|
||||
@@ -204,7 +204,7 @@ class ShadowsocksNatService extends BaseService {
|
||||
AclSyncJob.schedule(profile.route)
|
||||
|
||||
changeState(State.CONNECTED)
|
||||
notification = new ShadowsocksNotification(this, profile.getName, true)
|
||||
notification = new ShadowsocksNotification(this, profile.name, true)
|
||||
}
|
||||
|
||||
override def stopRunner(stopService: Boolean, msg: String = null) {
|
||||
|
||||
@@ -138,12 +138,12 @@ class ShadowsocksVpnService extends VpnService with BaseService {
|
||||
if (profile.route != Acl.ALL && profile.route != Acl.CUSTOM_RULES)
|
||||
AclSyncJob.schedule(profile.route)
|
||||
|
||||
notification = new ShadowsocksNotification(this, profile.getName)
|
||||
notification = new ShadowsocksNotification(this, profile.name)
|
||||
}
|
||||
|
||||
/** Called when the activity is first created. */
|
||||
def handleConnection() {
|
||||
|
||||
|
||||
startShadowsocksDaemon()
|
||||
|
||||
if (!profile.udpdns) {
|
||||
@@ -159,13 +159,12 @@ class ShadowsocksVpnService extends VpnService with BaseService {
|
||||
def startShadowsocksDaemon() {
|
||||
val cmd = ArrayBuffer[String](getApplicationInfo.nativeLibraryDir + "/libss-local.so",
|
||||
"-V",
|
||||
"-u",
|
||||
"-b", "127.0.0.1",
|
||||
"-l", profile.localPort.toString,
|
||||
"-t", "600",
|
||||
"-c", buildShadowsocksConfig("ss-local-vpn.conf"))
|
||||
|
||||
if (profile.udpdns) cmd += "-u"
|
||||
|
||||
if (profile.route != Acl.ALL) {
|
||||
cmd += "--acl"
|
||||
cmd += Acl.getFile(profile.route).getAbsolutePath
|
||||
@@ -190,7 +189,7 @@ class ShadowsocksVpnService extends VpnService with BaseService {
|
||||
.setMtu(VPN_MTU)
|
||||
.addAddress(PRIVATE_VLAN.formatLocal(Locale.ENGLISH, "1"), 24)
|
||||
|
||||
builder.addDnsServer(profile.remoteDns.trim)
|
||||
builder.addDnsServer("8.8.8.8") // It's fake DNS for tun2socks, not the real remote DNS
|
||||
|
||||
if (profile.ipv6) {
|
||||
builder.addAddress(PRIVATE_VLAN6.formatLocal(Locale.ENGLISH, "1"), 126)
|
||||
@@ -215,14 +214,17 @@ class ShadowsocksVpnService extends VpnService with BaseService {
|
||||
}
|
||||
}
|
||||
|
||||
if (profile.route == Acl.ALL || profile.route == Acl.BYPASS_CHN) {
|
||||
if (profile.route == Acl.ALL
|
||||
|| profile.route == Acl.BYPASS_CHN
|
||||
|| profile.route == Acl.CUSTOM_RULES) {
|
||||
builder.addRoute("0.0.0.0", 0)
|
||||
} else {
|
||||
getResources.getStringArray(R.array.bypass_private_route).foreach(cidr => {
|
||||
val subnet = Subnet.fromString(cidr)
|
||||
builder.addRoute(subnet.address.getHostAddress, subnet.prefixSize)
|
||||
})
|
||||
builder.addRoute(profile.remoteDns.trim, 32)
|
||||
profile.remoteDns.split(",").map(dns => Utils.parseNumericAddress(dns.trim)).foreach(dns =>
|
||||
builder.addRoute(dns, dns.getAddress.length << 3))
|
||||
}
|
||||
|
||||
conn = builder.establish()
|
||||
@@ -242,10 +244,10 @@ class ShadowsocksVpnService extends VpnService with BaseService {
|
||||
if (profile.ipv6)
|
||||
cmd += ("--netif-ip6addr", PRIVATE_VLAN6.formatLocal(Locale.ENGLISH, "2"))
|
||||
|
||||
if (profile.udpdns)
|
||||
cmd += "--enable-udprelay"
|
||||
else
|
||||
cmd += ("--dnsgw", "%s:%d".formatLocal(Locale.ENGLISH, PRIVATE_VLAN.formatLocal(Locale.ENGLISH, "1"),
|
||||
cmd += "--enable-udprelay"
|
||||
|
||||
if (!profile.udpdns)
|
||||
cmd += ("--dnsgw", "%s:%d".formatLocal(Locale.ENGLISH, "127.0.0.1",
|
||||
profile.localPort + 53))
|
||||
|
||||
tun2socksProcess = new GuardedProcess(cmd: _*).start(() => sendFd(fd))
|
||||
|
||||
@@ -34,6 +34,7 @@ import scala.io.Source
|
||||
*/
|
||||
object AclSyncJob {
|
||||
final val TAG = "AclSyncJob"
|
||||
final val MAX_RESCHEDULE = 3
|
||||
|
||||
def schedule(route: String): Int = new JobRequest.Builder(AclSyncJob.TAG + ':' + route)
|
||||
.setExecutionWindow(TimeUnit.SECONDS.toMillis(10), TimeUnit.DAYS.toMillis(28))
|
||||
@@ -54,7 +55,7 @@ class AclSyncJob(route: String) extends Job {
|
||||
} catch {
|
||||
case e: IOException =>
|
||||
e.printStackTrace()
|
||||
Result.RESCHEDULE
|
||||
if (params.getFailureCount < AclSyncJob.MAX_RESCHEDULE) Result.RESCHEDULE else Result.FAILURE
|
||||
case e: Exception => // unknown failures, probably shouldn't retry
|
||||
e.printStackTrace()
|
||||
Result.FAILURE
|
||||
|
||||
@@ -98,7 +98,8 @@ class Profile {
|
||||
.scheme("ss")
|
||||
.encodedAuthority("%s@%s:%d".formatLocal(Locale.ENGLISH,
|
||||
Base64.encodeToString("%s:%s".formatLocal(Locale.ENGLISH, method, password).getBytes,
|
||||
Base64.NO_PADDING | Base64.NO_WRAP | Base64.URL_SAFE), host, remotePort))
|
||||
Base64.NO_PADDING | Base64.NO_WRAP | Base64.URL_SAFE),
|
||||
if (host.contains(':')) '[' + host + ']' else host, remotePort))
|
||||
val configuration = new PluginConfiguration(plugin)
|
||||
if (configuration.selected.nonEmpty)
|
||||
builder.appendQueryParameter(Key.plugin, configuration.selectedOptions.toString(false))
|
||||
|
||||
@@ -20,13 +20,15 @@
|
||||
|
||||
package com.github.shadowsocks.utils
|
||||
|
||||
import java.net.URI
|
||||
|
||||
import android.net.Uri
|
||||
import android.util.{Base64, Log}
|
||||
import com.github.shadowsocks.database.Profile
|
||||
|
||||
object Parser {
|
||||
val TAG = "ShadowParser"
|
||||
private val pattern = "(?i)ss://[-a-zA-Z0-9+&@#/%?=~_|!:,.;]*[-a-zA-Z0-9+&@#/%=~_|]".r
|
||||
private val pattern = "(?i)ss://[-a-zA-Z0-9+&@#/%?=~_|!:,.;\\[\\]]*[-a-zA-Z0-9+&@#/%=~_|\\[\\]]".r
|
||||
private val userInfoPattern = "^(.+?):(.*)$".r
|
||||
private val legacyPattern = "^(.+?):(.*)@(.+?):(\\d+?)$".r
|
||||
|
||||
@@ -54,8 +56,12 @@ object Parser {
|
||||
val profile = new Profile
|
||||
profile.method = method
|
||||
profile.password = password
|
||||
profile.host = uri.getHost
|
||||
profile.remotePort = uri.getPort
|
||||
// bug in Android: https://code.google.com/p/android/issues/detail?id=192855
|
||||
val javaURI = new URI(m.matched)
|
||||
profile.host = javaURI.getHost
|
||||
if (profile.host.headOption.contains('[') && profile.host.lastOption.contains(']'))
|
||||
profile.host = profile.host.substring(1, profile.host.length - 1)
|
||||
profile.remotePort = javaURI.getPort
|
||||
profile.plugin = uri.getQueryParameter(Key.plugin)
|
||||
profile.name = uri.getFragment
|
||||
profile
|
||||
|
||||
@@ -80,7 +80,9 @@ object Utils {
|
||||
def resolve(host: String, addrType: Int): Option[String] = {
|
||||
try {
|
||||
val lookup = new Lookup(host, addrType)
|
||||
val resolver = new SimpleResolver("114.114.114.114")
|
||||
val resolver = new SimpleResolver("208.67.220.220")
|
||||
resolver.setTCP(true)
|
||||
resolver.setPort(443)
|
||||
resolver.setTimeout(5)
|
||||
lookup.setResolver(resolver)
|
||||
val result = lookup.run()
|
||||
|
||||
Submodule mobile/src/overture deleted from 862ce347e1
Submodule
+1
Submodule mobile/src/overture/go added at 26db64c766
Executable
+82
@@ -0,0 +1,82 @@
|
||||
#!/bin/bash
|
||||
|
||||
function try () {
|
||||
"$@" || exit -1
|
||||
}
|
||||
|
||||
[ -z "$ANDROID_NDK_HOME" ] && ANDROID_NDK_HOME=~/android-ndk-r12b
|
||||
|
||||
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
|
||||
MIN_API=$1
|
||||
TARGET=$DIR/../main/jni/overture
|
||||
DEPS=$DIR/.deps
|
||||
|
||||
ANDROID_ARM_TOOLCHAIN=$DEPS/android-toolchain-${MIN_API}-arm
|
||||
ANDROID_ARM64_TOOLCHAIN=$DEPS/android-toolchain-21-arm64
|
||||
ANDROID_X86_TOOLCHAIN=$DEPS/android-toolchain-${MIN_API}-x86
|
||||
|
||||
ANDROID_ARM_CC=$ANDROID_ARM_TOOLCHAIN/bin/arm-linux-androideabi-gcc
|
||||
ANDROID_ARM_STRIP=$ANDROID_ARM_TOOLCHAIN/bin/arm-linux-androideabi-strip
|
||||
|
||||
ANDROID_ARM64_CC=$ANDROID_ARM64_TOOLCHAIN/bin/aarch64-linux-android-gcc
|
||||
ANDROID_ARM64_STRIP=$ANDROID_ARM64_TOOLCHAIN/bin/aarch64-linux-android-strip
|
||||
|
||||
ANDROID_X86_CC=$ANDROID_X86_TOOLCHAIN/bin/i686-linux-android-gcc
|
||||
ANDROID_X86_STRIP=$ANDROID_X86_TOOLCHAIN/bin/i686-linux-android-strip
|
||||
|
||||
try mkdir -p $DEPS $TARGET/armeabi-v7a $TARGET/x86 $TARGET/arm64-v8a
|
||||
|
||||
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 $MIN_API --install-dir $ANDROID_ARM_TOOLCHAIN
|
||||
fi
|
||||
|
||||
if [ ! -d "$ANDROID_ARM64_TOOLCHAIN" ]; then
|
||||
echo "Make standalone toolchain for ARM64 arch"
|
||||
$ANDROID_NDK_HOME/build/tools/make_standalone_toolchain.py --arch arm64 \
|
||||
--api 21 --install-dir $ANDROID_ARM64_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 $MIN_API --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=$DIR
|
||||
export PATH=$GOROOT/bin:$GOPATH/bin:$PATH
|
||||
|
||||
echo "Get dependences for overture"
|
||||
go get -u github.com/tools/godep
|
||||
|
||||
pushd $GOPATH/src/github.com/shadowsocks/overture/main
|
||||
godep restore
|
||||
|
||||
echo "Cross compile overture 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 main
|
||||
try mv main $TARGET/armeabi-v7a/liboverture.so
|
||||
|
||||
echo "Cross compile overture for arm64"
|
||||
try env CGO_ENABLED=1 CC=$ANDROID_ARM64_CC GOOS=android GOARCH=arm64 go build -ldflags="-s -w"
|
||||
try $ANDROID_ARM64_STRIP main
|
||||
try mv main $TARGET/arm64-v8a/liboverture.so
|
||||
|
||||
echo "Cross compile overture for x86"
|
||||
try env CGO_ENABLED=1 CC=$ANDROID_X86_CC GOOS=android GOARCH=386 go build -ldflags="-s -w"
|
||||
try $ANDROID_X86_STRIP main
|
||||
try mv main $TARGET/x86/liboverture.so
|
||||
|
||||
popd
|
||||
|
||||
echo "Successfully build overture"
|
||||
Submodule mobile/src/overture/src/github.com/shadowsocks/overture added at 6d51c15e28
@@ -0,0 +1,15 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
|
||||
<!-- proxy category -->
|
||||
<string name="proxy_cat">"サーバー設定"</string>
|
||||
|
||||
<!-- feature category -->
|
||||
<string name="feature_cat">"ファンクション設定"</string>
|
||||
|
||||
<!-- alert category -->
|
||||
<string name="yes">"はい"</string>
|
||||
<string name="no">"いいえ"</string>
|
||||
<string name="unsaved_changes_prompt">"変更は適応されておりません、保存しますか?"</string>
|
||||
<string name="apply">"適用"</string>
|
||||
</resources>
|
||||
@@ -0,0 +1,9 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
|
||||
<!-- proxy category -->
|
||||
<string name="proxy_cat">"서버 설정"</string>
|
||||
|
||||
<!-- feature category -->
|
||||
<string name="feature_cat">"기능 설정"</string>
|
||||
</resources>
|
||||
@@ -0,0 +1,15 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
|
||||
<!-- proxy category -->
|
||||
<string name="proxy_cat">"Настройки Сервера"</string>
|
||||
|
||||
<!-- feature category -->
|
||||
<string name="feature_cat">"Дополнительные Настройки"</string>
|
||||
|
||||
<!-- alert category -->
|
||||
<string name="yes">"Да"</string>
|
||||
<string name="no">"Нет"</string>
|
||||
<string name="unsaved_changes_prompt">"Изменения не сохранены. Сохранить?"</string>
|
||||
<string name="apply">"Применить"</string>
|
||||
</resources>
|
||||
@@ -0,0 +1,15 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
|
||||
<!-- proxy category -->
|
||||
<string name="proxy_cat">"服务器设置"</string>
|
||||
|
||||
<!-- feature category -->
|
||||
<string name="feature_cat">"功能设置"</string>
|
||||
|
||||
<!-- alert category -->
|
||||
<string name="yes">"是"</string>
|
||||
<string name="no">"否"</string>
|
||||
<string name="unsaved_changes_prompt">"保存修改吗?"</string>
|
||||
<string name="apply">"应用"</string>
|
||||
</resources>
|
||||
@@ -0,0 +1,15 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
|
||||
<!-- proxy category -->
|
||||
<string name="proxy_cat">"伺服器設定"</string>
|
||||
|
||||
<!-- feature category -->
|
||||
<string name="feature_cat">"功能設定"</string>
|
||||
|
||||
<!-- alert category -->
|
||||
<string name="yes">"是"</string>
|
||||
<string name="no">"否"</string>
|
||||
<string name="unsaved_changes_prompt">"要儲存變更嗎?"</string>
|
||||
<string name="apply">"套用"</string>
|
||||
</resources>
|
||||
+3
-1
@@ -1,4 +1,4 @@
|
||||
addSbtPlugin("org.scala-android" % "sbt-android" % "1.7.6")
|
||||
addSbtPlugin("org.scala-android" % "sbt-android" % "1.7.7")
|
||||
|
||||
addSbtPlugin("com.timushev.sbt" % "sbt-updates" % "0.1.10")
|
||||
|
||||
@@ -7,3 +7,5 @@ addSbtPlugin("net.virtual-void" % "sbt-dependency-graph" % "0.8.2")
|
||||
addSbtPlugin("org.xerial.sbt" % "sbt-sonatype" % "1.1")
|
||||
|
||||
addSbtPlugin("com.jsuereth" % "sbt-pgp" % "1.0.0") // fot sbt-0.13.5 or higher
|
||||
|
||||
addSbtPlugin("org.scala-android" % "sbt-android-gms" % "0.4")
|
||||
|
||||
Reference in New Issue
Block a user