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
This commit is contained in:
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user