diff --git a/core/OWNERS b/core/OWNERS index d48ceab5c5..762d2a7ff9 100644 --- a/core/OWNERS +++ b/core/OWNERS @@ -1,4 +1,5 @@ -per-file *dex_preopt*.* = ngeoffray@google.com,skvadrik@google.com +per-file *dex_preopt*.* = jiakaiz@google.com,ngeoffray@google.com,skvadrik@google.com +per-file art_*.* = jiakaiz@google.com,ngeoffray@google.com,skvadrik@google.com per-file verify_uses_libraries.sh = ngeoffray@google.com,skvadrik@google.com # For global Proguard rules diff --git a/core/art_config.mk b/core/art_config.mk new file mode 100644 index 0000000000..1ea05db2c3 --- /dev/null +++ b/core/art_config.mk @@ -0,0 +1,46 @@ +# ART configuration that has to be determined after product config is resolved. +# +# Inputs: +# PRODUCT_ENABLE_UFFD_GC: See comments in build/make/core/product.mk. +# OVERRIDE_ENABLE_UFFD_GC: Overrides PRODUCT_ENABLE_UFFD_GC. Can be passed from the commandline for +# debugging purposes. +# BOARD_API_LEVEL: See comments in build/make/core/main.mk. +# BOARD_SHIPPING_API_LEVEL: See comments in build/make/core/main.mk. +# PRODUCT_SHIPPING_API_LEVEL: See comments in build/make/core/product.mk. +# +# Outputs: +# ENABLE_UFFD_GC: Whether to use userfaultfd GC. + +config_enable_uffd_gc := \ + $(firstword $(OVERRIDE_ENABLE_UFFD_GC) $(PRODUCT_ENABLE_UFFD_GC)) + +ifeq (,$(filter-out default,$(config_enable_uffd_gc))) + ENABLE_UFFD_GC := true + + # Disable userfaultfd GC if the device doesn't support it (i.e., if + # `min(ro.board.api_level ?? ro.board.first_api_level ?? MAX_VALUE, + # ro.product.first_api_level ?? ro.build.version.sdk ?? MAX_VALUE) < 31`) + # This logic aligns with how `ro.vendor.api_level` is calculated in + # `system/core/init/property_service.cpp`. + # We omit the check on `ro.build.version.sdk` here because we are on the latest build system. + board_api_level := $(firstword $(BOARD_API_LEVEL) $(BOARD_SHIPPING_API_LEVEL)) + ifneq (,$(board_api_level)) + ifeq (true,$(call math_lt,$(board_api_level),31)) + ENABLE_UFFD_GC := false + endif + endif + + ifneq (,$(PRODUCT_SHIPPING_API_LEVEL)) + ifeq (true,$(call math_lt,$(PRODUCT_SHIPPING_API_LEVEL),31)) + ENABLE_UFFD_GC := false + endif + endif +else ifeq (true,$(config_enable_uffd_gc)) + ENABLE_UFFD_GC := true +else ifeq (false,$(config_enable_uffd_gc)) + ENABLE_UFFD_GC := false +else + $(error Unknown PRODUCT_ENABLE_UFFD_GC value: $(config_enable_uffd_gc)) +endif + +ADDITIONAL_PRODUCT_PROPERTIES += ro.dalvik.vm.enable_uffd_gc=$(ENABLE_UFFD_GC) diff --git a/core/dex_preopt_config.mk b/core/dex_preopt_config.mk index c11b7f4193..ea8389a942 100644 --- a/core/dex_preopt_config.mk +++ b/core/dex_preopt_config.mk @@ -130,6 +130,7 @@ ifeq ($(WRITE_SOONG_VARIABLES),true) $(call add_json_str, Dex2oatXmx, $(DEX2OAT_XMX)) $(call add_json_str, Dex2oatXms, $(DEX2OAT_XMS)) $(call add_json_str, EmptyDirectory, $(OUT_DIR)/empty) + $(call add_json_bool, EnableUffdGc, $(ENABLE_UFFD_GC)) ifdef TARGET_ARCH $(call add_json_map, CpuVariant) diff --git a/core/main.mk b/core/main.mk index 2e396011d3..0453cdac86 100644 --- a/core/main.mk +++ b/core/main.mk @@ -493,6 +493,8 @@ endif # Typical build; include any Android.mk files we can find. # +include $(BUILD_SYSTEM)/art_config.mk + # Bring in dex_preopt.mk # This creates some modules so it needs to be included after # should-install-to-system is defined (in order for base_rules.mk to function diff --git a/core/product.mk b/core/product.mk index dcfdf1f739..4c642b82d4 100644 --- a/core/product.mk +++ b/core/product.mk @@ -370,6 +370,18 @@ _product_single_value_vars += PRODUCT_MODULE_BUILD_FROM_SOURCE # If true, installs a full version of com.android.virt APEX. _product_single_value_vars += PRODUCT_AVF_ENABLED +# Whether to use userfaultfd GC. +# Possible values are: +# - "default" or empty: both the build system and the runtime determine whether to use userfaultfd +# GC based on the vendor API level +# - "true": forces the build system to use userfaultfd GC regardless of the vendor API level; the +# runtime determines whether to use userfaultfd GC based on the kernel support. Note that the +# device may have to re-compile everything on the first boot if the kernel doesn't support +# userfaultfd +# - "false": disallows the build system and the runtime to use userfaultfd GC even if the device +# supports it +_product_single_value_vars += PRODUCT_ENABLE_UFFD_GC + .KATI_READONLY := _product_single_value_vars _product_list_vars _product_var_list :=$= $(_product_single_value_vars) $(_product_list_vars) diff --git a/core/soong_config.mk b/core/soong_config.mk index b000df6f9c..7d3ae23d08 100644 --- a/core/soong_config.mk +++ b/core/soong_config.mk @@ -9,6 +9,7 @@ BINDER32BIT := true endif endif +include $(BUILD_SYSTEM)/art_config.mk include $(BUILD_SYSTEM)/dex_preopt_config.mk ifeq ($(WRITE_SOONG_VARIABLES),true) diff --git a/target/product/default_art_config.mk b/target/product/default_art_config.mk index 20d2865c31..4e75679a8b 100644 --- a/target/product/default_art_config.mk +++ b/target/product/default_art_config.mk @@ -113,3 +113,5 @@ PRODUCT_SYSTEM_PROPERTIES += \ dalvik.vm.image-dex2oat-Xmx=64m \ dalvik.vm.dex2oat-Xms=64m \ dalvik.vm.dex2oat-Xmx=512m \ + +PRODUCT_ENABLE_UFFD_GC := false # TODO(jiakaiz): Change this to "default".