From f0c2ebb97dad69f58b41ad15f0cd12713d82d81a Mon Sep 17 00:00:00 2001 From: REAndroid Date: Wed, 26 Apr 2023 15:52:17 +0200 Subject: [PATCH] write signature block with alignment --- .../reandroid/archive2/io/ZipFileInput.java | 4 +++ .../reandroid/archive2/writer/ApkWriter.java | 36 +++++++++++++------ .../archive2/writer/BufferFileInput.java | 11 ++++++ 3 files changed, 40 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/reandroid/archive2/io/ZipFileInput.java b/src/main/java/com/reandroid/archive2/io/ZipFileInput.java index bacc29b..0be0149 100644 --- a/src/main/java/com/reandroid/archive2/io/ZipFileInput.java +++ b/src/main/java/com/reandroid/archive2/io/ZipFileInput.java @@ -28,6 +28,10 @@ public class ZipFileInput extends ZipInput { this.file = file; } + public File getFile(){ + return file; + } + @Override public long position() throws IOException { FileChannel fileChannel = this.fileChannel; diff --git a/src/main/java/com/reandroid/archive2/writer/ApkWriter.java b/src/main/java/com/reandroid/archive2/writer/ApkWriter.java index 7840450..9d80baa 100644 --- a/src/main/java/com/reandroid/archive2/writer/ApkWriter.java +++ b/src/main/java/com/reandroid/archive2/writer/ApkWriter.java @@ -26,11 +26,13 @@ import com.reandroid.archive2.io.ZipFileOutput; import java.io.File; import java.io.IOException; +import java.io.OutputStream; import java.util.ArrayList; import java.util.Collection; import java.util.List; public class ApkWriter extends ZipFileOutput { + private final Object mLock = new Object(); private final Collection sourceList; private ZipAligner zipAligner; private ApkSignatureBlock apkSignatureBlock; @@ -42,18 +44,21 @@ public class ApkWriter extends ZipFileOutput { this.zipAligner = ZipAligner.apkAligner(); } public void write()throws IOException { - List outputList = buildOutputEntry(); - logMessage("Buffering compress changed files ..."); - BufferFileInput buffer = writeBuffer(outputList); - buffer.unlock(); - align(outputList); - writeApk(outputList); - buffer.close(); + synchronized (mLock){ + List outputList = buildOutputEntry(); + logMessage("Buffering compress changed files ..."); + BufferFileInput buffer = writeBuffer(outputList); + buffer.unlock(); + align(outputList); + writeApk(outputList); + buffer.close(); - writeSignatureBlock(); + writeSignatureBlock(); - writeCEH(outputList); - this.close(); + writeCEH(outputList); + this.close(); + logMessage("Written to: " + getFile().getName()); + } } public void setApkSignatureBlock(ApkSignatureBlock apkSignatureBlock) { this.apkSignatureBlock = apkSignatureBlock; @@ -92,7 +97,16 @@ public class ApkWriter extends ZipFileOutput { return; } logMessage("Writing signature block ..."); - signatureBlock.writeBytes(getOutputStream()); + long offset = position(); + int alignment = 4096; + int padding = (int) ((alignment - (offset % alignment)) % alignment); + OutputStream outputStream = getOutputStream(); + if(padding > 0){ + outputStream.write(new byte[padding]); + } + signatureBlock.refresh(); + logVerbose("padding = " + padding + ", signatures = " + signatureBlock.countBytes()); + signatureBlock.writeBytes(outputStream); } private BufferFileInput writeBuffer(List outputList) throws IOException { File bufferFile = getBufferFile(); diff --git a/src/main/java/com/reandroid/archive2/writer/BufferFileInput.java b/src/main/java/com/reandroid/archive2/writer/BufferFileInput.java index 29de460..61ca375 100644 --- a/src/main/java/com/reandroid/archive2/writer/BufferFileInput.java +++ b/src/main/java/com/reandroid/archive2/writer/BufferFileInput.java @@ -38,4 +38,15 @@ public class BufferFileInput extends ZipFileInput { } throw new IOException("File locked!"); } + @Override + public void close() throws IOException { + super.close(); + if(unlocked){ + File file = super.getFile(); + if(file.isFile()){ + file.delete(); + } + unlocked = false; + } + } }