diff options
author | Michael Groover <mpgroover@google.com> | 2023-11-23 02:26:03 +0000 |
---|---|---|
committer | Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com> | 2023-11-23 02:26:03 +0000 |
commit | 24e3075e68ebe17c0b529bb24bfda819db5e2f3b (patch) | |
tree | 6d4a2688ae3d6bca3e0e34fce5331edaf04a4f65 | |
parent | a7287952fe793dd12aa206e69c2b77ca443eeebf (diff) | |
parent | 8b0c79d9ab305b9a0f01a6323adf1da70fa67b0e (diff) | |
download | apksig-24e3075e68ebe17c0b529bb24bfda819db5e2f3b.tar.gz |
Set defaults to align native libraries to 16k am: 8b0c79d9ab
Original change: https://android-review.googlesource.com/c/platform/tools/apksig/+/2844353
Change-Id: I6ab77d12d1943b990d47fd9d76f5b4fc5ccda51f
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
5 files changed, 151 insertions, 48 deletions
diff --git a/src/apksigner/java/com/android/apksigner/ApkSignerTool.java b/src/apksigner/java/com/android/apksigner/ApkSignerTool.java index ff64b1c..aa20682 100644 --- a/src/apksigner/java/com/android/apksigner/ApkSignerTool.java +++ b/src/apksigner/java/com/android/apksigner/ApkSignerTool.java @@ -16,6 +16,8 @@ package com.android.apksigner; +import static com.android.apksig.Constants.LIBRARY_PAGE_ALIGNMENT_BYTES; + import com.android.apksig.ApkSigner; import com.android.apksig.ApkVerifier; import com.android.apksig.SigningCertificateLineage; @@ -150,6 +152,8 @@ public class ApkSignerTool { boolean alignFileSize = false; boolean verityEnabled = false; boolean debuggableApkPermitted = true; + boolean alignmentPreserved = false; + int libPageAlignment = LIBRARY_PAGE_ALIGNMENT_BYTES; int minSdkVersion = 1; boolean minSdkVersionSpecified = false; int maxSdkVersion = Integer.MAX_VALUE; @@ -208,6 +212,11 @@ public class ApkSignerTool { verityEnabled = optionsParser.getOptionalBooleanValue(true); } else if ("debuggable-apk-permitted".equals(optionName)) { debuggableApkPermitted = optionsParser.getOptionalBooleanValue(true); + } else if ("alignment-preserved".equals(optionName)) { + alignmentPreserved = optionsParser.getOptionalBooleanValue(true); + } else if ("lib-page-alignment".equals(optionName)) { + libPageAlignment = optionsParser.getRequiredIntValue( + "Native library page alignment size in bytes"); } else if ("next-signer".equals(optionName)) { if (!signerParams.isEmpty()) { signers.add(signerParams); @@ -395,7 +404,9 @@ public class ApkSignerTool { .setDebuggableApkPermitted(debuggableApkPermitted) .setSigningCertificateLineage(lineage) .setMinSdkVersionForRotation(rotationMinSdkVersion) - .setRotationTargetsDevRelease(rotationTargetsDevRelease); + .setRotationTargetsDevRelease(rotationTargetsDevRelease) + .setAlignmentPreserved(alignmentPreserved) + .setLibraryPageAlignmentBytes(libPageAlignment); if (minSdkVersionSpecified) { apkSignerBuilder.setMinSdkVersion(minSdkVersion); } diff --git a/src/apksigner/java/com/android/apksigner/help_sign.txt b/src/apksigner/java/com/android/apksigner/help_sign.txt index a116be6..6c1aa6a 100644 --- a/src/apksigner/java/com/android/apksigner/help_sign.txt +++ b/src/apksigner/java/com/android/apksigner/help_sign.txt @@ -92,6 +92,16 @@ certificate. By default, signing debuggable APKs is permitted, for backward compatibility with older apksigner versions. +--alignment-preserved Whether the existing alignment within the APK should + be preserved; the default for this setting is false. + When this value is false, the value provided to + --lib-page-alignment will be used to page align native + library files and all other files will be aligned to 4 + bytes in the APK. + +--lib-page-alignment The number of bytes to be used to page align native + library files in the APK; the default value is 16384. + --lineage Signing certificate history to use in the event that signing certificates changed for an APK using APK Signature Scheme v3 supported signing certificate diff --git a/src/main/java/com/android/apksig/ApkSigner.java b/src/main/java/com/android/apksig/ApkSigner.java index 60c18d4..49796a3 100644 --- a/src/main/java/com/android/apksig/ApkSigner.java +++ b/src/main/java/com/android/apksig/ApkSigner.java @@ -16,6 +16,7 @@ package com.android.apksig; +import static com.android.apksig.Constants.LIBRARY_PAGE_ALIGNMENT_BYTES; import static com.android.apksig.apk.ApkUtils.SOURCE_STAMP_CERTIFICATE_HASH_ZIP_ENTRY_NAME; import static com.android.apksig.internal.apk.v3.V3SchemeConstants.MIN_SDK_WITH_V31_SUPPORT; import static com.android.apksig.internal.apk.v3.V3SchemeConstants.MIN_SDK_WITH_V3_SUPPORT; @@ -83,8 +84,6 @@ public class ApkSigner { */ private static final short ALIGNMENT_ZIP_EXTRA_DATA_FIELD_MIN_SIZE_BYTES = 6; - private static final short ANDROID_COMMON_PAGE_ALIGNMENT_BYTES = 4096; - private static final short ANDROID_FILE_ALIGNMENT_BYTES = 4096; /** Name of the Android manifest ZIP entry in APKs. */ @@ -107,6 +106,8 @@ public class ApkSigner { private final boolean mV4ErrorReportingEnabled; private final boolean mDebuggableApkPermitted; private final boolean mOtherSignersSignaturesPreserved; + private final boolean mAlignmentPreserved; + private final int mLibraryPageAlignmentBytes; private final String mCreatedBy; private final ApkSignerEngine mSignerEngine; @@ -140,6 +141,8 @@ public class ApkSigner { boolean v4ErrorReportingEnabled, boolean debuggableApkPermitted, boolean otherSignersSignaturesPreserved, + boolean alignmentPreserved, + int libraryPageAlignmentBytes, String createdBy, ApkSignerEngine signerEngine, File inputApkFile, @@ -167,6 +170,8 @@ public class ApkSigner { mV4ErrorReportingEnabled = v4ErrorReportingEnabled; mDebuggableApkPermitted = debuggableApkPermitted; mOtherSignersSignaturesPreserved = otherSignersSignaturesPreserved; + mAlignmentPreserved = alignmentPreserved; + mLibraryPageAlignmentBytes = libraryPageAlignmentBytes; mCreatedBy = createdBy; mSignerEngine = signerEngine; @@ -445,7 +450,7 @@ public class ApkSigner { // Output entry's Local File Header + data long outputLocalFileHeaderOffset = outputOffset; OutputSizeAndDataOffset outputLfrResult = - outputInputJarEntryLfhRecordPreservingDataAlignment( + outputInputJarEntryLfhRecord( inputApkLfhSection, inputLocalFileRecord, outputApkOut, @@ -744,14 +749,14 @@ public class ApkSigner { } } - private static OutputSizeAndDataOffset outputInputJarEntryLfhRecordPreservingDataAlignment( + private OutputSizeAndDataOffset outputInputJarEntryLfhRecord( DataSource inputLfhSection, LocalFileRecord inputRecord, DataSink outputLfhSection, long outputOffset) throws IOException { long inputOffset = inputRecord.getStartOffsetInArchive(); - if (inputOffset == outputOffset) { + if (inputOffset == outputOffset && mAlignmentPreserved) { // This record's data will be aligned same as in the input APK. return new OutputSizeAndDataOffset( inputRecord.outputRecord(inputLfhSection, outputLfhSection), @@ -759,8 +764,8 @@ public class ApkSigner { } int dataAlignmentMultiple = getInputJarEntryDataAlignmentMultiple(inputRecord); if ((dataAlignmentMultiple <= 1) - || ((inputOffset % dataAlignmentMultiple) - == (outputOffset % dataAlignmentMultiple))) { + || ((inputOffset % dataAlignmentMultiple) == (outputOffset % dataAlignmentMultiple) + && mAlignmentPreserved)) { // This record's data will be aligned same as in the input APK. return new OutputSizeAndDataOffset( inputRecord.outputRecord(inputLfhSection, outputLfhSection), @@ -768,7 +773,7 @@ public class ApkSigner { } long inputDataStartOffset = inputOffset + inputRecord.getDataStartOffsetInRecord(); - if ((inputDataStartOffset % dataAlignmentMultiple) != 0) { + if ((inputDataStartOffset % dataAlignmentMultiple) != 0 && mAlignmentPreserved) { // This record's data is not aligned in the input APK. No need to align it in the // output. return new OutputSizeAndDataOffset( @@ -793,7 +798,7 @@ public class ApkSigner { dataOffset); } - private static int getInputJarEntryDataAlignmentMultiple(LocalFileRecord entry) { + private int getInputJarEntryDataAlignmentMultiple(LocalFileRecord entry) { if (entry.isDataCompressed()) { // Compressed entries don't need to be aligned return 1; @@ -833,7 +838,7 @@ public class ApkSigner { } // Fall back to filename-based defaults - return (entry.getName().endsWith(".so")) ? ANDROID_COMMON_PAGE_ALIGNMENT_BYTES : 4; + return (entry.getName().endsWith(".so")) ? mLibraryPageAlignmentBytes : 4; } private static ByteBuffer createExtraFieldToAlignData( @@ -1221,6 +1226,8 @@ public class ApkSigner { private boolean mV4ErrorReportingEnabled = false; private boolean mDebuggableApkPermitted = true; private boolean mOtherSignersSignaturesPreserved; + private boolean mAlignmentPreserved = false; + private int mLibraryPageAlignmentBytes = LIBRARY_PAGE_ALIGNMENT_BYTES; private String mCreatedBy; private Integer mMinSdkVersion; private int mRotationMinSdkVersion = V3SchemeConstants.DEFAULT_ROTATION_MIN_SDK_VERSION; @@ -1708,6 +1715,26 @@ public class ApkSigner { } /** + * Sets whether the existing alignment within the APK should be preserved; the + * default for this setting is false. When this value is false, the value provided to + * {@link #setLibraryPageAlignmentBytes(int)} will be used to page align native library + * files and 4 bytes will be used to align all other uncompressed files. + */ + public Builder setAlignmentPreserved(boolean alignmentPreserved) { + mAlignmentPreserved = alignmentPreserved; + return this; + } + + /** + * Sets the number of bytes to be used to page align native library files in the APK; the + * default for this setting is {@link Constants#LIBRARY_PAGE_ALIGNMENT_BYTES}. + */ + public Builder setLibraryPageAlignmentBytes(int libraryPageAlignmentBytes) { + mLibraryPageAlignmentBytes = libraryPageAlignmentBytes; + return this; + } + + /** * Returns a new {@code ApkSigner} instance initialized according to the configuration of * this builder. */ @@ -1758,6 +1785,8 @@ public class ApkSigner { mV4ErrorReportingEnabled, mDebuggableApkPermitted, mOtherSignersSignaturesPreserved, + mAlignmentPreserved, + mLibraryPageAlignmentBytes, mCreatedBy, mSignerEngine, mInputApkFile, diff --git a/src/main/java/com/android/apksig/Constants.java b/src/main/java/com/android/apksig/Constants.java index aedb352..dd33028 100644 --- a/src/main/java/com/android/apksig/Constants.java +++ b/src/main/java/com/android/apksig/Constants.java @@ -40,6 +40,11 @@ public class Constants { */ public static final int MAX_APK_SIGNERS = 10; + /** + * The default page alignment for native library files in bytes. + */ + public static final short LIBRARY_PAGE_ALIGNMENT_BYTES = 16384; + public static final String MANIFEST_ENTRY_NAME = V1SchemeConstants.MANIFEST_ENTRY_NAME; public static final int APK_SIGNATURE_SCHEME_V2_BLOCK_ID = diff --git a/src/test/java/com/android/apksig/ApkSignerTest.java b/src/test/java/com/android/apksig/ApkSignerTest.java index ecf177b..0b6702a 100644 --- a/src/test/java/com/android/apksig/ApkSignerTest.java +++ b/src/test/java/com/android/apksig/ApkSignerTest.java @@ -468,7 +468,8 @@ public class ApkSignerTest { assertGolden( "golden-unaligned-in.apk", "golden-unaligned-out.apk", - new ApkSigner.Builder(rsa2048SignerConfig)); + new ApkSigner.Builder(rsa2048SignerConfig) + .setAlignmentPreserved(true)); assertGolden( "golden-unaligned-in.apk", "golden-unaligned-v1-out.apk", @@ -476,21 +477,24 @@ public class ApkSignerTest { .setV1SigningEnabled(true) .setV2SigningEnabled(false) .setV3SigningEnabled(false) - .setV4SigningEnabled(false)); + .setV4SigningEnabled(false) + .setAlignmentPreserved(true)); assertGolden( "golden-unaligned-in.apk", "golden-unaligned-v2-out.apk", new ApkSigner.Builder(rsa2048SignerConfig) .setV1SigningEnabled(false) .setV2SigningEnabled(true) - .setV3SigningEnabled(false)); + .setV3SigningEnabled(false) + .setAlignmentPreserved(true)); assertGolden( "golden-unaligned-in.apk", "golden-unaligned-v3-out.apk", new ApkSigner.Builder(rsa2048SignerConfig) .setV1SigningEnabled(false) .setV2SigningEnabled(false) - .setV3SigningEnabled(true)); + .setV3SigningEnabled(true) + .setAlignmentPreserved(true)); assertGolden( "golden-unaligned-in.apk", "golden-unaligned-v3-lineage-out.apk", @@ -499,21 +503,24 @@ public class ApkSignerTest { .setV2SigningEnabled(false) .setV3SigningEnabled(true) .setMinSdkVersionForRotation(AndroidSdkVersion.P) - .setSigningCertificateLineage(lineage)); + .setSigningCertificateLineage(lineage) + .setAlignmentPreserved(true)); assertGolden( "golden-unaligned-in.apk", "golden-unaligned-v1v2-out.apk", new ApkSigner.Builder(rsa2048SignerConfig) .setV1SigningEnabled(true) .setV2SigningEnabled(true) - .setV3SigningEnabled(false)); + .setV3SigningEnabled(false) + .setAlignmentPreserved(true)); assertGolden( "golden-unaligned-in.apk", "golden-unaligned-v2v3-out.apk", new ApkSigner.Builder(rsa2048SignerConfig) .setV1SigningEnabled(false) .setV2SigningEnabled(true) - .setV3SigningEnabled(true)); + .setV3SigningEnabled(true) + .setAlignmentPreserved(true)); assertGolden( "golden-unaligned-in.apk", "golden-unaligned-v2v3-lineage-out.apk", @@ -522,14 +529,16 @@ public class ApkSignerTest { .setV2SigningEnabled(true) .setV3SigningEnabled(true) .setMinSdkVersionForRotation(AndroidSdkVersion.P) - .setSigningCertificateLineage(lineage)); + .setSigningCertificateLineage(lineage) + .setAlignmentPreserved(true)); assertGolden( "golden-unaligned-in.apk", "golden-unaligned-v1v2v3-out.apk", new ApkSigner.Builder(rsa2048SignerConfig) .setV1SigningEnabled(true) .setV2SigningEnabled(true) - .setV3SigningEnabled(true)); + .setV3SigningEnabled(true) + .setAlignmentPreserved(true)); assertGolden( "golden-unaligned-in.apk", "golden-unaligned-v1v2v3-lineage-out.apk", @@ -538,7 +547,8 @@ public class ApkSignerTest { .setV2SigningEnabled(true) .setV3SigningEnabled(true) .setMinSdkVersionForRotation(AndroidSdkVersion.P) - .setSigningCertificateLineage(lineage)); + .setSigningCertificateLineage(lineage) + .setAlignmentPreserved(true)); // Uncompressed entries in this input file are aligned by zero-padding the "extra" field, as // performed by zipalign at the time of writing. This padding technique produces ZIP @@ -547,7 +557,9 @@ public class ApkSignerTest { assertGolden( "golden-legacy-aligned-in.apk", "golden-legacy-aligned-out.apk", - new ApkSigner.Builder(rsa2048SignerConfig)); + new ApkSigner.Builder(rsa2048SignerConfig) + .setLibraryPageAlignmentBytes(4096) + .setAlignmentPreserved(true)); assertGolden( "golden-legacy-aligned-in.apk", "golden-legacy-aligned-v1-out.apk", @@ -555,21 +567,27 @@ public class ApkSignerTest { .setV1SigningEnabled(true) .setV2SigningEnabled(false) .setV3SigningEnabled(false) - .setV4SigningEnabled(false)); + .setV4SigningEnabled(false) + .setLibraryPageAlignmentBytes(4096) + .setAlignmentPreserved(true)); assertGolden( "golden-legacy-aligned-in.apk", "golden-legacy-aligned-v2-out.apk", new ApkSigner.Builder(rsa2048SignerConfig) .setV1SigningEnabled(false) .setV2SigningEnabled(true) - .setV3SigningEnabled(false)); + .setV3SigningEnabled(false) + .setLibraryPageAlignmentBytes(4096) + .setAlignmentPreserved(true)); assertGolden( "golden-legacy-aligned-in.apk", "golden-legacy-aligned-v3-out.apk", new ApkSigner.Builder(rsa2048SignerConfig) .setV1SigningEnabled(false) .setV2SigningEnabled(false) - .setV3SigningEnabled(true)); + .setV3SigningEnabled(true) + .setLibraryPageAlignmentBytes(4096) + .setAlignmentPreserved(true)); assertGolden( "golden-legacy-aligned-in.apk", "golden-legacy-aligned-v3-lineage-out.apk", @@ -578,21 +596,27 @@ public class ApkSignerTest { .setV2SigningEnabled(false) .setV3SigningEnabled(true) .setMinSdkVersionForRotation(AndroidSdkVersion.P) - .setSigningCertificateLineage(lineage)); + .setSigningCertificateLineage(lineage) + .setLibraryPageAlignmentBytes(4096) + .setAlignmentPreserved(true)); assertGolden( "golden-legacy-aligned-in.apk", "golden-legacy-aligned-v1v2-out.apk", new ApkSigner.Builder(rsa2048SignerConfig) .setV1SigningEnabled(true) .setV2SigningEnabled(true) - .setV3SigningEnabled(false)); + .setV3SigningEnabled(false) + .setLibraryPageAlignmentBytes(4096) + .setAlignmentPreserved(true)); assertGolden( "golden-legacy-aligned-in.apk", "golden-legacy-aligned-v2v3-out.apk", new ApkSigner.Builder(rsa2048SignerConfig) .setV1SigningEnabled(false) .setV2SigningEnabled(true) - .setV3SigningEnabled(true)); + .setV3SigningEnabled(true) + .setLibraryPageAlignmentBytes(4096) + .setAlignmentPreserved(true)); assertGolden( "golden-legacy-aligned-in.apk", "golden-legacy-aligned-v2v3-lineage-out.apk", @@ -601,14 +625,18 @@ public class ApkSignerTest { .setV2SigningEnabled(true) .setV3SigningEnabled(true) .setMinSdkVersionForRotation(AndroidSdkVersion.P) - .setSigningCertificateLineage(lineage)); + .setSigningCertificateLineage(lineage) + .setLibraryPageAlignmentBytes(4096) + .setAlignmentPreserved(true)); assertGolden( "golden-legacy-aligned-in.apk", "golden-legacy-aligned-v1v2v3-out.apk", new ApkSigner.Builder(rsa2048SignerConfig) .setV1SigningEnabled(true) .setV2SigningEnabled(true) - .setV3SigningEnabled(true)); + .setV3SigningEnabled(true) + .setLibraryPageAlignmentBytes(4096) + .setAlignmentPreserved(true)); assertGolden( "golden-legacy-aligned-in.apk", "golden-legacy-aligned-v1v2v3-lineage-out.apk", @@ -617,7 +645,9 @@ public class ApkSignerTest { .setV2SigningEnabled(true) .setV3SigningEnabled(true) .setMinSdkVersionForRotation(AndroidSdkVersion.P) - .setSigningCertificateLineage(lineage)); + .setSigningCertificateLineage(lineage) + .setLibraryPageAlignmentBytes(4096) + .setAlignmentPreserved(true)); // Uncompressed entries in this input file are aligned by padding the "extra" field, as // generated by signapk and apksigner. This padding technique produces "extra" fields which @@ -625,7 +655,8 @@ public class ApkSignerTest { assertGolden( "golden-aligned-in.apk", "golden-aligned-out.apk", - new ApkSigner.Builder(rsa2048SignerConfig)); + new ApkSigner.Builder(rsa2048SignerConfig) + .setAlignmentPreserved(true)); assertGolden( "golden-aligned-in.apk", "golden-aligned-v1-out.apk", @@ -633,21 +664,24 @@ public class ApkSignerTest { .setV1SigningEnabled(true) .setV2SigningEnabled(false) .setV3SigningEnabled(false) - .setV4SigningEnabled(false)); + .setV4SigningEnabled(false) + .setAlignmentPreserved(true)); assertGolden( "golden-aligned-in.apk", "golden-aligned-v2-out.apk", new ApkSigner.Builder(rsa2048SignerConfig) .setV1SigningEnabled(false) .setV2SigningEnabled(true) - .setV3SigningEnabled(false)); + .setV3SigningEnabled(false) + .setAlignmentPreserved(true)); assertGolden( "golden-aligned-in.apk", "golden-aligned-v3-out.apk", new ApkSigner.Builder(rsa2048SignerConfig) .setV1SigningEnabled(false) .setV2SigningEnabled(false) - .setV3SigningEnabled(true)); + .setV3SigningEnabled(true) + .setAlignmentPreserved(true)); assertGolden( "golden-aligned-in.apk", "golden-aligned-v3-lineage-out.apk", @@ -656,21 +690,24 @@ public class ApkSignerTest { .setV2SigningEnabled(false) .setV3SigningEnabled(true) .setMinSdkVersionForRotation(AndroidSdkVersion.P) - .setSigningCertificateLineage(lineage)); + .setSigningCertificateLineage(lineage) + .setAlignmentPreserved(true)); assertGolden( "golden-aligned-in.apk", "golden-aligned-v1v2-out.apk", new ApkSigner.Builder(rsa2048SignerConfig) .setV1SigningEnabled(true) .setV2SigningEnabled(true) - .setV3SigningEnabled(false)); + .setV3SigningEnabled(false) + .setAlignmentPreserved(true)); assertGolden( "golden-aligned-in.apk", "golden-aligned-v2v3-out.apk", new ApkSigner.Builder(rsa2048SignerConfig) .setV1SigningEnabled(false) .setV2SigningEnabled(true) - .setV3SigningEnabled(true)); + .setV3SigningEnabled(true) + .setAlignmentPreserved(true)); assertGolden( "golden-aligned-in.apk", "golden-aligned-v2v3-lineage-out.apk", @@ -679,14 +716,16 @@ public class ApkSignerTest { .setV2SigningEnabled(true) .setV3SigningEnabled(true) .setMinSdkVersionForRotation(AndroidSdkVersion.P) - .setSigningCertificateLineage(lineage)); + .setSigningCertificateLineage(lineage) + .setAlignmentPreserved(true)); assertGolden( "golden-aligned-in.apk", "golden-aligned-v1v2v3-out.apk", new ApkSigner.Builder(rsa2048SignerConfig) .setV1SigningEnabled(true) .setV2SigningEnabled(true) - .setV3SigningEnabled(true)); + .setV3SigningEnabled(true) + .setAlignmentPreserved(true)); assertGolden( "golden-aligned-in.apk", "golden-aligned-v1v2v3-lineage-out.apk", @@ -695,7 +734,8 @@ public class ApkSignerTest { .setV2SigningEnabled(true) .setV3SigningEnabled(true) .setMinSdkVersionForRotation(AndroidSdkVersion.P) - .setSigningCertificateLineage(lineage)); + .setSigningCertificateLineage(lineage) + .setAlignmentPreserved(true)); } @Test @@ -706,19 +746,23 @@ public class ApkSignerTest { List<ApkSigner.SignerConfig> rsaSignerConfig = Collections.singletonList( getDefaultSignerConfigFromResources(FIRST_RSA_2048_SIGNER_RESOURCE_NAME)); - assertGolden("original.apk", "golden-rsa-out.apk", new ApkSigner.Builder(rsaSignerConfig)); + assertGolden("original.apk", "golden-rsa-out.apk", + new ApkSigner.Builder(rsaSignerConfig).setAlignmentPreserved(true)); assertGolden( "original.apk", "golden-rsa-minSdkVersion-1-out.apk", - new ApkSigner.Builder(rsaSignerConfig).setMinSdkVersion(1)); + new ApkSigner.Builder(rsaSignerConfig).setMinSdkVersion(1) + .setAlignmentPreserved(true)); assertGolden( "original.apk", "golden-rsa-minSdkVersion-18-out.apk", - new ApkSigner.Builder(rsaSignerConfig).setMinSdkVersion(18)); + new ApkSigner.Builder(rsaSignerConfig).setMinSdkVersion(18) + .setAlignmentPreserved(true)); assertGolden( "original.apk", "golden-rsa-minSdkVersion-24-out.apk", - new ApkSigner.Builder(rsaSignerConfig).setMinSdkVersion(24)); + new ApkSigner.Builder(rsaSignerConfig).setMinSdkVersion(24) + .setAlignmentPreserved(true)); // TODO: Add tests for DSA and ECDSA. This is non-trivial because the default // implementations of these signature algorithms are non-deterministic which means output @@ -738,7 +782,8 @@ public class ApkSignerTest { .setV1SigningEnabled(true) .setV2SigningEnabled(true) .setV3SigningEnabled(true) - .setVerityEnabled(true)); + .setVerityEnabled(true) + .setAlignmentPreserved(true)); } @Test @@ -750,7 +795,9 @@ public class ApkSignerTest { assertGolden( "original.apk", goldenOutput, - new ApkSigner.Builder(rsaSignerConfig).setAlignFileSize(true)); + new ApkSigner.Builder(rsaSignerConfig) + .setAlignFileSize(true) + .setAlignmentPreserved(true)); assertTrue(Resources.toByteArray(getClass(), goldenOutput).length % 4096 == 0); } @@ -1491,7 +1538,8 @@ public class ApkSignerTest { .setV1SigningEnabled(true) .setV2SigningEnabled(true) .setV3SigningEnabled(true) - .setVerityEnabled(true)); + .setVerityEnabled(true) + .setAlignmentPreserved(true)); assertTrue("pinlist.meta file must be in the signed APK.", resourceZipFileContains("golden-pinsapp-signed.apk", "pinlist.meta")); } |