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 @@
package com.github.shadowsocks
import android.app.Application
import android.app.NotificationChannel
import android.app.NotificationManager
import android.app.PendingIntent
import android.app.*
import android.app.admin.DevicePolicyManager
import android.content.Context
import android.content.Intent
......@@ -62,6 +59,7 @@ object Core {
lateinit var app: Application
lateinit var configureIntent: (Context) -> PendingIntent
val activity by lazy { app.getSystemService<ActivityManager>()!! }
val connectivity by lazy { app.getSystemService<ConnectivityManager>()!! }
val packageInfo: PackageInfo by lazy { getPackageInfo(app.packageName) }
val deviceStorage by lazy { if (Build.VERSION.SDK_INT < 24) app else DeviceStorageApp(app) }
......
......@@ -21,8 +21,8 @@
package com.github.shadowsocks.acl
import android.util.Log
import com.github.shadowsocks.Core
import com.github.shadowsocks.net.Subnet
import java.lang.IllegalArgumentException
import java.net.Inet4Address
import java.net.Inet6Address
import kotlin.system.measureNanoTime
......@@ -38,7 +38,7 @@ class AclMatcher : AutoCloseable {
@JvmStatic private external fun addBypassDomain(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
}
......@@ -67,7 +67,6 @@ class AclMatcher : AutoCloseable {
current = next
}
}.toList()
fun String.fail(): Nothing = throw Re2Exception(this)
check(handle == 0L)
handle = init()
val time = measureNanoTime {
......@@ -76,7 +75,7 @@ class AclMatcher : AutoCloseable {
}, {
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()
subnetsIpv6 = subnets.asSequence().filter { it.address is Inet6Address }.dedup()
this.bypass = bypass
......
......@@ -22,7 +22,6 @@ package com.github.shadowsocks.bg
import android.annotation.SuppressLint
import android.annotation.TargetApi
import android.app.ActivityManager
import android.net.DnsResolver
import android.net.Network
import android.os.Build
......@@ -30,9 +29,7 @@ import android.os.CancellationSignal
import android.system.ErrnoException
import android.system.Os
import android.system.OsConstants
import androidx.core.content.getSystemService
import com.github.shadowsocks.Core
import com.github.shadowsocks.Core.app
import com.github.shadowsocks.utils.int
import com.github.shadowsocks.utils.parseNumericAddress
import com.github.shadowsocks.utils.printLog
......@@ -119,7 +116,7 @@ sealed class DnsResolverCompat {
* See also: https://issuetracker.google.com/issues/133874590
*/
private val unboundedIO by lazy {
if (app.getSystemService<ActivityManager>()!!.isLowRamDevice) Dispatchers.IO
if (Core.activity.isLowRamDevice) Dispatchers.IO
else Executors.newCachedThreadPool().asCoroutineDispatcher()
}
......
......@@ -52,13 +52,19 @@ Java_com_github_shadowsocks_acl_AclMatcher_addProxyDomain(JNIEnv *env, jclass cl
}
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");
auto matcher = reinterpret_cast<AclMatcher *>(handle);
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());
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());
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