Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 88a8b4f6 authored by Alex Klyubin's avatar Alex Klyubin Committed by android-build-merger
Browse files

Merge "Make signapk align .so entries to 4096 bytes." am: dbb5527a am: 7f1eda80

am: 3ad587e9

* commit '3ad587e9':
  Make signapk align .so entries to 4096 bytes.
parents 7eae1599 3ad587e9
Loading
Loading
Loading
Loading
+20 −1
Original line number Diff line number Diff line
@@ -476,7 +476,7 @@ class SignApk {
     * more efficient.
     */
    private static void copyFiles(Manifest manifest, JarFile in, JarOutputStream out,
                                  long timestamp, int alignment) throws IOException {
                                  long timestamp, int defaultAlignment) throws IOException {
        byte[] buffer = new byte[4096];
        int num;

@@ -515,6 +515,7 @@ class SignApk {
                offset += 4;
                firstEntry = false;
            }
            int alignment = getStoredEntryDataAlignment(name, defaultAlignment);
            if (alignment > 0 && (offset % alignment != 0)) {
                // Set the "extra data" of the entry to between 1 and
                // alignment-1 bytes, to make the file data begin at
@@ -555,6 +556,24 @@ class SignApk {
        }
    }

    /**
     * Returns the multiple (in bytes) at which the provided {@code STORED} entry's data must start
     * relative to start of file or {@code 0} if alignment of this entry's data is not important.
     */
    private static int getStoredEntryDataAlignment(String entryName, int defaultAlignment) {
        if (defaultAlignment <= 0) {
            return 0;
        }

        if (entryName.endsWith(".so")) {
            // Align .so contents to memory page boundary to enable memory-mapped
            // execution.
            return 4096;
        } else {
            return defaultAlignment;
        }
    }

    private static class WholeFileSignerOutputStream extends FilterOutputStream {
        private boolean closing = false;
        private ByteArrayOutputStream footer = new ByteArrayOutputStream();