Workaround potential OOM when signing APKs

This commit is contained in:
topjohnwu 2025-02-13 22:04:14 -08:00 committed by John Wu
parent f5f9b285c0
commit 79af2787ae
2 changed files with 7 additions and 3 deletions

View File

@ -4,6 +4,7 @@ import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream; import java.io.ByteArrayOutputStream;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.nio.ByteBuffer;
public class ByteArrayStream extends ByteArrayOutputStream { public class ByteArrayStream extends ByteArrayOutputStream {
@ -27,4 +28,8 @@ public class ByteArrayStream extends ByteArrayOutputStream {
public ByteArrayInputStream getInputStream() { public ByteArrayInputStream getInputStream() {
return new ByteArrayInputStream(buf, 0, count); return new ByteArrayInputStream(buf, 0, count);
} }
public ByteBuffer toByteBuffer() {
return ByteBuffer.wrap(buf, 0, count);
}
} }

View File

@ -510,7 +510,7 @@ public class SignApk {
privateKey[0] = key; privateKey[0] = key;
// Generate, in memory, an APK signed using standard JAR Signature Scheme. // Generate, in memory, an APK signed using standard JAR Signature Scheme.
ByteArrayOutputStream v1SignedApkBuf = new ByteArrayOutputStream(); ByteArrayStream v1SignedApkBuf = new ByteArrayStream();
JarOutputStream outputJar = new JarOutputStream(v1SignedApkBuf); JarOutputStream outputJar = new JarOutputStream(v1SignedApkBuf);
// Use maximum compression for compressed entries because the APK lives forever on // Use maximum compression for compressed entries because the APK lives forever on
// the system partition. // the system partition.
@ -519,8 +519,7 @@ public class SignApk {
copyFiles(manifest, inputJar, outputJar, timestamp, alignment); copyFiles(manifest, inputJar, outputJar, timestamp, alignment);
signFile(manifest, publicKey, privateKey, timestamp, outputJar); signFile(manifest, publicKey, privateKey, timestamp, outputJar);
outputJar.close(); outputJar.close();
ByteBuffer v1SignedApk = ByteBuffer.wrap(v1SignedApkBuf.toByteArray()); ByteBuffer v1SignedApk = v1SignedApkBuf.toByteBuffer();
v1SignedApkBuf.reset();
ByteBuffer[] outputChunks; ByteBuffer[] outputChunks;
List<ApkSignerV2.SignerConfig> signerConfigs = createV2SignerConfigs(privateKey, publicKey, List<ApkSignerV2.SignerConfig> signerConfigs = createV2SignerConfigs(privateKey, publicKey,