Compare commits

...
6 Commits
Author SHA1 Message Date
Max Lv 59f02cfa53 Refine Firebase remote config 2017-04-28 16:50:41 +08:00
Max Lv bd782dae98 Avoid too many reschedules 2017-04-28 08:04:40 +08:00
Mygod ea738d17d7 Refine #1217 2017-04-24 11:51:47 +08:00
Mygod 915b1a74b1 Refine Firebase code 2017-04-24 11:37:47 +08:00
Mygod 9898ab88e0 Optimize firebase dependencies 2017-04-24 11:25:11 +08:00
Mygod c082a23c37 Update dependencies 2017-04-24 10:59:44 +08:00
9 changed files with 51 additions and 62 deletions
+1 -1
View File
@@ -20,7 +20,7 @@ lazy val commonSettings = Seq(
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 -8
View File
@@ -4,15 +4,22 @@ enablePlugins(AndroidGms)
android.useSupportVectors
name := "shadowsocks"
version := "4.1.5"
versionCode := Some(185)
version := "4.1.6"
versionCode := Some(186)
proguardOptions ++=
"-keep class com.github.shadowsocks.JniHelper { *; }" ::
"-dontwarn com.evernote.android.job.gcm.**" ::
"-dontwarn com.evernote.android.job.util.GcmAvailableHelper" ::
"-dontwarn com.google.android.gms.internal.**" ::
"-dontwarn com.j256.ormlite.**" ::
"-dontwarn okio.**" ::
"-dontwarn org.xbill.**" ::
"-keep public class com.evernote.android.job.v21.PlatformJobService" ::
"-keep public class com.evernote.android.job.v14.PlatformAlarmService" ::
"-keep public class com.evernote.android.job.v14.PlatformAlarmReceiver" ::
"-keep public class com.evernote.android.job.JobBootReceiver" ::
"-keep public class com.evernote.android.job.JobRescheduleService" ::
"-keep class com.github.shadowsocks.JniHelper { *; }" ::
Nil
val playServicesVersion = "10.2.1"
@@ -21,18 +28,17 @@ libraryDependencies ++=
"com.futuremind.recyclerfastscroll" % "fastscroll" % "0.2.5" ::
"com.evernote" % "android-job" % "1.1.9" ::
"com.github.jorgecastilloprz" % "fabprogresscircle" % "1.01" ::
"com.google.firebase" % "firebase-core" % playServicesVersion ::
"com.google.firebase" % "firebase-config" % playServicesVersion ::
"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.5.0" ::
"com.mikepenz" % "iconics-core" % "2.8.2" ::
"com.mikepenz" % "fastadapter" % "2.5.2" ::
"com.mikepenz" % "iconics-core" % "2.8.3" ::
"com.mikepenz" % "materialdrawer" % "5.9.0" ::
"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.201704021214" ::
@@ -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>
@@ -126,11 +126,8 @@ trait BaseService extends Service {
def connect() {
profile.name = profile.getName // save original name before it's (possibly) overwritten by IP addresses
if (profile.host == "198.199.101.152") {
val config = app.remoteConfig
val url = config.getString("proxy_url")
val sig = Utils.getSignature(this)
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))
@@ -141,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()
@@ -275,7 +272,6 @@ trait BaseService extends Service {
override def onCreate() {
super.onCreate()
app.remoteConfig.fetch()
app.updateAssets()
}
@@ -319,13 +315,6 @@ trait BaseService extends Service {
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 = {
val config = new JSONObject()
.put("BindAddress", ":" + (profile.localPort + 53))
@@ -337,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
@@ -346,29 +338,23 @@ 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(
for (remoteDns <- profile.remoteDns.split(","))
yield makeDns(remoteDns.trim, buildRemoteDns(remoteDns.trim)
)))
.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(
for (remoteDns <- profile.remoteDns.split(","))
yield makeDns(remoteDns.trim, buildRemoteDns(remoteDns.trim)
)))
.put("AlternativeDNS", remoteDns)
case _ => config
.put("PrimaryDNS", new JSONArray(
for (remoteDns <- profile.remoteDns.split(","))
yield makeDns(remoteDns.trim, buildRemoteDns(remoteDns.trim)
)))
.put("PrimaryDNS", remoteDns)
// no need to setup AlternativeDNS in Acl.ALL/BYPASS_LAN mode
.put("OnlyPrimaryDNS", true)
}
@@ -384,12 +384,14 @@ class MainActivity extends Activity with ServiceBoundContext with Drawer.OnDrawe
displayFragment(new AboutFragment)
case DRAWER_FAQ => launchUrl(getString(R.string.faq_url))
case DRAWER_CUSTOM_RULES => displayFragment(new CustomRulesFragment)
case _ => // ignore
}
true // unexpected cases will throw exception
}
protected override def onResume() {
super.onResume()
app.remoteConfig.fetch()
state match {
case State.STOPPING | State.CONNECTING =>
case _ => hideCircle()
@@ -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
@@ -38,12 +36,9 @@ import com.github.shadowsocks.acl.DonaldTrump
import com.github.shadowsocks.database.{DBHelper, Profile, ProfileManager}
import com.github.shadowsocks.utils.CloseUtils._
import com.github.shadowsocks.utils._
import com.google.android.gms.tasks.OnCompleteListener
import com.google.android.gms.tasks.Task
import com.google.android.gms.analytics.{GoogleAnalytics, HitBuilders, StandardExceptionParser, Tracker}
import com.google.android.gms.common.api.ResultCallback
import com.google.firebase.remoteconfig.FirebaseRemoteConfig
import com.google.firebase.FirebaseApp
import com.google.firebase.remoteconfig.FirebaseRemoteConfig
import com.j256.ormlite.logger.LocalLog
import eu.chainfire.libsuperuser.Shell
@@ -153,15 +148,8 @@ class ShadowsocksApplication extends Application {
checkChineseLocale(getResources.getConfiguration)
FirebaseApp.initializeApp(this)
remoteConfig.fetch(60)
.addOnCompleteListener(new OnCompleteListener[Void]() {
def onComplete(task: Task[Void]) {
if (task.isSuccessful()) {
remoteConfig.activateFetched()
}
}
})
remoteConfig.setDefaults(R.xml.default_configs);
remoteConfig.fetch().addOnCompleteListener(task => if (task.isSuccessful) remoteConfig.activateFetched())
JobManager.create(this).addJobCreator(DonaldTrump)
@@ -74,7 +74,7 @@ class ShadowsocksNatService extends BaseService {
"-t", "10",
"-b", "127.0.0.1",
"-l", (profile.localPort + 63).toString,
"-L", profile.remoteDns.split(",")(0).trim + ":53",
"-L", profile.remoteDns.split(",").head.trim + ":53",
"-c", buildShadowsocksConfig("ss-tunnel-nat.conf"))
if (profile.udpdns) cmd.append("-u")
@@ -22,8 +22,6 @@ package com.github.shadowsocks
import java.io.File
import java.util.Locale
import java.net.InetAddress
import java.net.Inet6Address
import android.content._
import android.content.pm.PackageManager.NameNotFoundException
@@ -223,13 +221,8 @@ class ShadowsocksVpnService extends VpnService with BaseService {
val subnet = Subnet.fromString(cidr)
builder.addRoute(subnet.address.getHostAddress, subnet.prefixSize)
})
profile.remoteDns.split(",").foreach(remoteDns => {
val addr = InetAddress.getByName(remoteDns.trim)
if (addr.isInstanceOf[Inet6Address])
builder.addRoute(addr, 128)
else if (addr.isInstanceOf[InetAddress])
builder.addRoute(addr, 32)
})
profile.remoteDns.split(",").map(dns => Utils.parseNumericAddress(dns.trim)).foreach(dns =>
builder.addRoute(dns, dns.getAddress.length << 3))
}
conn = builder.establish()
@@ -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))
@@ -45,6 +46,8 @@ object AclSyncJob {
}
class AclSyncJob(route: String) extends Job {
var rescheduled = 0
override def onRunJob(params: Params): Result = {
try {
//noinspection JavaAccessorMethodCalledAsEmptyParen
@@ -54,7 +57,11 @@ class AclSyncJob(route: String) extends Job {
} catch {
case e: IOException =>
e.printStackTrace()
Result.RESCHEDULE
rescheduled += 1
if (rescheduled < AclSyncJob.MAX_RESCHEDULE)
Result.RESCHEDULE
else
Result.FAILURE
case e: Exception => // unknown failures, probably shouldn't retry
e.printStackTrace()
Result.FAILURE