diff --git a/core/app_prebuilt_internal.mk b/core/app_prebuilt_internal.mk index 79639a8301..f5d213e646 100644 --- a/core/app_prebuilt_internal.mk +++ b/core/app_prebuilt_internal.mk @@ -142,6 +142,9 @@ else $(built_module): $(LOCAL_CERTIFICATE_LINEAGE) $(built_module): PRIVATE_CERTIFICATE_LINEAGE := $(LOCAL_CERTIFICATE_LINEAGE) + + $(built_module): $(LOCAL_ROTATION_MIN_SDK_VERSION) + $(built_module): PRIVATE_ROTATION_MIN_SDK_VERSION := $(LOCAL_ROTATION_MIN_SDK_VERSION) endif ifneq ($(LOCAL_MODULE_STEM),) diff --git a/core/clear_vars.mk b/core/clear_vars.mk index a67cca6372..2ed7b856ad 100644 --- a/core/clear_vars.mk +++ b/core/clear_vars.mk @@ -263,6 +263,7 @@ LOCAL_RES_LIBRARIES:= LOCAL_RESOURCE_DIR:= LOCAL_RLIB_LIBRARIES:= LOCAL_RMTYPEDEFS:= +LOCAL_ROTATION_MIN_SDK_VERSION:= LOCAL_RRO_THEME:= LOCAL_RTTI_FLAG:= LOCAL_SANITIZE:= diff --git a/core/definitions.mk b/core/definitions.mk index c7172ca9e6..00bd336d79 100644 --- a/core/definitions.mk +++ b/core/definitions.mk @@ -2351,6 +2351,7 @@ define sign-package-arg $(hide) mv $(1) $(1).unsigned $(hide) $(JAVA) -Djava.library.path=$$(dirname $(SIGNAPK_JNI_LIBRARY_PATH)) -jar $(SIGNAPK_JAR) \ $(if $(strip $(PRIVATE_CERTIFICATE_LINEAGE)), --lineage $(PRIVATE_CERTIFICATE_LINEAGE)) \ + $(if $(strip $(PRIVATE_ROTATION_MIN_SDK_VERSION)), --rotation-min-sdk-version $(PRIVATE_ROTATION_MIN_SDK_VERSION)) \ $(PRIVATE_CERTIFICATE) $(PRIVATE_PRIVATE_KEY) \ $(PRIVATE_ADDITIONAL_CERTIFICATES) $(1).unsigned $(1).signed $(hide) mv $(1).signed $(1) diff --git a/core/package_internal.mk b/core/package_internal.mk index 9f5a5992dd..730395c80a 100644 --- a/core/package_internal.mk +++ b/core/package_internal.mk @@ -469,6 +469,9 @@ $(LOCAL_BUILT_MODULE): PRIVATE_ADDITIONAL_CERTIFICATES := $(additional_certifica $(LOCAL_BUILT_MODULE): $(LOCAL_CERTIFICATE_LINEAGE) $(LOCAL_BUILT_MODULE): PRIVATE_CERTIFICATE_LINEAGE := $(LOCAL_CERTIFICATE_LINEAGE) +$(LOCAL_BUILT_MODULE): $(LOCAL_ROTATION_MIN_SDK_VERSION) +$(LOCAL_BUILT_MODULE): PRIVATE_ROTATION_MIN_SDK_VERSION := $(LOCAL_ROTATION_MIN_SDK_VERSION) + # Set a actual_partition_tag (calculated in base_rules.mk) for the package. PACKAGES.$(LOCAL_PACKAGE_NAME).PARTITION := $(actual_partition_tag) diff --git a/tools/signapk/src/com/android/signapk/SignApk.java b/tools/signapk/src/com/android/signapk/SignApk.java index 8bf1005466..ec55a2cd51 100644 --- a/tools/signapk/src/com/android/signapk/SignApk.java +++ b/tools/signapk/src/com/android/signapk/SignApk.java @@ -1050,6 +1050,7 @@ class SignApk { boolean signUsingApkSignatureSchemeV2 = true; boolean signUsingApkSignatureSchemeV4 = false; SigningCertificateLineage certLineage = null; + Integer rotationMinSdkVersion = null; int argstart = 0; while (argstart < args.length && args[argstart].startsWith("-")) { @@ -1092,6 +1093,15 @@ class SignApk { "Error reading lineage file: " + e.getMessage()); } ++argstart; + } else if ("--rotation-min-sdk-version".equals(args[argstart])) { + String rotationMinSdkVersionString = args[++argstart]; + try { + rotationMinSdkVersion = Integer.parseInt(rotationMinSdkVersionString); + } catch (NumberFormatException e) { + throw new IllegalArgumentException( + "--rotation-min-sdk-version must be a decimal number: " + rotationMinSdkVersionString); + } + ++argstart; } else { usage(); } @@ -1175,15 +1185,22 @@ class SignApk { } } - try (ApkSignerEngine apkSigner = - new DefaultApkSignerEngine.Builder( - createSignerConfigs(privateKey, publicKey), minSdkVersion) - .setV1SigningEnabled(true) - .setV2SigningEnabled(signUsingApkSignatureSchemeV2) - .setOtherSignersSignaturesPreserved(false) - .setCreatedBy("1.0 (Android SignApk)") - .setSigningCertificateLineage(certLineage) - .build()) { + DefaultApkSignerEngine.Builder builder = new DefaultApkSignerEngine.Builder( + createSignerConfigs(privateKey, publicKey), minSdkVersion) + .setV1SigningEnabled(true) + .setV2SigningEnabled(signUsingApkSignatureSchemeV2) + .setOtherSignersSignaturesPreserved(false) + .setCreatedBy("1.0 (Android SignApk)"); + + if (certLineage != null) { + builder = builder.setSigningCertificateLineage(certLineage); + } + + if (rotationMinSdkVersion != null) { + builder = builder.setMinSdkVersionForRotation(rotationMinSdkVersion); + } + + try (ApkSignerEngine apkSigner = builder.build()) { // We don't preserve the input APK's APK Signing Block (which contains v2 // signatures) apkSigner.inputApkSigningBlock(null);