Do not alter presigned prebuilt apks for SDK > 29.
Bug: 185811447
Test: Manual
Change-Id: I5ea143331e1bd1885dde4e46b086f4ce811f4981
diff --git a/core/app_prebuilt_internal.mk b/core/app_prebuilt_internal.mk
index 86a4adf..79639a8 100644
--- a/core/app_prebuilt_internal.mk
+++ b/core/app_prebuilt_internal.mk
@@ -183,6 +183,30 @@
$(transform-prebuilt-to-target)
else # ! LOCAL_REPLACE_PREBUILT_APK_INSTALLED
+
+# If the SDK version is 30 or higher, the apk is signed with a v2+ scheme.
+# Altering it will invalidate the signature. Just do error checks instead.
+do_not_alter_apk :=
+ifeq (PRESIGNED,$(LOCAL_CERTIFICATE))
+ ifneq (,$(LOCAL_SDK_VERSION))
+ ifeq ($(call math_is_number,$(LOCAL_SDK_VERSION)),true)
+ ifeq ($(call math_gt,$(LOCAL_SDK_VERSION),29),true)
+ do_not_alter_apk := true
+ endif
+ endif
+ # TODO: Add system_current after fixing the existing modules.
+ ifneq ($(filter current test_current core_current,$(LOCAL_SDK_VERSION)),)
+ do_not_alter_apk := true
+ endif
+ endif
+endif
+
+ifeq ($(do_not_alter_apk),true)
+$(built_module) : $(my_prebuilt_src_file) | $(ZIPALIGN)
+ $(transform-prebuilt-to-target)
+ $(check-jni-dex-compression)
+ $(check-package-alignment)
+else
# Sign and align non-presigned .apks.
# The embedded prebuilt jni to uncompress.
ifeq ($(LOCAL_CERTIFICATE),PRESIGNED)
@@ -229,6 +253,7 @@
ifdef LOCAL_COMPRESSED_MODULE
$(compress-package)
endif # LOCAL_COMPRESSED_MODULE
+endif # ! do_not_alter_apk
endif # ! LOCAL_REPLACE_PREBUILT_APK_INSTALLED
diff --git a/core/definitions.mk b/core/definitions.mk
index 7f2cc42..c5fe76b 100644
--- a/core/definitions.mk
+++ b/core/definitions.mk
@@ -2380,6 +2380,15 @@
fi
endef
+# Verifies ZIP alignment of a package.
+#
+define check-package-alignment
+$(hide) if ! $(ZIPALIGN) -c -p 4 $@ >/dev/null ; then \
+ $(call echo-error,$@,Improper package alignment); \
+ exit 1; \
+ fi
+endef
+
# Compress a package using the standard gzip algorithm.
define compress-package
$(hide) \
@@ -2448,6 +2457,15 @@
fi
endef
+# Verifies shared JNI libraries and dex files in an apk are uncompressed.
+#
+define check-jni-dex-compression
+ if (zipinfo $@ 'lib/*.so' '*.dex' 2>/dev/null | grep -v ' stor ' >/dev/null) ; then \
+ $(call echo-error,$@,Contains compressed JNI libraries and/or dex files); \
+ exit 1; \
+ fi
+endef
+
# Remove unwanted shared JNI libraries embedded in an apk.
#
define remove-unwanted-prebuilt-embedded-jni-libs