From 74502c75003ff88c0dfd3d7f5e0b0c4c46058943 Mon Sep 17 00:00:00 2001 From: David Brazdil Date: Tue, 8 May 2018 15:04:20 +0100 Subject: [PATCH] Refactor build rules for hidden API lists The build rules were getting messy and too difficult to extend. Extract assertions into own functions, create shared variables. Bug: 64382372 Test: make out/target/common/obj/PACKAGING/hiddenapi-blacklist.txt Merged-In: Ie34adb8b5349b30daa2e9e4976d285f6d9711f0e Change-Id: Ie34adb8b5349b30daa2e9e4976d285f6d9711f0e (cherry picked from commit 721bc8e6a8b1350c62b4a570f523541d1ce1124a) --- Android.mk | 123 +++++++++++++++++++++++-------------- config/hiddenapi-dark-greylist.txt | 0 2 files changed, 77 insertions(+), 46 deletions(-) delete mode 100644 config/hiddenapi-dark-greylist.txt diff --git a/Android.mk b/Android.mk index a7d639b35177..6639d7d1cf12 100644 --- a/Android.mk +++ b/Android.mk @@ -583,23 +583,65 @@ include $(BUILD_HOST_JAVA_LIBRARY) # ==== hiddenapi lists ======================================= +include $(CLEAR_VARS) + +# File names of final API lists +LOCAL_LIGHT_GREYLIST := $(INTERNAL_PLATFORM_HIDDENAPI_LIGHT_GREYLIST) +LOCAL_DARK_GREYLIST := $(INTERNAL_PLATFORM_HIDDENAPI_DARK_GREYLIST) +LOCAL_BLACKLIST := $(INTERNAL_PLATFORM_HIDDENAPI_BLACKLIST) + +# File names of source files we will use to generate the final API lists. +LOCAL_SRC_GREYLIST := frameworks/base/config/hiddenapi-light-greylist.txt +LOCAL_SRC_VENDOR_LIST := frameworks/base/config/hiddenapi-vendor-list.txt +LOCAL_SRC_PRIVATE_API := $(INTERNAL_PLATFORM_PRIVATE_DEX_API_FILE) +LOCAL_SRC_REMOVED_API := $(INTERNAL_PLATFORM_REMOVED_DEX_API_FILE) + +LOCAL_SRC_ALL := \ + $(LOCAL_SRC_GREYLIST) \ + $(LOCAL_SRC_VENDOR_LIST) \ + $(LOCAL_SRC_PRIVATE_API) \ + $(LOCAL_SRC_REMOVED_API) + +define assert-has-no-overlap +if [ ! -z "`comm -12 <(sort $(1)) <(sort $(2))`" ]; then \ + echo "$(1) and $(2) should not overlap" 1>&2; \ + comm -12 <(sort $(1)) <(sort $(2)) 1>&2; \ + exit 1; \ +fi +endef + +define assert-is-subset +if [ ! -z "`comm -23 <(sort $(1)) <(sort $(2))`" ]; then \ + echo "$(1) must be a subset of $(2)" 1>&2; \ + comm -23 <(sort $(1)) <(sort $(2)) 1>&2; \ + exit 1; \ +fi +endef + +define assert-has-no-duplicates +if [ ! -z "`sort $(1) | uniq -D`" ]; then \ + echo "$(1) has duplicate entries" 1>&2; \ + sort $(1) | uniq -D 1>&2; \ + exit 1; \ +fi +endef -# Copy light and dark greylist over into the build folder. -# This is for ART buildbots which need to mock these lists and have alternative -# rules for building them. Other rules in the build system should depend on the -# files in the build folder. +# The following rules build API lists in the build folder. +# By not using files from the source tree, ART buildbots can mock these lists +# or have alternative rules for building them. Other rules in the build system +# should depend on the files in the build folder. # Merge light greylist from multiple files: -# (1) manual light greylist -# (2) list of usages from vendor apps -# (3) list of removed APIs +# (1) manual greylist LOCAL_SRC_GREYLIST +# (2) list of usages from vendor apps LOCAL_SRC_VENDOR_LIST +# (3) list of removed APIs in LOCAL_SRC_REMOVED_API # @removed does not imply private in Doclava. We must take the subset also -# in PRIVATE_API. +# in LOCAL_SRC_PRIVATE_API. # (4) list of serialization APIs # Automatically adds all methods which match the signatures in # REGEX_SERIALIZATION. These are greylisted in order to allow applications # to write their own serializers. -$(INTERNAL_PLATFORM_HIDDENAPI_LIGHT_GREYLIST): REGEX_SERIALIZATION := \ +$(LOCAL_LIGHT_GREYLIST): REGEX_SERIALIZATION := \ "readObject\(Ljava/io/ObjectInputStream;\)V" \ "readObjectNoData\(\)V" \ "readResolve\(\)Ljava/lang/Object;" \ @@ -607,43 +649,32 @@ $(INTERNAL_PLATFORM_HIDDENAPI_LIGHT_GREYLIST): REGEX_SERIALIZATION := \ "serialPersistentFields:\[Ljava/io/ObjectStreamField;" \ "writeObject\(Ljava/io/ObjectOutputStream;\)V" \ "writeReplace\(\)Ljava/lang/Object;" -$(INTERNAL_PLATFORM_HIDDENAPI_LIGHT_GREYLIST): PRIVATE_API := $(INTERNAL_PLATFORM_PRIVATE_DEX_API_FILE) -$(INTERNAL_PLATFORM_HIDDENAPI_LIGHT_GREYLIST): REMOVED_API := $(INTERNAL_PLATFORM_REMOVED_DEX_API_FILE) -$(INTERNAL_PLATFORM_HIDDENAPI_LIGHT_GREYLIST): frameworks/base/config/hiddenapi-light-greylist.txt \ - frameworks/base/config/hiddenapi-vendor-list.txt \ - $(INTERNAL_PLATFORM_PRIVATE_DEX_API_FILE) \ - $(INTERNAL_PLATFORM_REMOVED_DEX_API_FILE) - sort frameworks/base/config/hiddenapi-light-greylist.txt \ - frameworks/base/config/hiddenapi-vendor-list.txt \ - <(grep -E "\->("$(subst $(space),"|",$(REGEX_SERIALIZATION))")$$" $(PRIVATE_API)) \ - <(comm -12 <(sort $(REMOVED_API)) <(sort $(PRIVATE_API))) \ - > $@ - -$(eval $(call copy-one-file,frameworks/base/config/hiddenapi-dark-greylist.txt,\ - $(INTERNAL_PLATFORM_HIDDENAPI_DARK_GREYLIST))) - -# Generate dark greylist as private API minus (blacklist plus light greylist). - -$(INTERNAL_PLATFORM_HIDDENAPI_BLACKLIST): PRIVATE_API := $(INTERNAL_PLATFORM_PRIVATE_DEX_API_FILE) -$(INTERNAL_PLATFORM_HIDDENAPI_BLACKLIST): LIGHT_GREYLIST := $(INTERNAL_PLATFORM_HIDDENAPI_LIGHT_GREYLIST) -$(INTERNAL_PLATFORM_HIDDENAPI_BLACKLIST): DARK_GREYLIST := $(INTERNAL_PLATFORM_HIDDENAPI_DARK_GREYLIST) -$(INTERNAL_PLATFORM_HIDDENAPI_BLACKLIST): $(INTERNAL_PLATFORM_PRIVATE_DEX_API_FILE) \ - $(INTERNAL_PLATFORM_HIDDENAPI_LIGHT_GREYLIST) \ - $(INTERNAL_PLATFORM_HIDDENAPI_DARK_GREYLIST) - if [ ! -z "`comm -12 <(sort $(LIGHT_GREYLIST)) <(sort $(DARK_GREYLIST))`" ]; then \ - echo "There should be no overlap between $(LIGHT_GREYLIST) and $(DARK_GREYLIST)" 1>&2; \ - comm -12 <(sort $(LIGHT_GREYLIST)) <(sort $(DARK_GREYLIST)) 1>&2; \ - exit 1; \ - elif [ ! -z "`comm -13 <(sort $(PRIVATE_API)) <(sort $(LIGHT_GREYLIST))`" ]; then \ - echo "$(LIGHT_GREYLIST) must be a subset of $(PRIVATE_API)" 1>&2; \ - comm -13 <(sort $(PRIVATE_API)) <(sort $(LIGHT_GREYLIST)) 1>&2; \ - exit 2; \ - elif [ ! -z "`comm -13 <(sort $(PRIVATE_API)) <(sort $(DARK_GREYLIST))`" ]; then \ - echo "$(DARK_GREYLIST) must be a subset of $(PRIVATE_API)" 1>&2; \ - comm -13 <(sort $(PRIVATE_API)) <(sort $(DARK_GREYLIST)) 1>&2; \ - exit 3; \ - fi - comm -23 <(sort $(PRIVATE_API)) <(sort $(LIGHT_GREYLIST) $(DARK_GREYLIST)) > $@ +$(LOCAL_LIGHT_GREYLIST): $(LOCAL_SRC_ALL) + sort $(LOCAL_SRC_GREYLIST) $(LOCAL_SRC_VENDOR_LIST) \ + <(grep -E "\->("$(subst $(space),"|",$(REGEX_SERIALIZATION))")$$" \ + $(LOCAL_SRC_PRIVATE_API)) \ + <(comm -12 <(sort $(LOCAL_SRC_REMOVED_API)) <(sort $(LOCAL_SRC_PRIVATE_API))) \ + > $@ + $(call assert-has-no-duplicates,$@) + $(call assert-is-subset,$@,$(LOCAL_SRC_PRIVATE_API)) + +# Generate an empty dark greylist. +$(LOCAL_DARK_GREYLIST): $(LOCAL_SRC_ALL) $(LOCAL_LIGHT_GREYLIST) + rm -f $@ + touch $@ + $(call assert-is-subset,$@,$(LOCAL_SRC_PRIVATE_API)) + $(call assert-has-no-duplicates,$@) + $(call assert-has-no-overlap,$@,$(LOCAL_LIGHT_GREYLIST)) + +# Generate blacklist as private API minus (light greylist plus dark greylist). +$(LOCAL_BLACKLIST): $(LOCAL_SRC_ALL) $(LOCAL_LIGHT_GREYLIST) $(LOCAL_DARK_GREYLIST) + comm -13 <(sort $(LOCAL_LIGHT_GREYLIST) $(LOCAL_DARK_GREYLIST)) \ + <(sort $(LOCAL_SRC_PRIVATE_API)) \ + > $@ + $(call assert-is-subset,$@,$(LOCAL_SRC_PRIVATE_API)) + $(call assert-has-no-duplicates,$@) + $(call assert-has-no-overlap,$@,$(LOCAL_LIGHT_GREYLIST)) + $(call assert-has-no-overlap,$@,$(LOCAL_DARK_GREYLIST)) # Build AOSP blacklist # ============================================================ diff --git a/config/hiddenapi-dark-greylist.txt b/config/hiddenapi-dark-greylist.txt deleted file mode 100644 index e69de29bb2d1..000000000000 -- 2.11.0