From 2f07219c02af2f8afb155abc05ebef99c22a95d9 Mon Sep 17 00:00:00 2001 From: Tad Date: Tue, 26 Dec 2017 17:56:39 -0500 Subject: [PATCH] Use multiple threads for the realtime scanner --- .../malwarescanner/MalwareScannerService.java | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/us/spotco/malwarescanner/MalwareScannerService.java b/app/src/main/java/us/spotco/malwarescanner/MalwareScannerService.java index 6993105..84c2fca 100644 --- a/app/src/main/java/us/spotco/malwarescanner/MalwareScannerService.java +++ b/app/src/main/java/us/spotco/malwarescanner/MalwareScannerService.java @@ -11,12 +11,15 @@ import android.os.IBinder; import android.support.v4.app.NotificationCompat; import java.io.File; +import java.util.concurrent.Executors; +import java.util.concurrent.ThreadPoolExecutor; import gnu.trove.set.hash.THashSet; public class MalwareScannerService extends Service { private THashSet malwareMonitors = new THashSet<>(); + private ThreadPoolExecutor threadPoolExecutor = null; private NotificationCompat.Builder foregroundNotification = null; private NotificationManager notificationManager = null; @@ -27,13 +30,23 @@ public class MalwareScannerService extends Service { @Override public final int onStartCommand(Intent intent, int flags, int startId) { + int maxTheads = Runtime.getRuntime().availableProcessors(); + if (maxTheads >= 2) { + maxTheads /= 2; + } + threadPoolExecutor = (ThreadPoolExecutor) Executors.newScheduledThreadPool(maxTheads); + threadPoolExecutor.execute(new Runnable() { + @Override + public void run() { + Database.loadDatabase(getApplicationContext(), true, Database.signatureDatabases); + } + }); + malwareMonitors.clear(); addMalwareMonitor(Environment.getExternalStorageDirectory().toString()); - for (RecursiveFileObserver malwareMonitor : malwareMonitors) { malwareMonitor.startWatching(); } - //Toast.makeText(this, "Theia: Realtime Scanning Started", Toast.LENGTH_SHORT).show(); notificationManager = (NotificationManager) getApplicationContext().getSystemService(Context.NOTIFICATION_SERVICE); setForeground(); @@ -51,7 +64,7 @@ public class MalwareScannerService extends Service { if (file.exists() && /*file.length() > 0 &&*/ file.length() <= Utils.MAX_SCAN_SIZE_REALTIME) { THashSet filesToScan = new THashSet<>(); filesToScan.add(file); - new MalwareScanner(null, getApplicationContext(), false).execute(filesToScan); + new MalwareScanner(null, getApplicationContext(), false).executeOnExecutor(threadPoolExecutor, filesToScan); } updateForegroundNotification(); break;