aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Groover <mpgroover@google.com>2023-11-16 17:34:15 +0000
committerAndroid (Google) Code Review <android-gerrit@google.com>2023-11-16 17:34:15 +0000
commit2ead4f07d75b053eaf7f7e53dd2caaf5eb105f97 (patch)
tree8e658882980cc29204c4ac32120285f049903b21
parente3b6c8cd4242f53194c3ce0d99c5bc0c939135fa (diff)
parentf1682abcc0752e3231fc65f727f94b4f821e2d05 (diff)
downloadapksig-2ead4f07d75b053eaf7f7e53dd2caaf5eb105f97.tar.gz
Merge "Set defaults to align native libraries to 16k" into main
-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"));
}