Commit 2b985686 authored by Mygod's avatar Mygod

Merge branch 'master' into develop

parents 6ca3e8ab 095f4831
...@@ -47,13 +47,13 @@ Translators can go to [POEditor](https://poeditor.com/join/project/u5VHO9vhSf) t ...@@ -47,13 +47,13 @@ Translators can go to [POEditor](https://poeditor.com/join/project/u5VHO9vhSf) t
<ul> <ul>
<li>redsocks: <a href="https://github.com/shadowsocks/redsocks/blob/shadowsocks-android/README">APL 2.0</a></li> <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>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>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>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>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>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>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>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> <li>libudns: <a href="https://github.com/shadowsocks/libudns/blob/master/COPYING.LGPL">LGPL</a></li>
</ul> </ul>
......
...@@ -10,6 +10,7 @@ lazy val commonSettings = Seq( ...@@ -10,6 +10,7 @@ lazy val commonSettings = Seq(
javacOptions ++= "-source" :: "1.7" :: "-target" :: "1.7" :: Nil, javacOptions ++= "-source" :: "1.7" :: "-target" :: "1.7" :: Nil,
scalacOptions ++= "-target:jvm-1.7" :: "-Xexperimental" :: Nil, scalacOptions ++= "-target:jvm-1.7" :: "-Xexperimental" :: Nil,
ndkArgs := "-j" :: java.lang.Runtime.getRuntime.availableProcessors.toString :: Nil, ndkArgs := "-j" :: java.lang.Runtime.getRuntime.availableProcessors.toString :: Nil,
ndkAbiFilter := Seq("armeabi-v7a", "arm64-v8a", "x86"),
proguardVersion := "5.3.3", proguardVersion := "5.3.3",
proguardCache := Seq(), proguardCache := Seq(),
......
enablePlugins(AndroidApp) enablePlugins(AndroidApp)
enablePlugins(AndroidGms)
android.useSupportVectors android.useSupportVectors
name := "shadowsocks" name := "shadowsocks"
version := "4.1.4" version := "4.1.7"
versionCode := Some(184) versionCode := Some(187)
proguardOptions ++= proguardOptions ++=
"-keep class com.github.shadowsocks.JniHelper { *; }" ::
"-dontwarn com.google.android.gms.internal.**" :: "-dontwarn com.google.android.gms.internal.**" ::
"-dontwarn com.j256.ormlite.**" :: "-dontwarn com.j256.ormlite.**" ::
"-dontwarn okhttp3.**" ::
"-dontwarn okio.**" :: "-dontwarn okio.**" ::
"-dontwarn org.xbill.**" :: "-dontwarn org.xbill.**" ::
"-keep class com.github.shadowsocks.JniHelper { *; }" ::
Nil Nil
val playServicesVersion = "10.2.1" val playServicesVersion = "10.2.6"
resolvers += Resolver.jcenterRepo resolvers += Resolver.jcenterRepo
libraryDependencies ++= libraryDependencies ++=
"com.futuremind.recyclerfastscroll" % "fastscroll" % "0.2.5" :: "com.futuremind.recyclerfastscroll" % "fastscroll" % "0.2.5" ::
"com.evernote" % "android-job" % "1.1.9" :: "com.evernote" % "android-job" % "1.1.10" ::
"com.github.jorgecastilloprz" % "fabprogresscircle" % "1.01" :: "com.github.jorgecastilloprz" % "fabprogresscircle" % "1.01" ::
"com.google.android.gms" % "play-services-ads" % playServicesVersion :: "com.google.android.gms" % "play-services-ads" % playServicesVersion ::
"com.google.android.gms" % "play-services-analytics" % playServicesVersion :: "com.google.android.gms" % "play-services-analytics" % playServicesVersion ::
"com.google.android.gms" % "play-services-gcm" % playServicesVersion :: "com.google.android.gms" % "play-services-gcm" % playServicesVersion ::
"com.google.firebase" % "firebase-config" % playServicesVersion ::
"com.j256.ormlite" % "ormlite-android" % "5.0" :: "com.j256.ormlite" % "ormlite-android" % "5.0" ::
"com.mikepenz" % "crossfader" % "1.5.0" :: "com.mikepenz" % "crossfader" % "1.5.0" ::
"com.mikepenz" % "fastadapter" % "2.5.0" :: "com.mikepenz" % "fastadapter" % "2.5.2" ::
"com.mikepenz" % "iconics-core" % "2.8.2" :: "com.mikepenz" % "iconics-core" % "2.8.4" ::
"com.mikepenz" % "materialdrawer" % "5.9.0" :: "com.mikepenz" % "materialdrawer" % "5.9.1" ::
"com.mikepenz" % "materialize" % "1.0.1" :: "com.mikepenz" % "materialize" % "1.0.1" ::
"com.squareup.okhttp3" % "okhttp" % "3.6.0" :: "com.squareup.okhttp3" % "okhttp" % "3.8.0" ::
"com.twofortyfouram" % "android-plugin-api-for-locale" % "1.0.2" :: "com.twofortyfouram" % "android-plugin-api-for-locale" % "1.0.2" ::
"dnsjava" % "dnsjava" % "2.1.8" :: "dnsjava" % "dnsjava" % "2.1.8" ::
"eu.chainfire" % "libsuperuser" % "1.0.0.201704021214" :: "eu.chainfire" % "libsuperuser" % "1.0.0.201704021214" ::
"net.glxn.qrgen" % "android" % "2.0" :: "net.glxn.qrgen" % "android" % "2.0" ::
Nil Nil
packagingOptions := PackagingOptions(excludes =
"META-INF/maven/com.squareup.okio/okio/pom.properties" ::
"META-INF/maven/com.squareup.okio/okio/pom.xml" ::
"META-INF/maven/com.squareup.okhttp3/okhttp/pom.properties" ::
"META-INF/maven/com.squareup.okhttp3/okhttp/pom.xml" ::
Nil)
lazy val goClean = TaskKey[Unit]("go-clean", "Clean go build dependencies")
goClean := {
IO.delete(baseDirectory(base => base / "src/overture/.deps").value)
IO.delete(baseDirectory(base => base / "src/main/jni/overture").value)
}
lazy val goBuild = TaskKey[Unit]("go-build", "Build go and overture") lazy val goBuild = TaskKey[Unit]("go-build", "Build go and overture")
goBuild := { goBuild := {
Process(Seq("mobile/src/overture/make.bash", minSdkVersion.value)) ! streams.value.log match { Process(Seq("mobile/src/overture/make.bash", minSdkVersion.value)) ! streams.value.log match {
......
{
"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"
}
\ No newline at end of file
...@@ -291,13 +291,13 @@ along with this program. If not, see <a href="http://www.gnu.org/licenses/">http ...@@ -291,13 +291,13 @@ along with this program. If not, see <a href="http://www.gnu.org/licenses/">http
<ul> <ul>
<li>redsocks: <a href="https://github.com/shadowsocks/redsocks/blob/shadowsocks-android/README">APL 2.0</a></li> <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>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>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>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>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>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>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>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> <li>libudns: <a href="https://github.com/shadowsocks/libudns/blob/master/COPYING.LGPL">LGPL</a></li>
</ul> </ul>
......
...@@ -257,7 +257,7 @@ SHADOWSOCKS_SOURCES := local.c \ ...@@ -257,7 +257,7 @@ SHADOWSOCKS_SOURCES := local.c \
LOCAL_MODULE := ss-local LOCAL_MODULE := ss-local
LOCAL_SRC_FILES := $(addprefix shadowsocks-libev/src/, $(SHADOWSOCKS_SOURCES)) LOCAL_SRC_FILES := $(addprefix shadowsocks-libev/src/, $(SHADOWSOCKS_SOURCES))
LOCAL_CFLAGS := -Wall -O2 -fno-strict-aliasing -DMODULE_LOCAL \ LOCAL_CFLAGS := -Wall -O2 -fno-strict-aliasing -DMODULE_LOCAL \
-DUSE_CRYPTO_MBEDTLS -DANDROID -DHAVE_CONFIG_H \ -DUSE_CRYPTO_MBEDTLS -DHAVE_CONFIG_H \
-DCONNECT_IN_PROGRESS=EINPROGRESS \ -DCONNECT_IN_PROGRESS=EINPROGRESS \
-I$(LOCAL_PATH)/include/shadowsocks-libev \ -I$(LOCAL_PATH)/include/shadowsocks-libev \
-I$(LOCAL_PATH)/include \ -I$(LOCAL_PATH)/include \
...@@ -294,7 +294,7 @@ SHADOWSOCKS_SOURCES := tunnel.c \ ...@@ -294,7 +294,7 @@ SHADOWSOCKS_SOURCES := tunnel.c \
LOCAL_MODULE := ss-tunnel LOCAL_MODULE := ss-tunnel
LOCAL_SRC_FILES := $(addprefix shadowsocks-libev/src/, $(SHADOWSOCKS_SOURCES)) LOCAL_SRC_FILES := $(addprefix shadowsocks-libev/src/, $(SHADOWSOCKS_SOURCES))
LOCAL_CFLAGS := -Wall -O2 -fno-strict-aliasing -DMODULE_TUNNEL \ LOCAL_CFLAGS := -Wall -O2 -fno-strict-aliasing -DMODULE_TUNNEL \
-DUSE_CRYPTO_MBEDTLS -DANDROID -DHAVE_CONFIG_H -DSSTUNNEL_JNI \ -DUSE_CRYPTO_MBEDTLS -DHAVE_CONFIG_H -DSSTUNNEL_JNI \
-DCONNECT_IN_PROGRESS=EINPROGRESS \ -DCONNECT_IN_PROGRESS=EINPROGRESS \
-I$(LOCAL_PATH)/libancillary \ -I$(LOCAL_PATH)/libancillary \
-I$(LOCAL_PATH)/include \ -I$(LOCAL_PATH)/include \
......
Subproject commit 057ed9f36490a9dccd5e7337fabcb142dd3afc0d Subproject commit e5abe7048d5a1dea589e8e26b33e17dd9533c078
Subproject commit 981fb847e1e306bc40460de4a810f63f9bbc7212 Subproject commit 5213419011ec5de302f8bc1716f348de1fb53b12
Subproject commit 5d5914f00b8adefd383f66b8b352855ece22a1d7 Subproject commit 359ca847a649b9c318f9217c0755484d98ecb779
Subproject commit 3bc3f03c182b4c4ea5138eb7bebcaafe7cc0f53b Subproject commit 274334f14839431ae003774d99c3d1de337afff4
Subproject commit de0cebb62ef3b7854972f65834af7bb8aceb4bcc Subproject commit 72622a3e3df0d8b66f005717ecc48264275f453c
...@@ -2,8 +2,7 @@ ...@@ -2,8 +2,7 @@
<resources> <resources>
<string name="quick_toggle">"켜기/끄기"</string> <string name="quick_toggle">"켜기/끄기"</string>
<!-- global/misc category --> <!-- misc -->
<string name="misc_cat">"기타"</string>
<string name="profile">"프로필"</string> <string name="profile">"프로필"</string>
<string name="profile_summary">"다른 프로필로 전환하거나 새 프로필 추가"</string> <string name="profile_summary">"다른 프로필로 전환하거나 새 프로필 추가"</string>
<string name="nat">"NAT 모드 (지원 중단)"</string> <string name="nat">"NAT 모드 (지원 중단)"</string>
...@@ -45,4 +44,5 @@ ...@@ -45,4 +44,5 @@
<string name="tcp_fastopen_summary">"루트 권한이 필요합니다"</string> <string name="tcp_fastopen_summary">"루트 권한이 필요합니다"</string>
<string name="tcp_fastopen_summary_unsupported">"지원하지 않는 버전의 커널입니다: %s &lt; 3.7.1"</string> <string name="tcp_fastopen_summary_unsupported">"지원하지 않는 버전의 커널입니다: %s &lt; 3.7.1"</string>
<string name="udp_dns">"DNS 포워딩"</string> <string name="udp_dns">"DNS 포워딩"</string>
<string name="udp_dns_summary">"모든 DNS 요청을 외부로 포워딩 합니다"</string>
</resources> </resources>
\ No newline at end of file
...@@ -2,22 +2,28 @@ ...@@ -2,22 +2,28 @@
<resources> <resources>
<string name="quick_toggle">"Подключение"</string> <string name="quick_toggle">"Подключение"</string>
<!-- global/misc category --> <!-- misc -->
<string name="misc_cat">"Разное"</string>
<string name="profile">"Профиль"</string> <string name="profile">"Профиль"</string>
<string name="profile_summary">"Переключить на другой профиль или добавить новые"</string> <string name="profile_summary">"Переключить на другой профиль или добавить новые"</string>
<string name="nat">"Режим NAT (не рекомендуется)"</string> <string name="nat">"Режим NAT (не рекомендуется)"</string>
<string name="nat_summary">"Использовать режим NAT вместо VPN. Требует ROOT прав."</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> Получено: \t%4$s\t↓\t%2$s/s"</string>
<string name="stat_profiles">" <string name="stat_profiles">"
%1$s↑\t%2$s↓"</string> %1$s↑\t%2$s↓"</string>
<string name="traffic_summary">"%1$s/s↑\t%2$s/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_testing">"Проверка…"</string>
<string name="connection_test_available">"Успешно: %dms задержка"</string> <string name="connection_test_available">"Успешно: задержка %d мс"</string>
<string name="connection_test_error">"Сбой проверки интернет подключения: %s"</string> <string name="connection_test_error">"Сбой проверки интернет-соединения: %s"</string>
<string name="connection_test_fail">"Интернет Недоступен"</string> <string name="connection_test_fail">"Интернет недоступен"</string>
<string name="connection_test_error_status_code">"Код ошибки: #%d"</string> <string name="connection_test_error_status_code">"Код ошибки: #%d"</string>
<!-- proxy category --> <!-- proxy category -->
...@@ -30,7 +36,7 @@ ...@@ -30,7 +36,7 @@
<!-- feature category --> <!-- feature category -->
<string name="ipv6">"IPv6 Маршрут"</string> <string name="ipv6">"IPv6 Маршрут"</string>
<string name="ipv6_summary">"Перенаправлять IPv6 траффик на удалённый сервер"</string> <string name="ipv6_summary">"Перенаправлять трафик IPv6 на удалённый сервер"</string>
<string name="route_list">"Маршрут"</string> <string name="route_list">"Маршрут"</string>
<string name="route_entry_gfwlist">"Список GFW"</string> <string name="route_entry_gfwlist">"Список GFW"</string>
<string name="proxied_apps">"Прокси для выбранных приложений"</string> <string name="proxied_apps">"Прокси для выбранных приложений"</string>
...@@ -42,22 +48,23 @@ ...@@ -42,22 +48,23 @@
<string name="auto_connect_summary">"Запускать Shadowsocks при включении"</string> <string name="auto_connect_summary">"Запускать Shadowsocks при включении"</string>
<string name="tcp_fastopen_summary">"Переключение требует наличия ROOT прав"</string> <string name="tcp_fastopen_summary">"Переключение требует наличия ROOT прав"</string>
<string name="tcp_fastopen_summary_unsupported">"Неподдерживаемая версия ядра: %s &lt; 3.7.1"</string> <string name="tcp_fastopen_summary_unsupported">"Неподдерживаемая версия ядра: %s &lt; 3.7.1"</string>
<string name="udp_dns">роброс DNS"</string> <string name="udp_dns">еренаправление DNS"</string>
<string name="udp_dns_summary">робрасывать DNS пакеты на удалённый сервер"</string> <string name="udp_dns_summary">еренаправлять все DNS-запросы на удалённый сервер"</string>
<!-- notification category --> <!-- notification category -->
<string name="forward_success">"Shadowsocks запущен."</string> <string name="forward_success">"Shadowsocks запущен."</string>
<string name="invalid_server">"Неправильное имя сервера"</string> <string name="invalid_server">"Неправильное имя сервера"</string>
<string name="service_failed">"Ошибка при подключении к удалённому серверу"</string> <string name="service_failed">"Ошибка при подключении к удалённому серверу"</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="nat_no_root">"Режим NAT требует наличия ROOT прав"</string>
<string name="switch_to_vpn">"Переключить на режим VPN"</string> <string name="switch_to_vpn">"Переключить на режим VPN"</string>
<string name="stop">"Остановить"</string> <string name="stop">"Остановить"</string>
<string name="stopping">"Останавливается…"</string> <string name="stopping">"Останавливается…"</string>
<string name="reboot_required">"Сбой запуска VPN сервиса. Требуется перезагрузка Вашего устройства."</string> <string name="reboot_required">"Не удалось запустить службу VPN. Возможно, требуется перезагрузить ваше устройство."</string>
<!-- alert category --> <!-- alert category -->
<string name="close">"Закрыть"</string> <string name="close">"Закрыть"</string>
<string name="profile_empty">"Пожалуйста, выберите профиль"</string>
<string name="proxy_empty">"Прокси/Пароль не должны быть пустыми"</string> <string name="proxy_empty">"Прокси/Пароль не должны быть пустыми"</string>
<string name="connect">"Подключить"</string> <string name="connect">"Подключить"</string>
<string name="recovering">"Сброс…"</string> <string name="recovering">"Сброс…"</string>
...@@ -69,6 +76,7 @@ ...@@ -69,6 +76,7 @@
<string name="recovery">"Сброс"</string> <string name="recovery">"Сброс"</string>
<string name="about">"О приложении"</string> <string name="about">"О приложении"</string>
<string name="about_title">"Shadowsocks %s"</string> <string name="about_title">"Shadowsocks %s"</string>
<string name="edit">"Изменить"</string>
<string name="share">"Поделиться"</string> <string name="share">"Поделиться"</string>
<string name="add_profile">"Добавить Профиль"</string> <string name="add_profile">"Добавить Профиль"</string>
<string name="action_apply_all">"Применить настройки для всех профилей"</string> <string name="action_apply_all">"Применить настройки для всех профилей"</string>
...@@ -78,19 +86,26 @@ ...@@ -78,19 +86,26 @@
<string name="action_export_err">"Сбой экспорта."</string> <string name="action_export_err">"Сбой экспорта."</string>
<string name="action_import_msg">"Успешный импорт!"</string> <string name="action_import_msg">"Успешный импорт!"</string>
<string name="action_import_err">"Сбой импорта."</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_dialog">"Добавить этот Профиль Shadowsocks?"</string>
<string name="add_profile_methods_scan_qr_code">"Сканировать QR код"</string> <string name="add_profile_methods_scan_qr_code">"Сканировать QR-код"</string>
<string name="add_profile_methods_manual_settings">"Настройка вручную"</string> <string name="add_profile_methods_manual_settings">"Ручные настройки"</string>
<string name="add_profile_scanner_not_installed">"Пожалуйста, установите любое ZXing-совместимое приложение для сканирования QR-кодов."</string>
<plurals name="removed"> <plurals name="removed">
<item quantity="one">"Удалён"</item> <item quantity="one">"Удалено"</item>
<item quantity="few">"%d элементы удалены"</item> <item quantity="few">"Удалено %d элемента"</item>
<item quantity="many">"%d элементы удалены"</item> <item quantity="many">"Удалено %d элементов"</item>
<item quantity="other">"%d элементы удалены"</item> <item quantity="other">"Удалено %d элементов"</item>
</plurals> </plurals>
<string name="undo">"Вернуть"</string> <string name="undo">"Вернуть"</string>
<!-- tasker --> <!-- 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_default">"Подключиться к текущему серверу"</string>
<string name="start_service">"Подключиться к %s"</string> <string name="start_service">"Подключиться к %s"</string>
<string name="stop_service">"Переключить на %s"</string> <string name="stop_service">"Переключить на %s"</string>
...@@ -99,10 +114,30 @@ ...@@ -99,10 +114,30 @@
<!-- status --> <!-- status -->
<string name="sent">"Отправлено:"</string> <string name="sent">"Отправлено:"</string>
<string name="received">"Получено:"</string> <string name="received">"Получено:"</string>
<string name="connecting">"Соединение..."</string>
<string name="vpn_connected">"Подключено, нажмите для проверки соединения"</string>
<string name="nat_connected">"Подключено"</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="edit_rule">"Редактировать правило"</string>
<string name="route_entry_all">"Все"</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_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="route_entry_chinalist">"Список Китай"</string>
<string name="proxied_apps_summary_v21">"Установить прокси для выбранных приложений"</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> </resources>
\ No newline at end of file
...@@ -2,8 +2,7 @@ ...@@ -2,8 +2,7 @@
<resources> <resources>
<string name="quick_toggle">"切換"</string> <string name="quick_toggle">"切換"</string>
<!-- global/misc category --> <!-- misc -->
<string name="misc_cat">"其他"</string>
<string name="profile">"設定檔"</string> <string name="profile">"設定檔"</string>
<string name="profile_summary">"切換至其他設定檔或新增新設定檔"</string> <string name="profile_summary">"切換至其他設定檔或新增新設定檔"</string>
<string name="nat">"NAT 模式 (已過時)"</string> <string name="nat">"NAT 模式 (已過時)"</string>
...@@ -124,4 +123,12 @@ ...@@ -124,4 +123,12 @@
<string name="proxied_apps_summary_v21">"為已選擇的應用程式設定 Proxy"</string> <string name="proxied_apps_summary_v21">"為已選擇的應用程式設定 Proxy"</string>
<string name="acl_rule_templates_generic">"子網路/主機名稱 PCRE 模式"</string> <string name="acl_rule_templates_generic">"子網路/主機名稱 PCRE 模式"</string>
<string name="acl_rule_templates_domain">"網域及其所有子網域"</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> </resources>
<?xml version="1.0" encoding="utf-8"?>
<defaultsMap>
<entry>
<key>proxy_url</key>
<value>https://www.socks123.pw/get.php</value>
</entry>
</defaultsMap>
...@@ -21,7 +21,6 @@ ...@@ -21,7 +21,6 @@
package com.github.shadowsocks package com.github.shadowsocks
import java.io.{File, IOException} import java.io.{File, IOException}
import java.net.InetAddress
import java.util import java.util
import java.util.concurrent.TimeUnit import java.util.concurrent.TimeUnit
import java.util.{Timer, TimerTask} import java.util.{Timer, TimerTask}
...@@ -127,12 +126,8 @@ trait BaseService extends Service { ...@@ -127,12 +126,8 @@ trait BaseService extends Service {
def connect() { def connect() {
profile.name = profile.getName // save original name before it's (possibly) overwritten by IP addresses profile.name = profile.getName // save original name before it's (possibly) overwritten by IP addresses
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)
if (profile.host == "198.199.101.152") {
val client = new OkHttpClient.Builder() val client = new OkHttpClient.Builder()
.dns(hostname => Utils.resolve(hostname, enableIPv6 = false) match { .dns(hostname => Utils.resolve(hostname, enableIPv6 = false) match {
case Some(ip) => util.Arrays.asList(InetAddress.getByName(ip)) case Some(ip) => util.Arrays.asList(InetAddress.getByName(ip))
...@@ -143,10 +138,10 @@ trait BaseService extends Service { ...@@ -143,10 +138,10 @@ trait BaseService extends Service {
.readTimeout(30, TimeUnit.SECONDS) .readTimeout(30, TimeUnit.SECONDS)
.build() .build()
val requestBody = new FormBody.Builder() val requestBody = new FormBody.Builder()
.add("sig", sig) .add("sig", Utils.getSignature(this))
.build() .build()
val request = new Request.Builder() val request = new Request.Builder()
.url(url) .url(app.remoteConfig.getString("proxy_url"))
.post(requestBody) .post(requestBody)
.build() .build()
...@@ -277,7 +272,6 @@ trait BaseService extends Service { ...@@ -277,7 +272,6 @@ trait BaseService extends Service {
override def onCreate() { override def onCreate() {
super.onCreate() super.onCreate()
app.refreshContainerHolder()
app.updateAssets() app.updateAssets()
} }
...@@ -302,23 +296,12 @@ trait BaseService extends Service { ...@@ -302,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] = { protected def buildPluginCommandLine(): ArrayBuffer[String] = {
val result = ArrayBuffer(pluginPath) val result = ArrayBuffer(pluginPath)
if (TcpFastOpen.sendEnabled) result += "--fast-open" if (TcpFastOpen.sendEnabled) result += "--fast-open"
result result
} }
protected final def buildShadowsocksConfig(file: String): String = { protected final def buildShadowsocksConfig(file: String): String = {
val config = new JSONObject() val config = new JSONObject()
.put("server", profile.host) .put("server", profile.host)
...@@ -332,16 +315,9 @@ trait BaseService extends Service { ...@@ -332,16 +315,9 @@ trait BaseService extends Service {
file file
} }
private final def buildRemoteDns(remoteDns: String): String = {
val addr = InetAddress.getByName(remoteDns)
if (addr.isInstanceOf[Inet6Address])
return "[" + remoteDns + "]"
remoteDns
}
protected final def buildOvertureConfig(file: String): String = { protected final def buildOvertureConfig(file: String): String = {
val config = new JSONObject() val config = new JSONObject()
.put("BindAddress", ":" + (profile.localPort + 53)) .put("BindAddress", "127.0.0.1:" + (profile.localPort + 53))
.put("RedirectIPv6Record", true) .put("RedirectIPv6Record", true)
.put("DomainBase64Decode", true) .put("DomainBase64Decode", true)
.put("HostsFile", "hosts") .put("HostsFile", "hosts")
...@@ -350,7 +326,10 @@ trait BaseService extends Service { ...@@ -350,7 +326,10 @@ trait BaseService extends Service {
def makeDns(name: String, address: String, edns: Boolean = true) = { def makeDns(name: String, address: String, edns: Boolean = true) = {
val dns = new JSONObject() val dns = new JSONObject()
.put("Name", name) .put("Name", name)
.put("Address", address + ":53") .put("Address", (Utils.parseNumericAddress(address) match {
case _: Inet6Address => '[' + address + ']'
case _ => address
}) + ":53")
.put("Timeout", 6) .put("Timeout", 6)
.put("EDNSClientSubnet", new JSONObject().put("Policy", "disable")) .put("EDNSClientSubnet", new JSONObject().put("Policy", "disable"))
if (edns) dns if (edns) dns
...@@ -359,24 +338,25 @@ trait BaseService extends Service { ...@@ -359,24 +338,25 @@ trait BaseService extends Service {
else dns.put("Protocol", "udp") else dns.put("Protocol", "udp")
dns dns
} }
val remoteDns = new JSONArray(profile.remoteDns.split(",").zipWithIndex.map {
case (dns, i) => makeDns("UserDef-" + i, dns.trim)
})
profile.route match { profile.route match {
case Acl.BYPASS_CHN | Acl.BYPASS_LAN_CHN | Acl.GFWLIST | Acl.CUSTOM_RULES => config case Acl.BYPASS_CHN | Acl.BYPASS_LAN_CHN | Acl.GFWLIST | Acl.CUSTOM_RULES => config
.put("PrimaryDNS", new JSONArray(Array( .put("PrimaryDNS", new JSONArray(Array(
makeDns("Primary-1", "119.29.29.29", edns = false), makeDns("Primary-1", "119.29.29.29", edns = false),
makeDns("Primary-2", "114.114.114.114", edns = false) makeDns("Primary-2", "114.114.114.114", edns = false)
))) )))
.put("AlternativeDNS", new JSONArray().put(makeDns("Alternative", .put("AlternativeDNS", remoteDns)
buildRemoteDns(profile.remoteDns.trim))))
.put("IPNetworkFile", "china_ip_list.txt") .put("IPNetworkFile", "china_ip_list.txt")
.put("DomainFile", "gfwlist.txt") .put("DomainFile", "gfwlist.txt")
case Acl.CHINALIST => config case Acl.CHINALIST => config
.put("PrimaryDNS", new JSONArray().put(makeDns("Primary", "119.29.29.29"))) .put("PrimaryDNS", new JSONArray().put(makeDns("Primary", "119.29.29.29")))
.put("AlternativeDNS", new JSONArray().put(makeDns("Alternative", .put("AlternativeDNS", remoteDns)
buildRemoteDns(profile.remoteDns.trim))))
case _ => config case _ => config
.put("PrimaryDNS", new JSONArray().put(makeDns("Primary", .put("PrimaryDNS", remoteDns)
buildRemoteDns(profile.remoteDns.trim)))) // no need to setup AlternativeDNS in Acl.ALL/BYPASS_LAN mode
.put("AlternativeDNS", new JSONArray().put(makeDns("Alternative", "208.67.222.222"))) .put("OnlyPrimaryDNS", true)
} }
IOUtils.writeString(new File(getFilesDir, file), config.toString) IOUtils.writeString(new File(getFilesDir, file), config.toString)
file file
......
...@@ -33,9 +33,9 @@ import com.github.shadowsocks.ShadowsocksApplication.app ...@@ -33,9 +33,9 @@ import com.github.shadowsocks.ShadowsocksApplication.app
import scala.collection.JavaConversions._ import scala.collection.JavaConversions._
import scala.collection.immutable.Stream import scala.collection.immutable.Stream
class StreamLogger(is: InputStream, tag: String) extends Thread { class StreamLogger(is: InputStream, tag: String, logger: (String, String) => Int) extends Thread {
override def run(): Unit = autoClose(new BufferedReader(new InputStreamReader(is)))(br => override def run(): Unit = autoClose(new BufferedReader(new InputStreamReader(is)))(br =>
try Stream.continually(br.readLine()).takeWhile(_ != null).foreach(Log.i(tag, _)) catch { try Stream.continually(br.readLine()).takeWhile(_ != null).foreach(logger(tag, _)) catch {
case _: IOException => case _: IOException =>
}) })
} }
...@@ -68,8 +68,8 @@ class GuardedProcess(cmd: String*) { ...@@ -68,8 +68,8 @@ class GuardedProcess(cmd: String*) {
.directory(app.getFilesDir) .directory(app.getFilesDir)
.start() .start()
val is = process.getInputStream new StreamLogger(process.getInputStream(), TAG, Log.i).start()
new StreamLogger(is, TAG).start() new StreamLogger(process.getErrorStream(), TAG, Log.e).start()
if (callback == null) callback = onRestartCallback else callback() if (callback == null) callback = onRestartCallback else callback()
......
...@@ -390,7 +390,7 @@ class MainActivity extends Activity with ServiceBoundContext with Drawer.OnDrawe ...@@ -390,7 +390,7 @@ class MainActivity extends Activity with ServiceBoundContext with Drawer.OnDrawe
protected override def onResume() { protected override def onResume() {
super.onResume() super.onResume()
app.refreshContainerHolder() app.remoteConfig.fetch()
state match { state match {
case State.STOPPING | State.CONNECTING => case State.STOPPING | State.CONNECTING =>
case _ => hideCircle() case _ => hideCircle()
......
...@@ -21,9 +21,7 @@ ...@@ -21,9 +21,7 @@
package com.github.shadowsocks package com.github.shadowsocks
import java.io.{File, FileOutputStream, IOException} import java.io.{File, FileOutputStream, IOException}
import java.util
import java.util.Locale import java.util.Locale
import java.util.concurrent.TimeUnit
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.app.Application import android.app.Application
...@@ -39,8 +37,8 @@ import com.github.shadowsocks.database.{DBHelper, Profile, ProfileManager} ...@@ -39,8 +37,8 @@ import com.github.shadowsocks.database.{DBHelper, Profile, ProfileManager}
import com.github.shadowsocks.utils.CloseUtils._ import com.github.shadowsocks.utils.CloseUtils._
import com.github.shadowsocks.utils._ import com.github.shadowsocks.utils._
import com.google.android.gms.analytics.{GoogleAnalytics, HitBuilders, StandardExceptionParser, Tracker} import com.google.android.gms.analytics.{GoogleAnalytics, HitBuilders, StandardExceptionParser, Tracker}
import com.google.android.gms.common.api.ResultCallback import com.google.firebase.FirebaseApp
import com.google.android.gms.tagmanager.{ContainerHolder, TagManager} import com.google.firebase.remoteconfig.FirebaseRemoteConfig
import com.j256.ormlite.logger.LocalLog import com.j256.ormlite.logger.LocalLog
import eu.chainfire.libsuperuser.Shell import eu.chainfire.libsuperuser.Shell
...@@ -61,8 +59,7 @@ object ShadowsocksApplication { ...@@ -61,8 +59,7 @@ object ShadowsocksApplication {
class ShadowsocksApplication extends Application { class ShadowsocksApplication extends Application {
import ShadowsocksApplication._ import ShadowsocksApplication._
final val SIG_FUNC = "getSignature" lazy val remoteConfig = FirebaseRemoteConfig.getInstance()
var containerHolder: ContainerHolder = _
lazy val tracker: Tracker = GoogleAnalytics.getInstance(this).newTracker(R.xml.tracker) lazy val tracker: Tracker = GoogleAnalytics.getInstance(this).newTracker(R.xml.tracker)
lazy val settings: SharedPreferences = PreferenceManager.getDefaultSharedPreferences(this) lazy val settings: SharedPreferences = PreferenceManager.getDefaultSharedPreferences(this)
lazy val editor: SharedPreferences.Editor = settings.edit lazy val editor: SharedPreferences.Editor = settings.edit
...@@ -149,35 +146,16 @@ class ShadowsocksApplication extends Application { ...@@ -149,35 +146,16 @@ class ShadowsocksApplication extends Application {
if (!BuildConfig.DEBUG) java.lang.System.setProperty(LocalLog.LOCAL_LOG_LEVEL_PROPERTY, "ERROR") if (!BuildConfig.DEBUG) java.lang.System.setProperty(LocalLog.LOCAL_LOG_LEVEL_PROPERTY, "ERROR")
AppCompatDelegate.setCompatVectorFromResourcesEnabled(true) AppCompatDelegate.setCompatVectorFromResourcesEnabled(true)
checkChineseLocale(getResources.getConfiguration) checkChineseLocale(getResources.getConfiguration)
val tm = TagManager.getInstance(this)
val pending = tm.loadContainerPreferNonDefault("GTM-NT8WS8", R.raw.gtm_default_container) FirebaseApp.initializeApp(this)
val callback = new ResultCallback[ContainerHolder] { remoteConfig.setDefaults(R.xml.default_configs)
override def onResult(holder: ContainerHolder) { remoteConfig.fetch().addOnCompleteListener(task => if (task.isSuccessful) remoteConfig.activateFetched())
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)
JobManager.create(this).addJobCreator(DonaldTrump) JobManager.create(this).addJobCreator(DonaldTrump)
TcpFastOpen.enabled(settings.getBoolean(Key.tfo, TcpFastOpen.sendEnabled)) TcpFastOpen.enabled(settings.getBoolean(Key.tfo, TcpFastOpen.sendEnabled))
} }
def refreshContainerHolder() {
val holder = app.containerHolder
if (holder != null) holder.refresh()
}
def crashRecovery() { def crashRecovery() {
val cmd = new ArrayBuffer[String]() val cmd = new ArrayBuffer[String]()
......
...@@ -74,7 +74,7 @@ class ShadowsocksNatService extends BaseService { ...@@ -74,7 +74,7 @@ class ShadowsocksNatService extends BaseService {
"-t", "10", "-t", "10",
"-b", "127.0.0.1", "-b", "127.0.0.1",
"-l", (profile.localPort + 63).toString, "-l", (profile.localPort + 63).toString,
"-L", profile.remoteDns.trim + ":53", "-L", profile.remoteDns.split(",").head.trim + ":53",
"-c", buildShadowsocksConfig("ss-tunnel-nat.conf")) "-c", buildShadowsocksConfig("ss-tunnel-nat.conf"))
if (profile.udpdns) cmd.append("-u") if (profile.udpdns) cmd.append("-u")
......
...@@ -22,8 +22,6 @@ package com.github.shadowsocks ...@@ -22,8 +22,6 @@ package com.github.shadowsocks
import java.io.File import java.io.File
import java.util.Locale import java.util.Locale
import java.net.InetAddress
import java.net.Inet6Address
import android.content._ import android.content._
import android.content.pm.PackageManager.NameNotFoundException import android.content.pm.PackageManager.NameNotFoundException
...@@ -216,18 +214,17 @@ class ShadowsocksVpnService extends VpnService with BaseService { ...@@ -216,18 +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) builder.addRoute("0.0.0.0", 0)
} else { } else {
getResources.getStringArray(R.array.bypass_private_route).foreach(cidr => { getResources.getStringArray(R.array.bypass_private_route).foreach(cidr => {
val subnet = Subnet.fromString(cidr) val subnet = Subnet.fromString(cidr)
builder.addRoute(subnet.address.getHostAddress, subnet.prefixSize) builder.addRoute(subnet.address.getHostAddress, subnet.prefixSize)
}) })
val addr = InetAddress.getByName(profile.remoteDns.trim) profile.remoteDns.split(",").map(dns => Utils.parseNumericAddress(dns.trim)).foreach(dns =>
if (addr.isInstanceOf[Inet6Address]) builder.addRoute(dns, dns.getAddress.length << 3))
builder.addRoute(addr, 128)
else if (addr.isInstanceOf[InetAddress])
builder.addRoute(addr, 32)
} }
conn = builder.establish() conn = builder.establish()
...@@ -250,7 +247,7 @@ class ShadowsocksVpnService extends VpnService with BaseService { ...@@ -250,7 +247,7 @@ class ShadowsocksVpnService extends VpnService with BaseService {
cmd += "--enable-udprelay" cmd += "--enable-udprelay"
if (!profile.udpdns) if (!profile.udpdns)
cmd += ("--dnsgw", "%s:%d".formatLocal(Locale.ENGLISH, PRIVATE_VLAN.formatLocal(Locale.ENGLISH, "1"), cmd += ("--dnsgw", "%s:%d".formatLocal(Locale.ENGLISH, "127.0.0.1",
profile.localPort + 53)) profile.localPort + 53))
tun2socksProcess = new GuardedProcess(cmd: _*).start(() => sendFd(fd)) tun2socksProcess = new GuardedProcess(cmd: _*).start(() => sendFd(fd))
......
...@@ -34,6 +34,7 @@ import scala.io.Source ...@@ -34,6 +34,7 @@ import scala.io.Source
*/ */
object AclSyncJob { object AclSyncJob {
final val TAG = "AclSyncJob" final val TAG = "AclSyncJob"
final val MAX_RESCHEDULE = 3
def schedule(route: String): Int = new JobRequest.Builder(AclSyncJob.TAG + ':' + route) def schedule(route: String): Int = new JobRequest.Builder(AclSyncJob.TAG + ':' + route)
.setExecutionWindow(TimeUnit.SECONDS.toMillis(10), TimeUnit.DAYS.toMillis(28)) .setExecutionWindow(TimeUnit.SECONDS.toMillis(10), TimeUnit.DAYS.toMillis(28))
...@@ -54,7 +55,7 @@ class AclSyncJob(route: String) extends Job { ...@@ -54,7 +55,7 @@ class AclSyncJob(route: String) extends Job {
} catch { } catch {
case e: IOException => case e: IOException =>
e.printStackTrace() e.printStackTrace()
Result.RESCHEDULE if (params.getFailureCount < AclSyncJob.MAX_RESCHEDULE) Result.RESCHEDULE else Result.FAILURE
case e: Exception => // unknown failures, probably shouldn't retry case e: Exception => // unknown failures, probably shouldn't retry
e.printStackTrace() e.printStackTrace()
Result.FAILURE Result.FAILURE
......
...@@ -80,7 +80,9 @@ object Utils { ...@@ -80,7 +80,9 @@ object Utils {
def resolve(host: String, addrType: Int): Option[String] = { def resolve(host: String, addrType: Int): Option[String] = {
try { try {
val lookup = new Lookup(host, addrType) 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) resolver.setTimeout(5)
lookup.setResolver(resolver) lookup.setResolver(resolver)
val result = lookup.run() val result = lookup.run()
......
Subproject commit 86036dcce8fc7e2bd772969e6af56776cc9d8d53 Subproject commit 26db64c76604b35e756f593d8ce25da5a83af6b6
...@@ -4,7 +4,7 @@ function try () { ...@@ -4,7 +4,7 @@ function try () {
"$@" || exit -1 "$@" || exit -1
} }
[ -z "$ANDROID_NDK_HOME" ] && ANDROID_NDK_HOME=~/android-ndk-r12b [ -z "$ANDROID_NDK_HOME" ] && ANDROID_NDK_HOME=$ANDROID_HOME/ndk-bundle
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
MIN_API=$1 MIN_API=$1
...@@ -15,13 +15,13 @@ ANDROID_ARM_TOOLCHAIN=$DEPS/android-toolchain-${MIN_API}-arm ...@@ -15,13 +15,13 @@ ANDROID_ARM_TOOLCHAIN=$DEPS/android-toolchain-${MIN_API}-arm
ANDROID_ARM64_TOOLCHAIN=$DEPS/android-toolchain-21-arm64 ANDROID_ARM64_TOOLCHAIN=$DEPS/android-toolchain-21-arm64
ANDROID_X86_TOOLCHAIN=$DEPS/android-toolchain-${MIN_API}-x86 ANDROID_X86_TOOLCHAIN=$DEPS/android-toolchain-${MIN_API}-x86
ANDROID_ARM_CC=$ANDROID_ARM_TOOLCHAIN/bin/arm-linux-androideabi-gcc ANDROID_ARM_CC=$ANDROID_ARM_TOOLCHAIN/bin/arm-linux-androideabi-clang
ANDROID_ARM_STRIP=$ANDROID_ARM_TOOLCHAIN/bin/arm-linux-androideabi-strip ANDROID_ARM_STRIP=$ANDROID_ARM_TOOLCHAIN/bin/arm-linux-androideabi-strip
ANDROID_ARM64_CC=$ANDROID_ARM64_TOOLCHAIN/bin/aarch64-linux-android-gcc ANDROID_ARM64_CC=$ANDROID_ARM64_TOOLCHAIN/bin/aarch64-linux-android-clang
ANDROID_ARM64_STRIP=$ANDROID_ARM64_TOOLCHAIN/bin/aarch64-linux-android-strip ANDROID_ARM64_STRIP=$ANDROID_ARM64_TOOLCHAIN/bin/aarch64-linux-android-strip
ANDROID_X86_CC=$ANDROID_X86_TOOLCHAIN/bin/i686-linux-android-gcc ANDROID_X86_CC=$ANDROID_X86_TOOLCHAIN/bin/i686-linux-android-clang
ANDROID_X86_STRIP=$ANDROID_X86_TOOLCHAIN/bin/i686-linux-android-strip ANDROID_X86_STRIP=$ANDROID_X86_TOOLCHAIN/bin/i686-linux-android-strip
try mkdir -p $DEPS $TARGET/armeabi-v7a $TARGET/x86 $TARGET/arm64-v8a try mkdir -p $DEPS $TARGET/armeabi-v7a $TARGET/x86 $TARGET/arm64-v8a
......
Subproject commit 7263b82d2eba2e28d70766aed36ffbc7cf0e1451 Subproject commit 943e9dcb62c47e9016b39185c4d92592e05b6fbb
...@@ -6,4 +6,10 @@ ...@@ -6,4 +6,10 @@
<!-- feature category --> <!-- feature category -->
<string name="feature_cat">"Дополнительные Настройки"</string> <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> </resources>
\ No newline at end of file
...@@ -7,3 +7,5 @@ addSbtPlugin("net.virtual-void" % "sbt-dependency-graph" % "0.8.2") ...@@ -7,3 +7,5 @@ addSbtPlugin("net.virtual-void" % "sbt-dependency-graph" % "0.8.2")
addSbtPlugin("org.xerial.sbt" % "sbt-sonatype" % "1.1") addSbtPlugin("org.xerial.sbt" % "sbt-sonatype" % "1.1")
addSbtPlugin("com.jsuereth" % "sbt-pgp" % "1.0.0") // fot sbt-0.13.5 or higher addSbtPlugin("com.jsuereth" % "sbt-pgp" % "1.0.0") // fot sbt-0.13.5 or higher
addSbtPlugin("org.scala-android" % "sbt-android-gms" % "0.4")
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment