aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Groover <mpgroover@google.com>2023-11-03 22:34:06 -0500
committerMichael Groover <mpgroover@google.com>2023-11-09 22:13:40 -0600
commitf1682abcc0752e3231fc65f727f94b4f821e2d05 (patch)
tree8e658882980cc29204c4ac32120285f049903b21
parent776fedea979283b960ca0d15a15cc4cdcbf5ac07 (diff)
downloadapksig-f1682abcc0752e3231fc65f727f94b4f821e2d05.tar.gz
Set defaults to align native libraries to 16k
To support page agnostic targets, this commit changes the behavior of the apksig library and apksigner command to not preserve existing alignment for files within an APK, but instead native library files will be aligned on a 16k boundary and all other uncompressed files will use 4 bytes. APIs and command line options are provided to maintain the previous behavior by allowing the caller to specify whether native library alignment should be preserved and if not, the number of bytes to be used to page align these native library files. Bug: 299474707 Test: gradlew test Change-Id: I5cb455d7ed18f13bd7a5885bd57aa29ec20fee2c
-rw-r--r--src/apksigner/java/com/android/apksigner/ApkSignerTool.java13
-rw-r--r--src/apksigner/java/com/android/apksigner/help_sign.txt10
-rw-r--r--src/main/java/com/android/apksig/ApkSigner.java49
-rw-r--r--src/main/java/com/android/apksig/Constants.java5
-rw-r--r--src/test/java/com/android/apksig/ApkSignerTest.java122
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 af38130..525f38f 100644
--- a/src/test/java/com/android/apksig/ApkSignerTest.java
+++ b/src/test/java/com/android/apksig/ApkSignerTest.java
@@ -471,7 +471,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",
@@ -479,21 +480,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",
@@ -502,21 +506,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",
@@ -525,14 +532,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",
@@ -541,7 +550,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
@@ -550,7 +560,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",
@@ -558,21 +570,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",
@@ -581,21 +599,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",
@@ -604,14 +628,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",
@@ -620,7 +648,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
@@ -628,7 +658,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",
@@ -636,21 +667,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",
@@ -659,21 +693,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",
@@ -682,14 +719,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",
@@ -698,7 +737,8 @@ public class ApkSignerTest {
.setV2SigningEnabled(true)
.setV3SigningEnabled(true)
.setMinSdkVersionForRotation(AndroidSdkVersion.P)
- .setSigningCertificateLineage(lineage));
+ .setSigningCertificateLineage(lineage)
+ .setAlignmentPreserved(true));
}
@Test
@@ -709,19 +749,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
@@ -741,7 +785,8 @@ public class ApkSignerTest {
.setV1SigningEnabled(true)
.setV2SigningEnabled(true)
.setV3SigningEnabled(true)
- .setVerityEnabled(true));
+ .setVerityEnabled(true)
+ .setAlignmentPreserved(true));
}
@Test
@@ -753,7 +798,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);
}
@@ -1494,7 +1541,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"));
}