Commit dd4b9aec authored by Mygod's avatar Mygod

Use memory to speed things up

8M on <1GB RAM devices, 64M otherwise.
parent 31beb160
...@@ -20,10 +20,7 @@ ...@@ -20,10 +20,7 @@
package com.github.shadowsocks package com.github.shadowsocks
import android.app.Application import android.app.*
import android.app.NotificationChannel
import android.app.NotificationManager
import android.app.PendingIntent
import android.app.admin.DevicePolicyManager import android.app.admin.DevicePolicyManager
import android.content.Context import android.content.Context
import android.content.Intent import android.content.Intent
...@@ -62,6 +59,7 @@ object Core { ...@@ -62,6 +59,7 @@ object Core {
lateinit var app: Application lateinit var app: Application
lateinit var configureIntent: (Context) -> PendingIntent lateinit var configureIntent: (Context) -> PendingIntent
val activity by lazy { app.getSystemService<ActivityManager>()!! }
val connectivity by lazy { app.getSystemService<ConnectivityManager>()!! } val connectivity by lazy { app.getSystemService<ConnectivityManager>()!! }
val packageInfo: PackageInfo by lazy { getPackageInfo(app.packageName) } val packageInfo: PackageInfo by lazy { getPackageInfo(app.packageName) }
val deviceStorage by lazy { if (Build.VERSION.SDK_INT < 24) app else DeviceStorageApp(app) } val deviceStorage by lazy { if (Build.VERSION.SDK_INT < 24) app else DeviceStorageApp(app) }
......
...@@ -21,8 +21,8 @@ ...@@ -21,8 +21,8 @@
package com.github.shadowsocks.acl package com.github.shadowsocks.acl
import android.util.Log import android.util.Log
import com.github.shadowsocks.Core
import com.github.shadowsocks.net.Subnet import com.github.shadowsocks.net.Subnet
import java.lang.IllegalArgumentException
import java.net.Inet4Address import java.net.Inet4Address
import java.net.Inet6Address import java.net.Inet6Address
import kotlin.system.measureNanoTime import kotlin.system.measureNanoTime
...@@ -38,7 +38,7 @@ class AclMatcher : AutoCloseable { ...@@ -38,7 +38,7 @@ class AclMatcher : AutoCloseable {
@JvmStatic private external fun addBypassDomain(handle: Long, regex: String): Boolean @JvmStatic private external fun addBypassDomain(handle: Long, regex: String): Boolean
@JvmStatic private external fun addProxyDomain(handle: Long, regex: String): Boolean @JvmStatic private external fun addProxyDomain(handle: Long, regex: String): Boolean
@JvmStatic private external fun build(handle: Long): String? @JvmStatic private external fun build(handle: Long, memoryLimit: Long): String?
@JvmStatic private external fun matchHost(handle: Long, host: String): Int @JvmStatic private external fun matchHost(handle: Long, host: String): Int
} }
...@@ -67,7 +67,6 @@ class AclMatcher : AutoCloseable { ...@@ -67,7 +67,6 @@ class AclMatcher : AutoCloseable {
current = next current = next
} }
}.toList() }.toList()
fun String.fail(): Nothing = throw Re2Exception(this)
check(handle == 0L) check(handle == 0L)
handle = init() handle = init()
val time = measureNanoTime { val time = measureNanoTime {
...@@ -76,7 +75,7 @@ class AclMatcher : AutoCloseable { ...@@ -76,7 +75,7 @@ class AclMatcher : AutoCloseable {
}, { }, {
check(addProxyDomain(handle, it)) check(addProxyDomain(handle, it))
}) })
build(handle) build(handle, if (Core.activity.isLowRamDevice) 8 shl 20 else 64 shl 20)?.also { throw Re2Exception(it) }
subnetsIpv4 = subnets.asSequence().filter { it.address is Inet4Address }.dedup() subnetsIpv4 = subnets.asSequence().filter { it.address is Inet4Address }.dedup()
subnetsIpv6 = subnets.asSequence().filter { it.address is Inet6Address }.dedup() subnetsIpv6 = subnets.asSequence().filter { it.address is Inet6Address }.dedup()
this.bypass = bypass this.bypass = bypass
......
...@@ -22,7 +22,6 @@ package com.github.shadowsocks.bg ...@@ -22,7 +22,6 @@ package com.github.shadowsocks.bg
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.annotation.TargetApi import android.annotation.TargetApi
import android.app.ActivityManager
import android.net.DnsResolver import android.net.DnsResolver
import android.net.Network import android.net.Network
import android.os.Build import android.os.Build
...@@ -30,9 +29,7 @@ import android.os.CancellationSignal ...@@ -30,9 +29,7 @@ import android.os.CancellationSignal
import android.system.ErrnoException import android.system.ErrnoException
import android.system.Os import android.system.Os
import android.system.OsConstants import android.system.OsConstants
import androidx.core.content.getSystemService
import com.github.shadowsocks.Core import com.github.shadowsocks.Core
import com.github.shadowsocks.Core.app
import com.github.shadowsocks.utils.int import com.github.shadowsocks.utils.int
import com.github.shadowsocks.utils.parseNumericAddress import com.github.shadowsocks.utils.parseNumericAddress
import com.github.shadowsocks.utils.printLog import com.github.shadowsocks.utils.printLog
...@@ -119,7 +116,7 @@ sealed class DnsResolverCompat { ...@@ -119,7 +116,7 @@ sealed class DnsResolverCompat {
* See also: https://issuetracker.google.com/issues/133874590 * See also: https://issuetracker.google.com/issues/133874590
*/ */
private val unboundedIO by lazy { private val unboundedIO by lazy {
if (app.getSystemService<ActivityManager>()!!.isLowRamDevice) Dispatchers.IO if (Core.activity.isLowRamDevice) Dispatchers.IO
else Executors.newCachedThreadPool().asCoroutineDispatcher() else Executors.newCachedThreadPool().asCoroutineDispatcher()
} }
......
...@@ -52,13 +52,19 @@ Java_com_github_shadowsocks_acl_AclMatcher_addProxyDomain(JNIEnv *env, jclass cl ...@@ -52,13 +52,19 @@ Java_com_github_shadowsocks_acl_AclMatcher_addProxyDomain(JNIEnv *env, jclass cl
} }
JNIEXPORT jstring JNICALL JNIEXPORT jstring JNICALL
Java_com_github_shadowsocks_acl_AclMatcher_build(JNIEnv *env, jclass clazz, jlong handle) { Java_com_github_shadowsocks_acl_AclMatcher_build(JNIEnv *env, jclass clazz, jlong handle,
jlong memory_limit) {
if (!handle) return env->NewStringUTF("AclMatcher closed"); if (!handle) return env->NewStringUTF("AclMatcher closed");
auto matcher = reinterpret_cast<AclMatcher *>(handle); auto matcher = reinterpret_cast<AclMatcher *>(handle);
if (matcher->bypassDomains || matcher->proxyDomains) return env->NewStringUTF("already built"); if (matcher->bypassDomains || matcher->proxyDomains) return env->NewStringUTF("already built");
matcher->bypassDomains = new RE2(matcher->bypassDomainsBuilder.str()); RE2::Options options;
options.set_max_mem(memory_limit);
options.set_never_capture(true);
matcher->bypassDomains = new RE2(matcher->bypassDomainsBuilder.str(), options);
matcher->bypassDomainsBuilder.clear();
if (!matcher->bypassDomains->ok()) return env->NewStringUTF(matcher->bypassDomains->error().c_str()); if (!matcher->bypassDomains->ok()) return env->NewStringUTF(matcher->bypassDomains->error().c_str());
matcher->proxyDomains = new RE2(matcher->proxyDomainsBuilder.str()); matcher->proxyDomains = new RE2(matcher->proxyDomainsBuilder.str(), options);
matcher->proxyDomainsBuilder.clear();
if (!matcher->proxyDomains->ok()) return env->NewStringUTF(matcher->proxyDomains->error().c_str()); if (!matcher->proxyDomains->ok()) return env->NewStringUTF(matcher->proxyDomains->error().c_str());
return nullptr; return nullptr;
} }
......
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