From 52b79bf5262cda2347240735f82daca954650a59 Mon Sep 17 00:00:00 2001 From: Tavi Date: Sat, 25 May 2024 18:43:58 -0400 Subject: [PATCH] LinkScannerService: don't repeatedly scan - have the system only send 10 events a second, instead of 1000 - don't scan the same package+class name more than once a second - put each event view scanner on its own thread keyed by package+class - don't scan if there is already an existing thread for the package+class this can still cause high cpu usage on views with lots of text especially if the user continually interacts with it but is overall much better to recap: - a given package+class can only be scanned at most once a second - a given package+class can only have one scanner at a time - text to scan will not be scanned if already scanned - domains to scan will not be scanned if already scanned Signed-off-by: Tavi --- .idea/deploymentTargetSelector.xml | 3 ++ app/build.gradle | 4 +-- .../malwarescanner/LinkScannerService.java | 33 ++++++++++++++++++- .../res/xml/accessibility_service_config.xml | 2 +- .../metadata/android/en-US/changelogs/312.txt | 1 + 5 files changed, 39 insertions(+), 4 deletions(-) create mode 100644 fastlane/metadata/android/en-US/changelogs/312.txt diff --git a/.idea/deploymentTargetSelector.xml b/.idea/deploymentTargetSelector.xml index b268ef3..fc8303f 100644 --- a/.idea/deploymentTargetSelector.xml +++ b/.idea/deploymentTargetSelector.xml @@ -5,6 +5,9 @@ + + \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 8374ab4..7a3132d 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -6,8 +6,8 @@ android { applicationId "us.spotco.malwarescanner" minSdkVersion 16 targetSdkVersion 32 - versionCode 311 - versionName "3.11" + versionCode 312 + versionName "3.12" resConfigs 'en', 'af', 'cs', 'de', 'el', 'es', 'fi', 'fr', 'gl', 'it', 'pl', 'pt', 'pt-rBR', 'ru', 'tr', 'zh-rCN' } buildTypes { diff --git a/app/src/main/java/us/spotco/malwarescanner/LinkScannerService.java b/app/src/main/java/us/spotco/malwarescanner/LinkScannerService.java index e24c053..a00f1ed 100644 --- a/app/src/main/java/us/spotco/malwarescanner/LinkScannerService.java +++ b/app/src/main/java/us/spotco/malwarescanner/LinkScannerService.java @@ -10,6 +10,7 @@ import android.view.accessibility.AccessibilityEvent; import android.view.accessibility.AccessibilityNodeInfo; import java.util.Random; +import java.util.concurrent.ConcurrentSkipListMap; import java.util.concurrent.ConcurrentSkipListSet; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -18,6 +19,9 @@ public class LinkScannerService extends AccessibilityService { private static final String hostnameRegex = "^((?!-)[A-Za-z0-9-]{1,63}(? scannedPackages = new ConcurrentSkipListMap<>(); + private static final ConcurrentSkipListMap scannerThreads = new ConcurrentSkipListMap<>(); + private static final ConcurrentSkipListSet scannedText = new ConcurrentSkipListSet<>(); private static final ConcurrentSkipListSet scannedDomains = new ConcurrentSkipListSet<>(); private NotificationManager notificationManager = null; @@ -35,7 +39,34 @@ public class LinkScannerService extends AccessibilityService { @Override public void onAccessibilityEvent(AccessibilityEvent event) { if (Database.isDomainDatabaseLoaded()) { - scanViews(event.getSource()); + boolean shouldScanView = true; + String packageName = (String) event.getPackageName(); + if (event.getSource() != null) { + packageName += event.getSource().getClassName(); + } + if (scannedPackages.containsKey(packageName)) { + if ((System.currentTimeMillis() - scannedPackages.get(packageName)) < 1000) { + shouldScanView = false; + } + } + if (shouldScanView) { + if (scannerThreads.containsKey(packageName)) { + Thread oldThread = scannerThreads.get(packageName); + if (oldThread != null) { + if (oldThread.isAlive()) { + shouldScanView = false; + } else { + scannerThreads.remove(packageName); + } + } + } + } + if (shouldScanView) { + scannedPackages.put(packageName, System.currentTimeMillis()); + Thread thread = new Thread(() -> scanViews(event.getSource())); + scannerThreads.put(packageName, thread); + thread.start(); + } } } diff --git a/app/src/main/res/xml/accessibility_service_config.xml b/app/src/main/res/xml/accessibility_service_config.xml index 0e65fb3..496a184 100644 --- a/app/src/main/res/xml/accessibility_service_config.xml +++ b/app/src/main/res/xml/accessibility_service_config.xml @@ -4,5 +4,5 @@ android:accessibilityEventTypes="typeWindowContentChanged|typeViewTextChanged" android:accessibilityFlags="flagDefault" android:accessibilityFeedbackType="feedbackGeneric" - android:notificationTimeout="1" + android:notificationTimeout="100" android:canRetrieveWindowContent="true" /> \ No newline at end of file diff --git a/fastlane/metadata/android/en-US/changelogs/312.txt b/fastlane/metadata/android/en-US/changelogs/312.txt new file mode 100644 index 0000000..e005308 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/312.txt @@ -0,0 +1 @@ +* Many optimizations to the link scanner feature