diff options
-rw-r--r-- | Android.mk | 141 | ||||
-rw-r--r-- | config/hiddenapi-dark-greylist.txt | 0 | ||||
-rw-r--r-- | config/hiddenapi-force-blacklist.txt | 1 |
3 files changed, 96 insertions, 46 deletions
diff --git a/Android.mk b/Android.mk index 6f158180b487..40716a7e5edd 100644 --- a/Android.mk +++ b/Android.mk @@ -718,23 +718,67 @@ 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_FORCE_BLACKLIST := frameworks/base/config/hiddenapi-force-blacklist.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_FORCE_BLACKLIST) \ + $(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;" \ @@ -742,43 +786,48 @@ $(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)) + $(call assert-has-no-overlap,$@,$(LOCAL_SRC_FORCE_BLACKLIST)) + +# Generate dark greylist as remaining members of classes on the light greylist, +# as well as the members of their inner classes. +# The algorithm is as follows: +# (1) extract the class descriptor from each entry in LOCAL_LIGHT_GREYLIST +# (2) strip the final semicolon and anything after (and including) a dollar sign, +# e.g. 'Lpackage/class$inner;' turns into 'Lpackage/class' +# (3) insert all entries from LOCAL_SRC_PRIVATE_API which begin with the stripped +# descriptor followed by a semi-colon or a dollar sign, e.g. matching a regex +# '^Lpackage/class[;$]' +# (4) subtract entries shared with LOCAL_LIGHT_GREYLIST +$(LOCAL_DARK_GREYLIST): $(LOCAL_SRC_ALL) $(LOCAL_LIGHT_GREYLIST) + comm -13 <(sort $(LOCAL_LIGHT_GREYLIST) $(LOCAL_SRC_FORCE_BLACKLIST)) \ + <(sed 's/;\->.*//' $(LOCAL_LIGHT_GREYLIST) | sed 's/$$.*//' | sort | uniq | \ + while read CLASS_DESC; do \ + grep -E "^$${CLASS_DESC}[;$$]" $(LOCAL_SRC_PRIVATE_API); \ + done | sort | uniq) \ + > $@ + $(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_SRC_FORCE_BLACKLIST)) + +# 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)) + $(call assert-is-subset,$(LOCAL_SRC_FORCE_BLACKLIST),$@) # 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 diff --git a/config/hiddenapi-force-blacklist.txt b/config/hiddenapi-force-blacklist.txt new file mode 100644 index 000000000000..2a10f77b862f --- /dev/null +++ b/config/hiddenapi-force-blacklist.txt @@ -0,0 +1 @@ +Ldalvik/system/VMRuntime;->setHiddenApiExemptions([Ljava/lang/String;)V |