diff options
author | 2021-08-27 14:14:03 -0700 | |
---|---|---|
committer | 2021-08-27 21:20:20 +0000 | |
commit | e7e43738df1fcd41ddee191c6069056ae4ed4f70 (patch) | |
tree | 114f7caf79516fe2587912caf38443f0b4a63e9d | |
parent | a5c57af882b10efb077d8ed6a31ad26ad236059b (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.java | 15 |
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(); |