summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Alex Buynytskyy <alexbuy@google.com> 2021-08-27 14:14:03 -0700
committer Alex Buynytskyy <alexbuy@google.com> 2021-08-27 21:20:20 +0000
commite7e43738df1fcd41ddee191c6069056ae4ed4f70 (patch)
tree114f7caf79516fe2587912caf38443f0b4a63e9d
parenta5c57af882b10efb077d8ed6a31ad26ad236059b (diff)
Tweak buffer size for APK checksumming.
Benchmark to calculate SHA256 over 1GB file: 4K: 1529542318 8K: 1101879125 16K: 989211442 32K: 783037993 ~20.8% 64K: 742122399 ~5.2% 128K: 723034565 ~4.2% 256K: 716748703 ~0.8% 512K: 718178800 ~-0.2% 1M: 719738817 128K seems to be the sweet spot, with 256K being only marginally better and 512K is worse. Bug: 196253439 Fixes: 196253439 Test: atest PackageManagerShellCommandTest PackageManagerShellCommandIncrementalTest IncrementalServiceTest PackageManagerServiceTest ChecksumsTest Change-Id: I502e42652ed78f3eb843edc49d0b486552231a15
-rw-r--r--services/core/java/com/android/server/pm/ApkChecksums.java15
1 files changed, 9 insertions, 6 deletions
diff --git a/services/core/java/com/android/server/pm/ApkChecksums.java b/services/core/java/com/android/server/pm/ApkChecksums.java
index a44cad844202..aa467e782e84 100644
--- a/services/core/java/com/android/server/pm/ApkChecksums.java
+++ b/services/core/java/com/android/server/pm/ApkChecksums.java
@@ -64,7 +64,6 @@ import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.security.VerityUtils;
import com.android.server.pm.parsing.pkg.AndroidPackage;
-import java.io.BufferedInputStream;
import java.io.ByteArrayOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
@@ -724,16 +723,20 @@ public class ApkChecksums {
}
}
+ static final int MIN_BUFFER_SIZE = 4 * 1024;
+ static final int MAX_BUFFER_SIZE = 128 * 1024;
+
private static byte[] getApkChecksum(File file, int type) {
- try (FileInputStream fis = new FileInputStream(file);
- BufferedInputStream bis = new BufferedInputStream(fis)) {
- byte[] dataBytes = new byte[512 * 1024];
+ final int bufferSize = (int) Math.max(MIN_BUFFER_SIZE,
+ Math.min(MAX_BUFFER_SIZE, file.length()));
+ try (FileInputStream fis = new FileInputStream(file)) {
+ final byte[] buffer = new byte[bufferSize];
int nread = 0;
final String algo = getMessageDigestAlgoForChecksumKind(type);
MessageDigest md = MessageDigest.getInstance(algo);
- while ((nread = bis.read(dataBytes)) != -1) {
- md.update(dataBytes, 0, nread);
+ while ((nread = fis.read(buffer)) != -1) {
+ md.update(buffer, 0, nread);
}
return md.digest();