Various optimizations

- Trim hashes to 8 characters instead of 12. Saves ~10MB by default.
- Optimized databases. Saves ~8MB by default.
- Deduplicated strings. Saves ~12MB by default.

idle usage on arm64
- With defaults: ~165MB, previously ~195MB
- With all databases: ~350MB, previously ~650MB

Signed-off-by: Tad <tad@spotco.us>
This commit is contained in:
Tad 2022-12-15 06:14:20 -05:00
parent 7d774092c6
commit 745d70ced5
No known key found for this signature in database
GPG key ID: B286E9F57A07424B
6 changed files with 26 additions and 11 deletions

View file

@ -6,8 +6,8 @@ android {
applicationId "us.spotco.malwarescanner"
minSdkVersion 16
targetSdkVersion 32
versionCode 90
versionName "2.27"
versionCode 91
versionName "2.28"
resConfigs 'en', 'af', 'de', 'es', 'fi', 'fr', 'it', 'pl', 'pt', 'ru'
}
buildTypes {

View file

@ -139,7 +139,7 @@ class Database {
if (line.length() > 0) {
String[] lineS = line.split(":");
if (lineS[0].length() > 0) {
signaturesMD5.put(lineS[0].substring(0, Utils.MAX_HASH_LENGTH), lineS[2]);
signaturesMD5.put(lineS[0].substring(0, Utils.MAX_HASH_LENGTH), lineS[2].intern());
}
}
}
@ -148,9 +148,9 @@ class Database {
if (line.length() > 0) {
String[] lineS = line.split(":");
if (lineS[0].length() == 32) {
signaturesSHA1.put(lineS[0].substring(0, Utils.MAX_HASH_LENGTH), lineS[2]);
signaturesSHA1.put(lineS[0].substring(0, Utils.MAX_HASH_LENGTH), lineS[2].intern());
} else if (lineS[0].length() > 0) {
signaturesSHA256.put(lineS[0].substring(0, Utils.MAX_HASH_LENGTH), lineS[2]);
signaturesSHA256.put(lineS[0].substring(0, Utils.MAX_HASH_LENGTH), lineS[2].intern());
}
}
}
@ -160,6 +160,7 @@ class Database {
e.printStackTrace();
}
}
System.gc();
}
signaturesMD5.put("44d88612fea8a8f36de82e1278abb02f".substring(0, Utils.MAX_HASH_LENGTH), "Eicar-Test-Signature");
signaturesSHA256.put("6a0b4866f143c32e651662cebf7f380d27b0db809db3b6a34cf34c7436ab6bbf".substring(0, Utils.MAX_HASH_LENGTH), "Hypatia-Test-Signature");

View file

@ -39,7 +39,7 @@ class Utils {
public final static int MAX_SCAN_SIZE_REALTIME = MAX_SCAN_SIZE / 2; //40MB
public final static String DATABASE_URL_DEFAULT = "https://divested.dev/MalwareScannerSignatures/";
public final static int MAX_HASH_LENGTH = 12;
public final static int MAX_HASH_LENGTH = 8;
public static final AtomicInteger FILES_SCANNED = new AtomicInteger();
private static ThreadPoolExecutor threadPoolExecutor = null;

View file

@ -0,0 +1 @@
* Various memory optimizations

View file

@ -3,7 +3,9 @@
#Description: Hypatia conversion script for ClamAV databases (GPL-2.0)
#sudo -i freshclam
origDir="$PWD"
mkdir /tmp/mss
mkdir /tmp/mss/optimized
mkdir /tmp/mss/processed
cd /tmp/mss
cp /var/lib/clamav/main.c*d .
@ -30,10 +32,13 @@ grep "Multios\\." daily.hsb >> Android.hsb
databases=("Android.hdb" "Android.hsb" "main.hdb" "main.hsb" "daily.hdb" "daily.hsb");
for db in "${databases[@]}"
do
sort --parallel=$(nproc) --unique "$db" --output processed/"$db";
#remove unnecessary bits to reduce file size and app memory usage
python "$origDir"/optimize.py "$db" >> optimized/"$db";
#sort to increase compression efficiency
sort -k3 -t ":" --parallel=$(nproc) --output processed/"$db" optimized/"$db";
done;
gzip /tmp/mss/*.hdb
gzip /tmp/mss/*.hsb
gzip /tmp/mss/processed/*.hdb
gzip /tmp/mss/processed/*.hsb
gzip -k /tmp/mss/*.hdb
gzip -k /tmp/mss/*.hsb
gzip -k /tmp/mss/processed/*.hdb
gzip -k /tmp/mss/processed/*.hsb

8
scripts/optimize.py Executable file
View file

@ -0,0 +1,8 @@
import sys
database = open(sys.argv[1], "r");
for line in database:
arrSplit = line.strip().split(":");
strHash = arrSplit[0];
strName = arrSplit[2].split("-")[0];
print(strHash + ":0:" + strName);