summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Brazdil <dbrazdil@google.com>2018-05-08 15:04:20 +0100
committerDavid Brazdil <dbrazdil@google.com>2018-05-08 17:12:28 +0100
commit721bc8e6a8b1350c62b4a570f523541d1ce1124a (patch)
treee73b2930b63e0c4951b9e27fea6f1f3195e0d987
parent1b5e2d8b3e9694a809433ecc1b40f266eea9349d (diff)
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 Change-Id: Ie34adb8b5349b30daa2e9e4976d285f6d9711f0e
-rw-r--r--Android.mk123
-rw-r--r--config/hiddenapi-dark-greylist.txt0
2 files changed, 77 insertions, 46 deletions
diff --git a/Android.mk b/Android.mk
index bb37fa21c463..ff2a62c30a62 100644
--- a/Android.mk
+++ b/Android.mk
@@ -867,23 +867,65 @@ LOCAL_ERROR_PRONE_FLAGS := -XepDisableAllChecks
include $(BUILD_STATIC_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;" \
@@ -891,43 +933,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))
# Include subdirectory makefiles
# ============================================================
diff --git a/config/hiddenapi-dark-greylist.txt b/config/hiddenapi-dark-greylist.txt
deleted file mode 100644
index e69de29bb2d1..000000000000
--- a/config/hiddenapi-dark-greylist.txt
+++ /dev/null