Merge "Allow AVF remote attestation to be disabled" into main
diff --git a/core/release_config.mk b/core/release_config.mk
index 5fe3d39..887c78b 100644
--- a/core/release_config.mk
+++ b/core/release_config.mk
@@ -130,10 +130,11 @@
# Disable the build flag in release-config.
_args += --guard=false
endif
- _flags_file:=$(OUT_DIR)/soong/release-config/release_config-$(TARGET_PRODUCT)-$(TARGET_RELEASE).vars
+ _flags_dir:=$(OUT_DIR)/soong/release-config
+ _flags_file:=$(_flags_dir)/release_config-$(TARGET_PRODUCT)-$(TARGET_RELEASE).vars
# release-config generates $(_flags_varmk)
_flags_varmk:=$(_flags_file:.vars=.varmk)
- $(shell $(OUT_DIR)/release-config $(_args) >$(OUT_DIR)/release-config.out 2>&1 && touch -t 200001010000 $(_flags_varmk))
+ $(shell $(OUT_DIR)/release-config $(_args) >$(OUT_DIR)/release-config.out && touch -t 200001010000 $(_flags_varmk))
$(if $(filter-out 0,$(.SHELLSTATUS)),$(error release-config failed to run))
ifneq (,$(_final_product_config_pass))
# Save the final version of the config.
@@ -148,7 +149,21 @@
_used_files :=
ifeq (,$(_must_protobuf)$(RELEASE_BUILD_FLAGS_IN_PROTOBUF))
_use_protobuf :=
+ else
+ _base_all_release := all_release_configs-$(TARGET_PRODUCT)
+ $(call dist-for-goals,droid,\
+ $(_flags_dir)/$(_base_all_release).pb:build_flags/all_release_configs.pb \
+ $(_flags_dir)/$(_base_all_release).textproto:build_flags/all_release_configs.textproto \
+ $(_flags_dir)/$(_base_all_release).json:build_flags/all_release_configs.json \
+ )
+# These are always created, add an empty rule for them to keep ninja happy.
+$(_flags_dir)/$(_base_all_release).pb $(_flags_dir)/$(_base_all_release).textproto $(_flags_dir)/$(_base_all_release).json:
+ : created by $(OUT_DIR)/release-config
+ _base_all_release :=
endif
+ _flags_dir:=
+ _flags_file:=
+ _flags_varmk:=
endif
ifeq (,$(_use_protobuf))
# The .mk files are the canonical source of truth.
diff --git a/core/soong_config.mk b/core/soong_config.mk
index 7300e8c..7402d2b 100644
--- a/core/soong_config.mk
+++ b/core/soong_config.mk
@@ -167,7 +167,6 @@
$(call add_json_list, BootJars, $(PRODUCT_BOOT_JARS))
$(call add_json_list, ApexBootJars, $(filter-out $(APEX_BOOT_JARS_EXCLUDED), $(PRODUCT_APEX_BOOT_JARS)))
-$(call add_json_bool, VndkUseCoreVariant, $(TARGET_VNDK_USE_CORE_VARIANT))
$(call add_json_bool, VndkSnapshotBuildArtifacts, $(VNDK_SNAPSHOT_BUILD_ARTIFACTS))
$(call add_json_map, BuildFlags)
diff --git a/core/tasks/device-platinum-tests.mk b/core/tasks/device-platinum-tests.mk
index 270248c..75f4c4c 100644
--- a/core/tasks/device-platinum-tests.mk
+++ b/core/tasks/device-platinum-tests.mk
@@ -15,20 +15,23 @@
.PHONY: device-platinum-tests
-device-platinum-tests-zip := $(PRODUCT_OUT)/device-platinum-tests.zip
+device_platinum_tests_zip := $(PRODUCT_OUT)/device-platinum-tests.zip
# Create an artifact to include a list of test config files in device-platinum-tests.
-device-platinum-tests-list-zip := $(PRODUCT_OUT)/device-platinum-tests_list.zip
+device_platinum_tests_list_zip := $(PRODUCT_OUT)/device-platinum-tests_list.zip
# Create an artifact to include all test config files in device-platinum-tests.
-device-platinum-tests-configs-zip := $(PRODUCT_OUT)/device-platinum-tests_configs.zip
+device_platinum_tests_configs_zip := $(PRODUCT_OUT)/device-platinum-tests_configs.zip
my_host_shared_lib_for_device_platinum_tests := $(call copy-many-files,$(COMPATIBILITY.device-platinum-tests.HOST_SHARED_LIBRARY.FILES))
device_platinum_tests_host_shared_libs_zip := $(PRODUCT_OUT)/device-platinum-tests_host-shared-libs.zip
-$(device-platinum-tests-zip) : .KATI_IMPLICIT_OUTPUTS := $(device-platinum-tests-list-zip) $(device-platinum-tests-configs-zip) $(device_platinum_tests_host_shared_libs_zip)
-$(device-platinum-tests-zip) : PRIVATE_device_platinum_tests_list := $(PRODUCT_OUT)/device-platinum-tests_list
-$(device-platinum-tests-zip) : PRIVATE_HOST_SHARED_LIBS := $(my_host_shared_lib_for_device_platinum_tests)
-$(device-platinum-tests-zip) : PRIVATE_device_host_shared_libs_zip := $(device_platinum_tests_host_shared_libs_zip)
-$(device-platinum-tests-zip) : $(COMPATIBILITY.device-platinum-tests.FILES) $(my_host_shared_lib_for_device_platinum_tests) $(SOONG_ZIP)
+$(device_platinum_tests_zip) : .KATI_IMPLICIT_OUTPUTS := $(device_platinum_tests_list_zip) $(device_platinum_tests_configs_zip) $(device_platinum_tests_host_shared_libs_zip)
+$(device_platinum_tests_zip) : PRIVATE_device_platinum_tests_list_zip := $(device_platinum_tests_list_zip)
+$(device_platinum_tests_zip) : PRIVATE_device_platinum_tests_configs_zip := $(device_platinum_tests_configs_zip)
+$(device_platinum_tests_zip) : PRIVATE_device_platinum_tests_list := $(PRODUCT_OUT)/device-platinum-tests_list
+$(device_platinum_tests_zip) : PRIVATE_HOST_SHARED_LIBS := $(my_host_shared_lib_for_device_platinum_tests)
+$(device_platinum_tests_zip) : PRIVATE_device_host_shared_libs_zip := $(device_platinum_tests_host_shared_libs_zip)
+$(device_platinum_tests_zip) : $(COMPATIBILITY.device-platinum-tests.FILES) $(my_host_shared_lib_for_device_platinum_tests) $(SOONG_ZIP)
rm -f $@-shared-libs.list
+ rm -f $(PRIVATE_device_platinum_tests_list_zip)
echo $(sort $(COMPATIBILITY.device-platinum-tests.FILES)) | tr " " "\n" > $@.list
grep $(HOST_OUT_TESTCASES) $@.list > $@-host.list || true
grep -e .*\\.config$$ $@-host.list > $@-host-test-configs.list || true
@@ -40,7 +43,7 @@
grep $(TARGET_OUT_TESTCASES) $@.list > $@-target.list || true
grep -e .*\\.config$$ $@-target.list > $@-target-test-configs.list || true
$(hide) $(SOONG_ZIP) -d -o $@ -P host -C $(HOST_OUT) -l $@-host.list -P target -C $(PRODUCT_OUT) -l $@-target.list -sha256
- $(hide) $(SOONG_ZIP) -d -o $(device-platinum-tests-configs-zip) \
+ $(hide) $(SOONG_ZIP) -d -o $(PRIVATE_device_platinum_tests_configs_zip) \
-P host -C $(HOST_OUT) -l $@-host-test-configs.list \
-P target -C $(PRODUCT_OUT) -l $@-target-test-configs.list
$(SOONG_ZIP) -d -o $(PRIVATE_device_host_shared_libs_zip) \
@@ -48,21 +51,21 @@
rm -f $(PRIVATE_device_platinum_tests_list)
$(hide) grep -e .*\\.config$$ $@-host.list | sed s%$(HOST_OUT)%host%g > $(PRIVATE_device_platinum_tests_list)
$(hide) grep -e .*\\.config$$ $@-target.list | sed s%$(PRODUCT_OUT)%target%g >> $(PRIVATE_device_platinum_tests_list)
- $(hide) $(SOONG_ZIP) -d -o $(device-platinum-tests-list-zip) -C $(dir $@) -f $(PRIVATE_device_platinum_tests_list)
+ $(hide) $(SOONG_ZIP) -d -o $(PRIVATE_device_platinum_tests_list_zip) -C $(dir $@) -f $(PRIVATE_device_platinum_tests_list)
rm -f $@.list $@-host.list $@-target.list $@-host-test-configs.list $@-target-test-configs.list \
$@-shared-libs.list $@-host-shared-libs.list $(PRIVATE_device_platinum_tests_list)
-device-platinum-tests: $(device-platinum-tests-zip)
-$(call dist-for-goals, device-platinum-tests, $(device-platinum-tests-zip) $(device-platinum-tests-list-zip) $(device-platinum-tests-configs-zip) $(device_platinum_tests_host_shared_libs_zip))
+device-platinum-tests: $(device_platinum_tests_zip)
+$(call dist-for-goals, device-platinum-tests, $(device_platinum_tests_zip) $(device_platinum_tests_list_zip) $(device_platinum_tests_configs_zip) $(device_platinum_tests_host_shared_libs_zip))
-$(call declare-1p-container,$(device-platinum-tests-zip),)
-$(call declare-container-license-deps,$(device-platinum-tests-zip),$(COMPATIBILITY.device-platinum-tests.FILES) $(my_host_shared_lib_for_device_platinum_tests),$(PRODUCT_OUT)/:/)
+$(call declare-1p-container,$(device_platinum_tests_zip),)
+$(call declare-container-license-deps,$(device_platinum_tests_zip),$(COMPATIBILITY.device-platinum-tests.FILES) $(my_host_shared_lib_for_device_platinum_tests),$(PRODUCT_OUT)/:/)
tests: device-platinum-tests
# Reset temp vars
-device-platinum-tests-zip :=
-device-platinum-tests-list-zip :=
-device-platinum-tests-configs-zip :=
+device_platinum_tests_zip :=
+device_platinum_tests_list_zip :=
+device_platinum_tests_configs_zip :=
my_host_shared_lib_for_device_platinum_tests :=
-device_platinum_tests_host_shared_libs_zip :=
\ No newline at end of file
+device_platinum_tests_host_shared_libs_zip :=
diff --git a/core/tasks/performance-tests.mk b/core/tasks/performance-tests.mk
index 32c156d..8702756 100644
--- a/core/tasks/performance-tests.mk
+++ b/core/tasks/performance-tests.mk
@@ -15,40 +15,42 @@
.PHONY: performance-tests
-performance-tests-zip := $(PRODUCT_OUT)/performance-tests.zip
+performance_tests_zip := $(PRODUCT_OUT)/performance-tests.zip
# Create an artifact to include a list of test config files in performance-tests.
-performance-tests-list-zip := $(PRODUCT_OUT)/performance-tests_list.zip
+performance_tests_list_zip := $(PRODUCT_OUT)/performance-tests_list.zip
# Create an artifact to include all test config files in performance-tests.
-performance-tests-configs-zip := $(PRODUCT_OUT)/performance-tests_configs.zip
+performance_tests_configs_zip := $(PRODUCT_OUT)/performance-tests_configs.zip
-$(performance-tests-zip) : .KATI_IMPLICIT_OUTPUTS := $(performance-tests-list-zip) $(performance-tests-configs-zip)
-$(performance-tests-zip) : PRIVATE_performance_tests_list := $(PRODUCT_OUT)/performance-tests_list
-$(performance-tests-zip) : $(COMPATIBILITY.performance-tests.FILES) $(SOONG_ZIP)
+$(performance_tests_zip) : .KATI_IMPLICIT_OUTPUTS := $(performance_tests_list_zip) $(performance_tests_configs_zip)
+$(performance_tests_zip) : PRIVATE_performance_tests_list_zip := $(performance_tests_list_zip)
+$(performance_tests_zip) : PRIVATE_performance_tests_configs_zip := $(performance_tests_configs_zip)
+$(performance_tests_zip) : PRIVATE_performance_tests_list := $(PRODUCT_OUT)/performance-tests_list
+$(performance_tests_zip) : $(COMPATIBILITY.performance-tests.FILES) $(SOONG_ZIP)
echo $(sort $(COMPATIBILITY.performance-tests.FILES)) | tr " " "\n" > $@.list
grep $(HOST_OUT_TESTCASES) $@.list > $@-host.list || true
grep -e .*\\.config$$ $@-host.list > $@-host-test-configs.list || true
grep $(TARGET_OUT_TESTCASES) $@.list > $@-target.list || true
grep -e .*\\.config$$ $@-target.list > $@-target-test-configs.list || true
$(hide) $(SOONG_ZIP) -d -o $@ -P host -C $(HOST_OUT) -l $@-host.list -P target -C $(PRODUCT_OUT) -l $@-target.list -sha256
- $(hide) $(SOONG_ZIP) -d -o $(performance-tests-configs-zip) \
+ $(hide) $(SOONG_ZIP) -d -o $(PRIVATE_performance_tests_configs_zip) \
-P host -C $(HOST_OUT) -l $@-host-test-configs.list \
-P target -C $(PRODUCT_OUT) -l $@-target-test-configs.list
rm -f $(PRIVATE_performance_tests_list)
$(hide) grep -e .*\\.config$$ $@-host.list | sed s%$(HOST_OUT)%host%g > $(PRIVATE_performance_tests_list)
$(hide) grep -e .*\\.config$$ $@-target.list | sed s%$(PRODUCT_OUT)%target%g >> $(PRIVATE_performance_tests_list)
- $(hide) $(SOONG_ZIP) -d -o $(performance-tests-list-zip) -C $(dir $@) -f $(PRIVATE_performance_tests_list)
+ $(hide) $(SOONG_ZIP) -d -o $(PRIVATE_performance_tests_list_zip) -C $(dir $@) -f $(PRIVATE_performance_tests_list)
rm -f $@.list $@-host.list $@-target.list $@-host-test-configs.list $@-target-test-configs.list \
$(PRIVATE_performance_tests_list)
-performance-tests: $(performance-tests-zip)
-$(call dist-for-goals, performance-tests, $(performance-tests-zip) $(performance-tests-list-zip) $(performance-tests-configs-zip))
+performance-tests: $(performance_tests_zip)
+$(call dist-for-goals, performance-tests, $(performance_tests_zip) $(performance_tests_list_zip) $(performance_tests_configs_zip))
-$(call declare-1p-container,$(performance-tests-zip),)
-$(call declare-container-license-deps,$(performance-tests-zip),$(COMPATIBILITY.performance-tests.FILES),$(PRODUCT_OUT)/:/)
+$(call declare-1p-container,$(performance_tests_zip),)
+$(call declare-container-license-deps,$(performance_tests_zip),$(COMPATIBILITY.performance-tests.FILES),$(PRODUCT_OUT)/:/)
tests: performance-tests
# Reset temp vars
-performance-tests-zip :=
-performance-tests-list-zip :=
-performance-tests-configs-zip :=
+performance_tests_zip :=
+performance_tests_list_zip :=
+performance_tests_configs_zip :=
diff --git a/envsetup.sh b/envsetup.sh
index 640ed14..647c106 100644
--- a/envsetup.sh
+++ b/envsetup.sh
@@ -48,80 +48,13 @@
fi
IMPORTING_ENVSETUP=true source $T/build/make/shell_utils.sh
-
-# Help
-function hmm() {
-cat <<EOF
-
-Run "m help" for help with the build system itself.
-
-Invoke ". build/envsetup.sh" from your shell to add the following functions to your environment:
-- lunch: lunch <product_name>-<release_type>-<build_variant>
- Selects <product_name> as the product to build, and <build_variant> as the variant to
- build, and stores those selections in the environment to be read by subsequent
- invocations of 'm' etc.
-- tapas: tapas [<App1> <App2> ...] [arm|x86|arm64|x86_64] [eng|userdebug|user]
- Sets up the build environment for building unbundled apps (APKs).
-- banchan: banchan <module1> [<module2> ...] \\
- [arm|x86|arm64|riscv64|x86_64|arm64_only|x86_64only] [eng|userdebug|user]
- Sets up the build environment for building unbundled modules (APEXes).
-- croot: Changes directory to the top of the tree, or a subdirectory thereof.
-- m: Makes from the top of the tree.
-- mm: Builds and installs all of the modules in the current directory, and their
- dependencies.
-- mmm: Builds and installs all of the modules in the supplied directories, and their
- dependencies.
- To limit the modules being built use the syntax: mmm dir/:target1,target2.
-- mma: Same as 'mm'
-- mmma: Same as 'mmm'
-- provision: Flash device with all required partitions. Options will be passed on to fastboot.
-- cgrep: Greps on all local C/C++ files.
-- ggrep: Greps on all local Gradle files.
-- gogrep: Greps on all local Go files.
-- jgrep: Greps on all local Java files.
-- jsongrep: Greps on all local Json files.
-- ktgrep: Greps on all local Kotlin files.
-- resgrep: Greps on all local res/*.xml files.
-- mangrep: Greps on all local AndroidManifest.xml files.
-- mgrep: Greps on all local Makefiles and *.bp files.
-- owngrep: Greps on all local OWNERS files.
-- rsgrep: Greps on all local Rust files.
-- sepgrep: Greps on all local sepolicy files.
-- sgrep: Greps on all local source files.
-- tomlgrep: Greps on all local Toml files.
-- pygrep: Greps on all local Python files.
-- godir: Go to the directory containing a file.
-- allmod: List all modules.
-- gomod: Go to the directory containing a module.
-- pathmod: Get the directory containing a module.
-- outmod: Gets the location of a module's installed outputs with a certain extension.
-- dirmods: Gets the modules defined in a given directory.
-- installmod: Adb installs a module's built APK.
-- refreshmod: Refresh list of modules for allmod/gomod/pathmod/outmod/installmod.
-- syswrite: Remount partitions (e.g. system.img) as writable, rebooting if necessary.
-
-Environment options:
-- SANITIZE_HOST: Set to 'address' to use ASAN for all host modules.
-- ANDROID_QUIET_BUILD: set to 'true' to display only the essential messages.
-
-Look at the source to view more functions. The complete list is:
-EOF
- local T=$(gettop)
- local A=""
- local i
- for i in `cat $T/build/envsetup.sh | sed -n "/^[[:blank:]]*function /s/function \([a-z_]*\).*/\1/p" | sort | uniq`; do
- A="$A $i"
- done
- echo $A
-}
-
# Get all the build variables needed by this script in a single call to the build system.
function build_build_var_cache()
{
local T=$(gettop)
# Grep out the variable names from the script.
- cached_vars=(`cat $T/build/envsetup.sh | tr '()' ' ' | awk '{for(i=1;i<=NF;i++) if($i~/get_build_var/) print $(i+1)}' | sort -u | tr '\n' ' '`)
- cached_abs_vars=(`cat $T/build/envsetup.sh | tr '()' ' ' | awk '{for(i=1;i<=NF;i++) if($i~/get_abs_build_var/) print $(i+1)}' | sort -u | tr '\n' ' '`)
+ cached_vars=(`cat $T/build/envsetup.sh | tr '()' ' ' | awk '{for(i=1;i<=NF;i++) if($i~/_get_build_var_cached/) print $(i+1)}' | sort -u | tr '\n' ' '`)
+ cached_abs_vars=(`cat $T/build/envsetup.sh | tr '()' ' ' | awk '{for(i=1;i<=NF;i++) if($i~/_get_abs_build_var_cached/) print $(i+1)}' | sort -u | tr '\n' ' '`)
# Call the build system to dump the "<val>=<value>" pairs as a shell script.
build_dicts_script=`\builtin cd $T; build/soong/soong_ui.bash --dumpvars-mode \
--vars="${cached_vars[*]}" \
@@ -162,7 +95,7 @@
}
# Get the value of a build variable as an absolute path.
-function get_abs_build_var()
+function _get_abs_build_var_cached()
{
if [ "$BUILD_VAR_CACHE_READY" = "true" ]
then
@@ -179,7 +112,7 @@
}
# Get the exact value of a build variable.
-function get_build_var()
+function _get_build_var_cached()
{
if [ "$BUILD_VAR_CACHE_READY" = "true" ]
then
@@ -251,25 +184,25 @@
fi
# And in with the new...
- ANDROID_LUNCH_BUILD_PATHS=$(get_abs_build_var SOONG_HOST_OUT_EXECUTABLES)
- ANDROID_LUNCH_BUILD_PATHS+=:$(get_abs_build_var HOST_OUT_EXECUTABLES)
+ ANDROID_LUNCH_BUILD_PATHS=$(_get_abs_build_var_cached SOONG_HOST_OUT_EXECUTABLES)
+ ANDROID_LUNCH_BUILD_PATHS+=:$(_get_abs_build_var_cached HOST_OUT_EXECUTABLES)
# Append llvm binutils prebuilts path to ANDROID_LUNCH_BUILD_PATHS.
- local ANDROID_LLVM_BINUTILS=$(get_abs_build_var ANDROID_CLANG_PREBUILTS)/llvm-binutils-stable
+ local ANDROID_LLVM_BINUTILS=$(_get_abs_build_var_cached ANDROID_CLANG_PREBUILTS)/llvm-binutils-stable
ANDROID_LUNCH_BUILD_PATHS+=:$ANDROID_LLVM_BINUTILS
# Set up ASAN_SYMBOLIZER_PATH for SANITIZE_HOST=address builds.
export ASAN_SYMBOLIZER_PATH=$ANDROID_LLVM_BINUTILS/llvm-symbolizer
# Append asuite prebuilts path to ANDROID_LUNCH_BUILD_PATHS.
- local os_arch=$(get_build_var HOST_PREBUILT_TAG)
+ local os_arch=$(_get_build_var_cached HOST_PREBUILT_TAG)
ANDROID_LUNCH_BUILD_PATHS+=:$T/prebuilts/asuite/acloud/$os_arch
ANDROID_LUNCH_BUILD_PATHS+=:$T/prebuilts/asuite/aidegen/$os_arch
ANDROID_LUNCH_BUILD_PATHS+=:$T/prebuilts/asuite/atest/$os_arch
- export ANDROID_JAVA_HOME=$(get_abs_build_var ANDROID_JAVA_HOME)
+ export ANDROID_JAVA_HOME=$(_get_abs_build_var_cached ANDROID_JAVA_HOME)
export JAVA_HOME=$ANDROID_JAVA_HOME
- export ANDROID_JAVA_TOOLCHAIN=$(get_abs_build_var ANDROID_JAVA_TOOLCHAIN)
+ export ANDROID_JAVA_TOOLCHAIN=$(_get_abs_build_var_cached ANDROID_JAVA_TOOLCHAIN)
ANDROID_LUNCH_BUILD_PATHS+=:$ANDROID_JAVA_TOOLCHAIN
# Fix up PYTHONPATH
@@ -298,20 +231,20 @@
export PYTHONPATH=$ANDROID_PYTHONPATH$PYTHONPATH
unset ANDROID_PRODUCT_OUT
- export ANDROID_PRODUCT_OUT=$(get_abs_build_var PRODUCT_OUT)
+ export ANDROID_PRODUCT_OUT=$(_get_abs_build_var_cached PRODUCT_OUT)
export OUT=$ANDROID_PRODUCT_OUT
unset ANDROID_HOST_OUT
- export ANDROID_HOST_OUT=$(get_abs_build_var HOST_OUT)
+ export ANDROID_HOST_OUT=$(_get_abs_build_var_cached HOST_OUT)
unset ANDROID_SOONG_HOST_OUT
- export ANDROID_SOONG_HOST_OUT=$(get_abs_build_var SOONG_HOST_OUT)
+ export ANDROID_SOONG_HOST_OUT=$(_get_abs_build_var_cached SOONG_HOST_OUT)
unset ANDROID_HOST_OUT_TESTCASES
- export ANDROID_HOST_OUT_TESTCASES=$(get_abs_build_var HOST_OUT_TESTCASES)
+ export ANDROID_HOST_OUT_TESTCASES=$(_get_abs_build_var_cached HOST_OUT_TESTCASES)
unset ANDROID_TARGET_OUT_TESTCASES
- export ANDROID_TARGET_OUT_TESTCASES=$(get_abs_build_var TARGET_OUT_TESTCASES)
+ export ANDROID_TARGET_OUT_TESTCASES=$(_get_abs_build_var_cached TARGET_OUT_TESTCASES)
# Finally, set PATH
export PATH=$ANDROID_LUNCH_BUILD_PATHS:$PATH
@@ -384,7 +317,7 @@
echo "Couldn't locate the top of the tree. Try setting TOP." >&2
return
fi
- get_build_var report_config
+ _get_build_var_cached report_config
}
function set_stuff_for_environment()
@@ -474,7 +407,7 @@
{
local uname=$(uname)
local choices
- choices=$(TARGET_BUILD_APPS= TARGET_PRODUCT= TARGET_RELEASE= TARGET_BUILD_VARIANT= get_build_var COMMON_LUNCH_CHOICES 2>/dev/null)
+ choices=$(TARGET_BUILD_APPS= TARGET_PRODUCT= TARGET_RELEASE= TARGET_BUILD_VARIANT= _get_build_var_cached COMMON_LUNCH_CHOICES 2>/dev/null)
local ret=$?
echo
@@ -533,7 +466,7 @@
selection=aosp_cf_x86_64_phone-trunk_staging-eng
elif (echo -n $answer | grep -q -e "^[0-9][0-9]*$")
then
- local choices=($(TARGET_BUILD_APPS= TARGET_PRODUCT= TARGET_RELEASE= TARGET_BUILD_VARIANT= get_build_var COMMON_LUNCH_CHOICES 2>/dev/null))
+ local choices=($(TARGET_BUILD_APPS= TARGET_PRODUCT= TARGET_RELEASE= TARGET_BUILD_VARIANT= _get_build_var_cached COMMON_LUNCH_CHOICES 2>/dev/null))
if [ $answer -le ${#choices[@]} ]
then
# array in zsh starts from 1 instead of 0.
@@ -575,8 +508,8 @@
fi
return 1
fi
- export TARGET_PRODUCT=$(get_build_var TARGET_PRODUCT)
- export TARGET_BUILD_VARIANT=$(get_build_var TARGET_BUILD_VARIANT)
+ export TARGET_PRODUCT=$(_get_build_var_cached TARGET_PRODUCT)
+ export TARGET_BUILD_VARIANT=$(_get_build_var_cached TARGET_BUILD_VARIANT)
export TARGET_RELEASE=$release
# Note this is the string "release", not the value of the variable.
export TARGET_BUILD_TYPE=release
@@ -613,7 +546,7 @@
prev="${COMP_WORDS[COMP_CWORD-1]}"
if [ -z "$COMMON_LUNCH_CHOICES_CACHE" ]; then
- COMMON_LUNCH_CHOICES_CACHE=$(TARGET_BUILD_APPS= get_build_var COMMON_LUNCH_CHOICES)
+ COMMON_LUNCH_CHOICES_CACHE=$(TARGET_BUILD_APPS= _get_build_var_cached COMMON_LUNCH_CHOICES)
fi
COMPREPLY=( $(compgen -W "${COMMON_LUNCH_CHOICES_CACHE}" -- ${cur}) )
@@ -862,142 +795,6 @@
)
}
-# simplified version of ps; output in the form
-# <pid> <procname>
-function qpid() {
- local prepend=''
- local append=''
- if [ "$1" = "--exact" ]; then
- prepend=' '
- append='$'
- shift
- elif [ "$1" = "--help" -o "$1" = "-h" ]; then
- echo "usage: qpid [[--exact] <process name|pid>"
- return 255
- fi
-
- local EXE="$1"
- if [ "$EXE" ] ; then
- qpid | \grep "$prepend$EXE$append"
- else
- adb shell ps \
- | tr -d '\r' \
- | sed -e 1d -e 's/^[^ ]* *\([0-9]*\).* \([^ ]*\)$/\1 \2/'
- fi
-}
-
-# coredump_setup - enable core dumps globally for any process
-# that has the core-file-size limit set correctly
-#
-# NOTE: You must call also coredump_enable for a specific process
-# if its core-file-size limit is not set already.
-# NOTE: Core dumps are written to ramdisk; they will not survive a reboot!
-
-function coredump_setup()
-{
- echo "Getting root...";
- adb root;
- adb wait-for-device;
-
- echo "Remounting root partition read-write...";
- adb shell mount -w -o remount -t rootfs rootfs;
- sleep 1;
- adb wait-for-device;
- adb shell mkdir -p /cores;
- adb shell mount -t tmpfs tmpfs /cores;
- adb shell chmod 0777 /cores;
-
- echo "Granting SELinux permission to dump in /cores...";
- adb shell restorecon -R /cores;
-
- echo "Set core pattern.";
- adb shell 'echo /cores/core.%p > /proc/sys/kernel/core_pattern';
-
- echo "Done."
-}
-
-# coredump_enable - enable core dumps for the specified process
-# $1 = PID of process (e.g., $(pid mediaserver))
-#
-# NOTE: coredump_setup must have been called as well for a core
-# dump to actually be generated.
-
-function coredump_enable()
-{
- local PID=$1;
- if [ -z "$PID" ]; then
- printf "Expecting a PID!\n";
- return;
- fi;
- echo "Setting core limit for $PID to infinite...";
- adb shell /system/bin/ulimit -P $PID -c unlimited
-}
-
-# core - send SIGV and pull the core for process
-# $1 = PID of process (e.g., $(pid mediaserver))
-#
-# NOTE: coredump_setup must be called once per boot for core dumps to be
-# enabled globally.
-
-function core()
-{
- local PID=$1;
-
- if [ -z "$PID" ]; then
- printf "Expecting a PID!\n";
- return;
- fi;
-
- local CORENAME=core.$PID;
- local COREPATH=/cores/$CORENAME;
- local SIG=SEGV;
-
- coredump_enable $1;
-
- local done=0;
- while [ $(adb shell "[ -d /proc/$PID ] && echo -n yes") ]; do
- printf "\tSending SIG%s to %d...\n" $SIG $PID;
- adb shell kill -$SIG $PID;
- sleep 1;
- done;
-
- adb shell "while [ ! -f $COREPATH ] ; do echo waiting for $COREPATH to be generated; sleep 1; done"
- echo "Done: core is under $COREPATH on device.";
-}
-
-# systemstack - dump the current stack trace of all threads in the system process
-# to the usual ANR traces file
-function systemstack()
-{
- stacks system_server
-}
-
-# Read the ELF header from /proc/$PID/exe to determine if the process is
-# 64-bit.
-function is64bit()
-{
- local PID="$1"
- if [ "$PID" ] ; then
- if [[ "$(adb shell cat /proc/$PID/exe | xxd -l 1 -s 4 -p)" -eq "02" ]] ; then
- echo "64"
- else
- echo ""
- fi
- else
- echo ""
- fi
-}
-
-function gettargetarch
-{
- get_build_var TARGET_ARCH
-}
-
-function getprebuilt
-{
- get_abs_build_var ANDROID_PREBUILTS
-}
-
# communicate with a running device or emulator, set up necessary state,
# and run the hat command.
function runhat()
@@ -1050,100 +847,6 @@
hat -JXmx512m $localFile
}
-function getbugreports()
-{
- local reports=(`adb shell ls /sdcard/bugreports | tr -d '\r'`)
-
- if [ ! "$reports" ]; then
- echo "Could not locate any bugreports."
- return
- fi
-
- local report
- for report in ${reports[@]}
- do
- echo "/sdcard/bugreports/${report}"
- adb pull /sdcard/bugreports/${report} ${report}
- gunzip ${report}
- done
-}
-
-function getsdcardpath()
-{
- adb ${adbOptions} shell echo -n \$\{EXTERNAL_STORAGE\}
-}
-
-function getscreenshotpath()
-{
- echo "$(getsdcardpath)/Pictures/Screenshots"
-}
-
-function getlastscreenshot()
-{
- local screenshot_path=$(getscreenshotpath)
- local screenshot=`adb ${adbOptions} ls ${screenshot_path} | grep Screenshot_[0-9-]*.*\.png | sort -rk 3 | cut -d " " -f 4 | head -n 1`
- if [ "$screenshot" = "" ]; then
- echo "No screenshots found."
- return
- fi
- echo "${screenshot}"
- adb ${adbOptions} pull ${screenshot_path}/${screenshot}
-}
-
-function startviewserver()
-{
- local port=4939
- if [ $# -gt 0 ]; then
- port=$1
- fi
- adb shell service call window 1 i32 $port
-}
-
-function stopviewserver()
-{
- adb shell service call window 2
-}
-
-function isviewserverstarted()
-{
- adb shell service call window 3
-}
-
-function key_home()
-{
- adb shell input keyevent 3
-}
-
-function key_back()
-{
- adb shell input keyevent 4
-}
-
-function key_menu()
-{
- adb shell input keyevent 82
-}
-
-function smoketest()
-{
- if [ ! "$ANDROID_PRODUCT_OUT" ]; then
- echo "Couldn't locate output files. Try running 'lunch' first." >&2
- return
- fi
- local T=$(gettop)
- if [ ! "$T" ]; then
- echo "Couldn't locate the top of the tree. Try setting TOP." >&2
- return
- fi
-
- (\cd "$T" && mmm tests/SmokeTest) &&
- adb uninstall com.android.smoketest > /dev/null &&
- adb uninstall com.android.smoketest.tests > /dev/null &&
- adb install $ANDROID_PRODUCT_OUT/data/app/SmokeTestApp.apk &&
- adb install $ANDROID_PRODUCT_OUT/data/app/SmokeTest.apk &&
- adb shell am instrument -w com.android.smoketest.tests/android.test.InstrumentationTestRunner
-}
-
function godir () {
if [[ -z "$1" ]]; then
echo "Usage: godir <regex>"
@@ -1195,87 +898,10 @@
\cd $T/$pathname
}
-# Verifies that module-info.txt exists, returning nonzero if it doesn't.
-function verifymodinfo() {
- if [ ! "$ANDROID_PRODUCT_OUT" ]; then
- if [ "$QUIET_VERIFYMODINFO" != "true" ] ; then
- echo "No ANDROID_PRODUCT_OUT. Try running 'lunch' first." >&2
- fi
- return 1
- fi
-
- if [ ! -f "$ANDROID_PRODUCT_OUT/module-info.json" ]; then
- if [ "$QUIET_VERIFYMODINFO" != "true" ] ; then
- echo "Could not find module-info.json. Please run 'refreshmod' first." >&2
- fi
- return 1
- fi
-}
-
-# List all modules for the current device, as cached in all_modules.txt. If any build change is
-# made and it should be reflected in the output, you should run `m nothing` first.
-function allmod() {
- cat $ANDROID_PRODUCT_OUT/all_modules.txt 2>/dev/null
-}
-
-# Get the path of a specific module in the android tree, as cached in module-info.json.
-# If any build change is made, and it should be reflected in the output, you should run
-# 'refreshmod' first. Note: This is the inverse of dirmods.
-function pathmod() {
- if [[ $# -ne 1 ]]; then
- echo "usage: pathmod <module>" >&2
- return 1
- fi
-
- verifymodinfo || return 1
-
- local relpath=$(python3 -c "import json, os
-module = '$1'
-module_info = json.load(open('$ANDROID_PRODUCT_OUT/module-info.json'))
-if module not in module_info:
- exit(1)
-print(module_info[module]['path'][0])" 2>/dev/null)
-
- if [ -z "$relpath" ]; then
- echo "Could not find module '$1' (try 'refreshmod' if there have been build changes?)." >&2
- return 1
- else
- echo "$ANDROID_BUILD_TOP/$relpath"
- fi
-}
-
-# Get the path of a specific module in the android tree, as cached in module-info.json.
-# If any build change is made, and it should be reflected in the output, you should run
-# 'refreshmod' first. Note: This is the inverse of pathmod.
-function dirmods() {
- if [[ $# -ne 1 ]]; then
- echo "usage: dirmods <path>" >&2
- return 1
- fi
-
- verifymodinfo || return 1
-
- python3 -c "import json, os
-dir = '$1'
-while dir.endswith('/'):
- dir = dir[:-1]
-prefix = dir + '/'
-module_info = json.load(open('$ANDROID_PRODUCT_OUT/module-info.json'))
-results = set()
-for m in module_info.values():
- for path in m.get(u'path', []):
- if path == dir or path.startswith(prefix):
- name = m.get(u'module_name')
- if name:
- results.add(name)
-for name in sorted(results):
- print(name)
-"
-}
-
-
# Go to a specific module in the android tree, as cached in module-info.json. If any build change
# is made, and it should be reflected in the output, you should run 'refreshmod' first.
+# Note: This function is in envsetup because changing the directory needs to happen in the current
+# shell. All other functions that use module-info.json should be in build/soong/bin.
function gomod() {
if [[ $# -ne 1 ]]; then
echo "usage: gomod <module>" >&2
@@ -1289,90 +915,11 @@
cd $path
}
-# Gets the list of a module's installed outputs, as cached in module-info.json.
-# If any build change is made, and it should be reflected in the output, you should run 'refreshmod' first.
-function outmod() {
- if [[ $# -ne 1 ]]; then
- echo "usage: outmod <module>" >&2
- return 1
- fi
-
- verifymodinfo || return 1
-
- local relpath
- relpath=$(python3 -c "import json, os
-module = '$1'
-module_info = json.load(open('$ANDROID_PRODUCT_OUT/module-info.json'))
-if module not in module_info:
- exit(1)
-for output in module_info[module]['installed']:
- print(os.path.join('$ANDROID_BUILD_TOP', output))" 2>/dev/null)
-
- if [ $? -ne 0 ]; then
- echo "Could not find module '$1' (try 'refreshmod' if there have been build changes?)" >&2
- return 1
- elif [ ! -z "$relpath" ]; then
- echo "$relpath"
- fi
-}
-
-# adb install a module's apk, as cached in module-info.json. If any build change
-# is made, and it should be reflected in the output, you should run 'refreshmod' first.
-# Usage: installmod [adb install arguments] <module>
-# For example: installmod -r Dialer -> adb install -r /path/to/Dialer.apk
-function installmod() {
- if [[ $# -eq 0 ]]; then
- echo "usage: installmod [adb install arguments] <module>" >&2
- echo "" >&2
- echo "Only flags to be passed after the \"install\" in adb install are supported," >&2
- echo "with the exception of -s. If -s is passed it will be placed before the \"install\"." >&2
- echo "-s must be the first flag passed if it exists." >&2
- return 1
- fi
-
- local _path
- _path=$(outmod ${@:$#:1})
- if [ $? -ne 0 ]; then
- return 1
- fi
-
- _path=$(echo "$_path" | grep -E \\.apk$ | head -n 1)
- if [ -z "$_path" ]; then
- echo "Module '$1' does not produce a file ending with .apk (try 'refreshmod' if there have been build changes?)" >&2
- return 1
- fi
- local serial_device=""
- if [[ "$1" == "-s" ]]; then
- if [[ $# -le 2 ]]; then
- echo "-s requires an argument" >&2
- return 1
- fi
- serial_device="-s $2"
- shift 2
- fi
- local length=$(( $# - 1 ))
- echo adb $serial_device install ${@:1:$length} $_path
- adb $serial_device install ${@:1:$length} $_path
-}
-
function _complete_android_module_names() {
local word=${COMP_WORDS[COMP_CWORD]}
COMPREPLY=( $(allmod | grep -E "^$word") )
}
-# Print colored exit condition
-function pez {
- "$@"
- local retval=$?
- if [ $retval -ne 0 ]
- then
- echo $'\E'"[0;31mFAILURE\e[00m"
- else
- echo $'\E'"[0;32mSUCCESS\e[00m"
- fi
- return $retval
-}
-
function get_make_command()
{
# If we're in the top of an Android tree, use soong_ui.bash instead of make
@@ -1390,57 +937,11 @@
fi
}
-function _trigger_build()
-(
- local -r bc="$1"; shift
- local T=$(gettop)
- if [ -n "$T" ]; then
- _wrap_build "$T/build/soong/soong_ui.bash" --build-mode --${bc} --dir="$(pwd)" "$@"
- else
- >&2 echo "Couldn't locate the top of the tree. Try setting TOP."
- return 1
- fi
- local ret=$?
- if [[ ret -eq 0 && -z "${ANDROID_QUIET_BUILD:-}" && -n "${ANDROID_BUILD_BANNER}" ]]; then
- echo "${ANDROID_BUILD_BANNER}"
- fi
- return $ret
-)
-
function make()
{
_wrap_build $(get_make_command "$@") "$@"
}
-function provision()
-{
- if [ ! "$ANDROID_PRODUCT_OUT" ]; then
- echo "Couldn't locate output files. Try running 'lunch' first." >&2
- return 1
- fi
- if [ ! -e "$ANDROID_PRODUCT_OUT/provision-device" ]; then
- echo "There is no provisioning script for the device." >&2
- return 1
- fi
-
- # Check if user really wants to do this.
- if [ "$1" = "--no-confirmation" ]; then
- shift 1
- else
- echo "This action will reflash your device."
- echo ""
- echo "ALL DATA ON THE DEVICE WILL BE IRREVOCABLY ERASED."
- echo ""
- echo -n "Are you sure you want to do this (yes/no)? "
- read
- if [[ "${REPLY}" != "yes" ]] ; then
- echo "Not taking any action. Exiting." >&2
- return 1
- fi
- fi
- "$ANDROID_PRODUCT_OUT/provision-device" "$@"
-}
-
# Zsh needs bashcompinit called to support bash-style completion.
function enable_zsh_completion() {
# Don't override user's options if bash-style completion is already enabled.
@@ -1522,7 +1023,7 @@
return
;;
esac
- OUT_DIR="$(get_abs_build_var OUT_DIR)"
+ OUT_DIR="$(_get_abs_build_var_cached OUT_DIR)"
if [[ "$1" == "--regenerate" ]]; then
shift 1
NINJA_ARGS="-t commands $@" m
@@ -1537,32 +1038,58 @@
# in build/soong/bin. Unset these for the time being so the real
# script is picked up.
# TODO: Remove this some time after a suitable delay (maybe 2025?)
+unset allmod
unset aninja
-unset overrideflags
-unset m
-unset mm
-unset mmm
-unset mma
-unset mmma
unset cgrep
+unset core
+unset coredump_enable
+unset coredump_setup
+unset dirmods
+unset get_build_var
+unset get_abs_build_var
+unset getlastscreenshot
+unset getprebuilt
+unset getscreenshotpath
+unset getsdcardpath
+unset gettargetarch
unset ggrep
unset gogrep
+unset hmm
+unset installmod
+unset is64bit
+unset isviewserverstarted
unset jgrep
unset jsongrep
+unset key_back
+unset key_home
+unset key_menu
unset ktgrep
+unset m
unset mangrep
unset mgrep
+unset mm
+unset mma
+unset mmm
+unset mmma
+unset outmod
+unset overrideflags
unset owngrep
+unset pathmod
+unset pez
unset pygrep
+unset qpid
unset rcgrep
+unset refreshmod
unset resgrep
unset rsgrep
unset sepgrep
unset sgrep
+unset startviewserver
+unset stopviewserver
+unset systemstack
+unset syswrite
unset tomlgrep
unset treegrep
-unset syswrite
-unset refreshmod
validate_current_shell
@@ -1571,4 +1098,3 @@
addcompletions
-
diff --git a/target/board/ndk/BoardConfig.mk b/target/board/ndk/BoardConfig.mk
index d5399b2..e367918 100644
--- a/target/board/ndk/BoardConfig.mk
+++ b/target/board/ndk/BoardConfig.mk
@@ -14,7 +14,3 @@
#
TARGET_ARCH_SUITE := ndk
-
-MALLOC_LOW_MEMORY := true
-
-USE_SAFESTACK := false
diff --git a/target/product/gsi_release.mk b/target/product/gsi_release.mk
index 884b419..5044a39 100644
--- a/target/product/gsi_release.mk
+++ b/target/product/gsi_release.mk
@@ -50,10 +50,13 @@
init.gsi.rc \
init.vndk-nodef.rc \
+
# Overlay the GSI specific SystemUI setting
-PRODUCT_PACKAGES += gsi_overlay_systemui
-PRODUCT_COPY_FILES += \
- device/generic/common/overlays/overlay-config.xml:$(TARGET_COPY_OUT_SYSTEM_EXT)/overlay/config/config.xml
+ifneq ($(PRODUCT_IS_AUTOMOTIVE),true)
+ PRODUCT_PACKAGES += gsi_overlay_systemui
+ PRODUCT_COPY_FILES += \
+ device/generic/common/overlays/overlay-config.xml:$(TARGET_COPY_OUT_SYSTEM_EXT)/overlay/config/config.xml
+endif
# b/308878144 no more VNDK on 24Q1 and beyond
KEEP_VNDK ?= false
diff --git a/tools/aconfig/aconfig/templates/cpp_source_file.template b/tools/aconfig/aconfig/templates/cpp_source_file.template
index 4c098c5..38dda7d 100644
--- a/tools/aconfig/aconfig/templates/cpp_source_file.template
+++ b/tools/aconfig/aconfig/templates/cpp_source_file.template
@@ -124,14 +124,14 @@
"{item.container}",
aconfig_storage::StorageFileType::package_map);
if (!package_map_file.ok()) \{
- ALOGI("error: failed to get package map file: %s", package_map_file.error().message().c_str());
+ ALOGI("error: failed to get package map file: %s", package_map_file.error().c_str());
return result;
}
auto package_read_context = aconfig_storage::get_package_read_context(
**package_map_file, "{package}");
if (!package_read_context.ok()) \{
- ALOGI("error: failed to get package read context: %s", package_map_file.error().message().c_str());
+ ALOGI("error: failed to get package read context: %s", package_map_file.error().c_str());
return result;
}
@@ -141,7 +141,7 @@
"{item.container}",
aconfig_storage::StorageFileType::flag_val);
if (!flag_val_map.ok()) \{
- ALOGI("error: failed to get flag val map: %s", package_map_file.error().message().c_str());
+ ALOGI("error: failed to get flag val map: %s", package_map_file.error().c_str());
return result;
}
@@ -149,7 +149,7 @@
**flag_val_map,
package_read_context->boolean_start_index + {item.flag_offset});
if (!value.ok()) \{
- ALOGI("error: failed to get flag val: %s", package_map_file.error().message().c_str());
+ ALOGI("error: failed to get flag val: %s", package_map_file.error().c_str());
return result;
}
diff --git a/tools/aconfig/aconfig_storage_read_api/Android.bp b/tools/aconfig/aconfig_storage_read_api/Android.bp
index db36294..9b84254 100644
--- a/tools/aconfig/aconfig_storage_read_api/Android.bp
+++ b/tools/aconfig/aconfig_storage_read_api/Android.bp
@@ -9,8 +9,6 @@
srcs: ["src/lib.rs"],
rustlibs: [
"libanyhow",
- "libonce_cell",
- "libtempfile",
"libmemmap2",
"libcxx",
"libthiserror",
@@ -34,6 +32,9 @@
name: "aconfig_storage_read_api.test",
test_suites: ["general-tests"],
defaults: ["aconfig_storage_read_api.defaults"],
+ rustlibs: [
+ "librand",
+ ],
data: [
"tests/package.map",
"tests/flag.map",
@@ -89,14 +90,6 @@
host_supported: true,
vendor_available: true,
product_available: true,
- static_libs: [
- "libaconfig_storage_protos_cc",
- "libprotobuf-cpp-lite",
- ],
- shared_libs: [
- "liblog",
- "libbase",
- ],
apex_available: [
"//apex_available:platform",
"//apex_available:anyapex",
@@ -108,6 +101,7 @@
},
},
double_loadable: true,
+ afdo: true,
}
cc_defaults {
diff --git a/tools/aconfig/aconfig_storage_read_api/Cargo.toml b/tools/aconfig/aconfig_storage_read_api/Cargo.toml
index 30a4298..2b27e4b 100644
--- a/tools/aconfig/aconfig_storage_read_api/Cargo.toml
+++ b/tools/aconfig/aconfig_storage_read_api/Cargo.toml
@@ -8,10 +8,9 @@
cargo = []
[dependencies]
+rand = "0.8.5"
anyhow = "1.0.69"
memmap2 = "0.8.0"
-once_cell = "1.19.0"
-tempfile = "3.9.0"
cxx = "1.0"
thiserror = "1.0.56"
aconfig_storage_file = { path = "../aconfig_storage_file" }
diff --git a/tools/aconfig/aconfig_storage_read_api/aconfig_storage_read_api.cpp b/tools/aconfig/aconfig_storage_read_api/aconfig_storage_read_api.cpp
index 0aa936a..97ada3a 100644
--- a/tools/aconfig/aconfig_storage_read_api/aconfig_storage_read_api.cpp
+++ b/tools/aconfig/aconfig_storage_read_api/aconfig_storage_read_api.cpp
@@ -1,85 +1,56 @@
-#include <android-base/file.h>
-#include <android-base/logging.h>
-#include <protos/aconfig_storage_metadata.pb.h>
-
#include <sys/mman.h>
#include <sys/stat.h>
#include <fcntl.h>
+#include <errno.h>
+#include <string.h>
#include "rust/cxx.h"
#include "aconfig_storage/lib.rs.h"
#include "aconfig_storage/aconfig_storage_read_api.hpp"
-using storage_records_pb = android::aconfig_storage_metadata::storage_files;
-using storage_record_pb = android::aconfig_storage_metadata::storage_file_info;
-using namespace android::base;
-
namespace aconfig_storage {
/// Storage location pb file
-static constexpr char kAvailableStorageRecordsPb[] =
- "/metadata/aconfig/boot/available_storage_file_records.pb";
+static constexpr char kStorageDir[] = "/metadata/aconfig";
/// destructor
MappedStorageFile::~MappedStorageFile() {
munmap(file_ptr, file_size);
}
-/// Read aconfig storage records pb file
-static Result<storage_records_pb> read_storage_records_pb(std::string const& pb_file) {
- auto records = storage_records_pb();
- auto content = std::string();
- if (!ReadFileToString(pb_file, &content)) {
- return ErrnoError() << "ReadFileToString failed";
- }
-
- if (!records.ParseFromString(content)) {
- return ErrnoError() << "Unable to parse persistent storage records protobuf";
- }
- return records;
-}
-
/// Get storage file path
static Result<std::string> find_storage_file(
- std::string const& pb_file,
+ std::string const& storage_dir,
std::string const& container,
StorageFileType file_type) {
- auto records_pb = read_storage_records_pb(pb_file);
- if (!records_pb.ok()) {
- return Error() << "Unable to read storage records from " << pb_file
- << " : " << records_pb.error();
+ switch(file_type) {
+ case StorageFileType::package_map:
+ return storage_dir + "/maps/" + container + ".package.map";
+ case StorageFileType::flag_map:
+ return storage_dir + "/maps/" + container + ".flag.map";
+ case StorageFileType::flag_val:
+ return storage_dir + "/boot/" + container + ".val";
+ case StorageFileType::flag_info:
+ return storage_dir + "/boot/" + container + ".info";
+ default:
+ auto result = Result<std::string>();
+ result.errmsg = "Invalid storage file type";
+ return result;
}
-
- for (auto& entry : records_pb->files()) {
- if (entry.container() == container) {
- switch(file_type) {
- case StorageFileType::package_map:
- return entry.package_map();
- case StorageFileType::flag_map:
- return entry.flag_map();
- case StorageFileType::flag_val:
- return entry.flag_val();
- case StorageFileType::flag_info:
- return entry.flag_info();
- default:
- return Error() << "Invalid file type " << file_type;
- }
- }
- }
-
- return Error() << "Unable to find storage files for container " << container;;
}
namespace private_internal_api {
/// Get mapped file implementation.
Result<MappedStorageFile*> get_mapped_file_impl(
- std::string const& pb_file,
+ std::string const& storage_dir,
std::string const& container,
StorageFileType file_type) {
- auto file_result = find_storage_file(pb_file, container, file_type);
+ auto file_result = find_storage_file(storage_dir, container, file_type);
if (!file_result.ok()) {
- return Error() << file_result.error();
+ auto result = Result<MappedStorageFile*>();
+ result.errmsg = file_result.error();
+ return result;
}
return map_storage_file(*file_result);
}
@@ -90,18 +61,24 @@
Result<MappedStorageFile*> map_storage_file(std::string const& file) {
int fd = open(file.c_str(), O_CLOEXEC | O_NOFOLLOW | O_RDONLY);
if (fd == -1) {
- return ErrnoError() << "failed to open " << file;
+ auto result = Result<MappedStorageFile*>();
+ result.errmsg = std::string("failed to open ") + file + ": " + strerror(errno);
+ return result;
};
struct stat fd_stat;
if (fstat(fd, &fd_stat) < 0) {
- return ErrnoError() << "fstat failed";
+ auto result = Result<MappedStorageFile*>();
+ result.errmsg = std::string("fstat failed: ") + strerror(errno);
+ return result;
}
size_t file_size = fd_stat.st_size;
void* const map_result = mmap(nullptr, file_size, PROT_READ, MAP_SHARED, fd, 0);
if (map_result == MAP_FAILED) {
- return ErrnoError() << "mmap failed";
+ auto result = Result<MappedStorageFile*>();
+ result.errmsg = std::string("mmap failed: ") + strerror(errno);
+ return result;
}
auto mapped_file = new MappedStorageFile();
@@ -112,7 +89,7 @@
}
/// Map from StoredFlagType to FlagValueType
-android::base::Result<FlagValueType> map_to_flag_value_type(
+Result<FlagValueType> map_to_flag_value_type(
StoredFlagType stored_type) {
switch (stored_type) {
case StoredFlagType::ReadWriteBoolean:
@@ -120,7 +97,9 @@
case StoredFlagType::FixedReadOnlyBoolean:
return FlagValueType::Boolean;
default:
- return Error() << "Unsupported stored flag type";
+ auto result = Result<FlagValueType>();
+ result.errmsg = "Unsupported stored flag type";
+ return result;
}
}
@@ -129,7 +108,7 @@
std::string const& container,
StorageFileType file_type) {
return private_internal_api::get_mapped_file_impl(
- kAvailableStorageRecordsPb, container, file_type);
+ kStorageDir, container, file_type);
}
/// Get storage file version number
@@ -140,7 +119,9 @@
if (version_cxx.query_success) {
return version_cxx.version_number;
} else {
- return Error() << version_cxx.error_message;
+ auto result = Result<uint32_t>();
+ result.errmsg = version_cxx.error_message.c_str();
+ return result;
}
}
@@ -158,7 +139,9 @@
context.boolean_start_index = context_cxx.boolean_start_index;
return context;
} else {
- return Error() << context_cxx.error_message;
+ auto result = Result<PackageReadContext>();
+ result.errmsg = context_cxx.error_message.c_str();
+ return result;
}
}
@@ -177,7 +160,9 @@
context.flag_index = context_cxx.flag_index;
return context;
} else {
- return Error() << context_cxx.error_message;
+ auto result = Result<FlagReadContext>();
+ result.errmsg = context_cxx.error_message.c_str();
+ return result;
}
}
@@ -191,7 +176,9 @@
if (value_cxx.query_success) {
return value_cxx.flag_value;
} else {
- return Error() << value_cxx.error_message;
+ auto result = Result<bool>();
+ result.errmsg = value_cxx.error_message.c_str();
+ return result;
}
}
@@ -207,7 +194,9 @@
if (info_cxx.query_success) {
return info_cxx.flag_attribute;
} else {
- return Error() << info_cxx.error_message;
+ auto result = Result<uint8_t>();
+ result.errmsg = info_cxx.error_message.c_str();
+ return result;
}
}
} // namespace aconfig_storage
diff --git a/tools/aconfig/aconfig_storage_read_api/include/aconfig_storage/aconfig_storage_read_api.hpp b/tools/aconfig/aconfig_storage_read_api/include/aconfig_storage/aconfig_storage_read_api.hpp
index e6d7537..b50935b 100644
--- a/tools/aconfig/aconfig_storage_read_api/include/aconfig_storage/aconfig_storage_read_api.hpp
+++ b/tools/aconfig/aconfig_storage_read_api/include/aconfig_storage/aconfig_storage_read_api.hpp
@@ -2,7 +2,7 @@
#include <stdint.h>
#include <string>
-#include <android-base/result.h>
+#include <cassert>
namespace aconfig_storage {
@@ -58,46 +58,86 @@
uint16_t flag_index;
};
+
+template <class T>
+class Result {
+ public:
+
+ Result()
+ : data()
+ , errmsg()
+ , has_data(false)
+ {}
+
+ Result(T const& value)
+ : data(value)
+ , errmsg()
+ , has_data(true)
+ {}
+
+ bool ok() {
+ return has_data;
+ }
+
+ T& operator*() {
+ assert(has_data);
+ return data;
+ }
+
+ T* operator->() {
+ assert(has_data);
+ return &data;
+ }
+
+ std::string const& error() {
+ assert(!has_data);
+ return errmsg;
+ }
+
+ T data;
+ std::string errmsg;
+ bool has_data;
+};
+
/// DO NOT USE APIS IN THE FOLLOWING NAMESPACE DIRECTLY
namespace private_internal_api {
-android::base::Result<MappedStorageFile*> get_mapped_file_impl(
+Result<MappedStorageFile*> get_mapped_file_impl(
std::string const& pb_file,
std::string const& container,
StorageFileType file_type);
-
} // namespace private_internal_api
/// Map a storage file
-android::base::Result<MappedStorageFile*> map_storage_file(
+Result<MappedStorageFile*> map_storage_file(
std::string const& file);
/// Map from StoredFlagType to FlagValueType
/// \input stored_type: stored flag type in the storage file
/// \returns the flag value type enum
-android::base::Result<FlagValueType> map_to_flag_value_type(
+Result<FlagValueType> map_to_flag_value_type(
StoredFlagType stored_type);
/// Get mapped storage file
/// \input container: stoarge container name
/// \input file_type: storage file type enum
/// \returns a MappedStorageFileQuery
-android::base::Result<MappedStorageFile*> get_mapped_file(
+Result<MappedStorageFile*> get_mapped_file(
std::string const& container,
StorageFileType file_type);
/// Get storage file version number
/// \input file_path: the path to the storage file
/// \returns the storage file version
-android::base::Result<uint32_t> get_storage_file_version(
+Result<uint32_t> get_storage_file_version(
std::string const& file_path);
/// Get package read context
/// \input file: mapped storage file
/// \input package: the flag package name
/// \returns a package read context
-android::base::Result<PackageReadContext> get_package_read_context(
+Result<PackageReadContext> get_package_read_context(
MappedStorageFile const& file,
std::string const& package);
@@ -106,7 +146,7 @@
/// \input package_id: the flag package id obtained from package offset query
/// \input flag_name: flag name
/// \returns the flag read context
-android::base::Result<FlagReadContext> get_flag_read_context(
+Result<FlagReadContext> get_flag_read_context(
MappedStorageFile const& file,
uint32_t package_id,
std::string const& flag_name);
@@ -115,7 +155,7 @@
/// \input file: mapped storage file
/// \input index: the boolean flag index in the file
/// \returns the boolean flag value
-android::base::Result<bool> get_boolean_flag_value(
+Result<bool> get_boolean_flag_value(
MappedStorageFile const& file,
uint32_t index);
@@ -124,7 +164,7 @@
/// \input value_type: flag value type
/// \input index: the boolean flag index in the file
/// \returns the boolean flag attribute
-android::base::Result<uint8_t> get_flag_attribute(
+Result<uint8_t> get_flag_attribute(
MappedStorageFile const& file,
FlagValueType value_type,
uint32_t index);
diff --git a/tools/aconfig/aconfig_storage_read_api/src/lib.rs b/tools/aconfig/aconfig_storage_read_api/src/lib.rs
index e419206..61f9e96 100644
--- a/tools/aconfig/aconfig_storage_read_api/src/lib.rs
+++ b/tools/aconfig/aconfig_storage_read_api/src/lib.rs
@@ -42,9 +42,6 @@
pub mod mapped_file;
pub mod package_table_query;
-#[cfg(test)]
-mod test_utils;
-
pub use aconfig_storage_file::{AconfigStorageError, FlagValueType, StorageFileType};
pub use flag_table_query::FlagReadContext;
pub use package_table_query::PackageReadContext;
@@ -60,8 +57,8 @@
use std::fs::File;
use std::io::Read;
-/// Storage file location pb file
-pub const STORAGE_LOCATION_FILE: &str = "/metadata/aconfig/boot/available_storage_file_records.pb";
+/// Storage file location
+pub const STORAGE_LOCATION: &str = "/metadata/aconfig";
/// Get read only mapped storage files.
///
@@ -78,7 +75,7 @@
container: &str,
file_type: StorageFileType,
) -> Result<Mmap, AconfigStorageError> {
- unsafe { crate::mapped_file::get_mapped_file(STORAGE_LOCATION_FILE, container, file_type) }
+ unsafe { crate::mapped_file::get_mapped_file(STORAGE_LOCATION, container, file_type) }
}
/// Get package read context for a specific package.
@@ -394,45 +391,41 @@
mod tests {
use super::*;
use crate::mapped_file::get_mapped_file;
- use crate::test_utils::copy_to_temp_file;
- use aconfig_storage_file::protos::storage_record_pb::write_proto_to_temp_file;
use aconfig_storage_file::{FlagInfoBit, StoredFlagType};
- use tempfile::NamedTempFile;
+ use rand::Rng;
+ use std::fs;
- fn create_test_storage_files() -> [NamedTempFile; 5] {
- let package_map = copy_to_temp_file("./tests/package.map").unwrap();
- let flag_map = copy_to_temp_file("./tests/flag.map").unwrap();
- let flag_val = copy_to_temp_file("./tests/flag.val").unwrap();
- let flag_info = copy_to_temp_file("./tests/flag.info").unwrap();
+ fn create_test_storage_files() -> String {
+ let mut rng = rand::thread_rng();
+ let number: u32 = rng.gen();
+ let storage_dir = String::from("/tmp/") + &number.to_string();
+ if std::fs::metadata(&storage_dir).is_ok() {
+ fs::remove_dir_all(&storage_dir).unwrap();
+ }
+ let maps_dir = storage_dir.clone() + "/maps";
+ let boot_dir = storage_dir.clone() + "/boot";
+ fs::create_dir(&storage_dir).unwrap();
+ fs::create_dir(&maps_dir).unwrap();
+ fs::create_dir(&boot_dir).unwrap();
- let text_proto = format!(
- r#"
-files {{
- version: 0
- container: "mockup"
- package_map: "{}"
- flag_map: "{}"
- flag_val: "{}"
- flag_info: "{}"
- timestamp: 12345
-}}
-"#,
- package_map.path().display(),
- flag_map.path().display(),
- flag_val.path().display(),
- flag_info.path().display()
- );
- let pb_file = write_proto_to_temp_file(&text_proto).unwrap();
- [package_map, flag_map, flag_val, flag_info, pb_file]
+ let package_map = storage_dir.clone() + "/maps/mockup.package.map";
+ let flag_map = storage_dir.clone() + "/maps/mockup.flag.map";
+ let flag_val = storage_dir.clone() + "/boot/mockup.val";
+ let flag_info = storage_dir.clone() + "/boot/mockup.info";
+ fs::copy("./tests/package.map", &package_map).unwrap();
+ fs::copy("./tests/flag.map", &flag_map).unwrap();
+ fs::copy("./tests/flag.val", &flag_val).unwrap();
+ fs::copy("./tests/flag.info", &flag_info).unwrap();
+
+ return storage_dir;
}
#[test]
// this test point locks down flag package read context query
fn test_package_context_query() {
- let [_package_map, _flag_map, _flag_val, _flag_info, pb_file] = create_test_storage_files();
- let pb_file_path = pb_file.path().display().to_string();
+ let storage_dir = create_test_storage_files();
let package_mapped_file = unsafe {
- get_mapped_file(&pb_file_path, "mockup", StorageFileType::PackageMap).unwrap()
+ get_mapped_file(&storage_dir, "mockup", StorageFileType::PackageMap).unwrap()
};
let package_context =
@@ -460,10 +453,9 @@
#[test]
// this test point locks down flag read context query
fn test_flag_context_query() {
- let [_package_map, _flag_map, _flag_val, _flag_info, pb_file] = create_test_storage_files();
- let pb_file_path = pb_file.path().display().to_string();
+ let storage_dir = create_test_storage_files();
let flag_mapped_file =
- unsafe { get_mapped_file(&pb_file_path, "mockup", StorageFileType::FlagMap).unwrap() };
+ unsafe { get_mapped_file(&storage_dir, "mockup", StorageFileType::FlagMap).unwrap() };
let baseline = vec![
(0, "enabled_ro", StoredFlagType::ReadOnlyBoolean, 1u16),
@@ -486,10 +478,9 @@
#[test]
// this test point locks down flag value query
fn test_flag_value_query() {
- let [_package_map, _flag_map, _flag_val, _flag_info, pb_file] = create_test_storage_files();
- let pb_file_path = pb_file.path().display().to_string();
+ let storage_dir = create_test_storage_files();
let flag_value_file =
- unsafe { get_mapped_file(&pb_file_path, "mockup", StorageFileType::FlagVal).unwrap() };
+ unsafe { get_mapped_file(&storage_dir, "mockup", StorageFileType::FlagVal).unwrap() };
let baseline: Vec<bool> = vec![false, true, true, false, true, true, true, true];
for (offset, expected_value) in baseline.into_iter().enumerate() {
let flag_value = get_boolean_flag_value(&flag_value_file, offset as u32).unwrap();
@@ -500,10 +491,9 @@
#[test]
// this test point locks donw flag info query
fn test_flag_info_query() {
- let [_package_map, _flag_map, _flag_val, _flag_info, pb_file] = create_test_storage_files();
- let pb_file_path = pb_file.path().display().to_string();
+ let storage_dir = create_test_storage_files();
let flag_info_file =
- unsafe { get_mapped_file(&pb_file_path, "mockup", StorageFileType::FlagInfo).unwrap() };
+ unsafe { get_mapped_file(&storage_dir, "mockup", StorageFileType::FlagInfo).unwrap() };
let is_rw: Vec<bool> = vec![true, false, true, true, false, false, false, true];
for (offset, expected_value) in is_rw.into_iter().enumerate() {
let attribute =
diff --git a/tools/aconfig/aconfig_storage_read_api/src/mapped_file.rs b/tools/aconfig/aconfig_storage_read_api/src/mapped_file.rs
index 3786443..5a16645 100644
--- a/tools/aconfig/aconfig_storage_read_api/src/mapped_file.rs
+++ b/tools/aconfig/aconfig_storage_read_api/src/mapped_file.rs
@@ -14,47 +14,12 @@
* limitations under the License.
*/
-use std::fs::File;
-use std::io::{BufReader, Read};
-
use anyhow::anyhow;
use memmap2::Mmap;
+use std::fs::File;
-use crate::AconfigStorageError::{
- self, FileReadFail, MapFileFail, ProtobufParseFail, StorageFileNotFound,
-};
+use crate::AconfigStorageError::{self, FileReadFail, MapFileFail, StorageFileNotFound};
use crate::StorageFileType;
-use aconfig_storage_file::protos::{
- storage_record_pb::try_from_binary_proto, ProtoStorageFileInfo, ProtoStorageFiles,
-};
-
-/// Find where storage files are stored for a particular container
-pub fn find_container_storage_location(
- location_pb_file: &str,
- container: &str,
-) -> Result<ProtoStorageFileInfo, AconfigStorageError> {
- let file = File::open(location_pb_file).map_err(|errmsg| {
- FileReadFail(anyhow!("Failed to open file {}: {}", location_pb_file, errmsg))
- })?;
- let mut reader = BufReader::new(file);
- let mut bytes = Vec::new();
- reader.read_to_end(&mut bytes).map_err(|errmsg| {
- FileReadFail(anyhow!("Failed to read file {}: {}", location_pb_file, errmsg))
- })?;
- let storage_locations: ProtoStorageFiles = try_from_binary_proto(&bytes).map_err(|errmsg| {
- ProtobufParseFail(anyhow!(
- "Failed to parse storage location pb file {}: {}",
- location_pb_file,
- errmsg
- ))
- })?;
- for location_info in storage_locations.files.iter() {
- if location_info.container() == container {
- return Ok(location_info.clone());
- }
- }
- Err(StorageFileNotFound(anyhow!("Storage file does not exist for {}", container)))
-}
/// Get the read only memory mapping of a storage file
///
@@ -82,123 +47,70 @@
/// file after being mapped. Ensure no writes can happen to this file while this
/// mapping stays alive.
pub unsafe fn get_mapped_file(
- location_pb_file: &str,
+ storage_dir: &str,
container: &str,
file_type: StorageFileType,
) -> Result<Mmap, AconfigStorageError> {
- let files_location = find_container_storage_location(location_pb_file, container)?;
- match file_type {
- StorageFileType::PackageMap => unsafe { map_file(files_location.package_map()) },
- StorageFileType::FlagMap => unsafe { map_file(files_location.flag_map()) },
- StorageFileType::FlagVal => unsafe { map_file(files_location.flag_val()) },
- StorageFileType::FlagInfo => unsafe { map_file(files_location.flag_info()) },
+ let storage_file = match file_type {
+ StorageFileType::PackageMap => {
+ String::from(storage_dir) + "/maps/" + container + ".package.map"
+ }
+ StorageFileType::FlagMap => String::from(storage_dir) + "/maps/" + container + ".flag.map",
+ StorageFileType::FlagVal => String::from(storage_dir) + "/boot/" + container + ".val",
+ StorageFileType::FlagInfo => String::from(storage_dir) + "/boot/" + container + ".info",
+ };
+ if std::fs::metadata(&storage_file).is_err() {
+ return Err(StorageFileNotFound(anyhow!("storage file {} does not exist", storage_file)));
}
+ unsafe { map_file(&storage_file) }
}
#[cfg(test)]
mod tests {
use super::*;
- use crate::test_utils::copy_to_temp_file;
- use aconfig_storage_file::protos::storage_record_pb::write_proto_to_temp_file;
- use tempfile::NamedTempFile;
+ use rand::Rng;
+ use std::fs;
+ use std::io::Read;
- #[test]
- fn test_find_storage_file_location() {
- let text_proto = r#"
-files {
- version: 0
- container: "system"
- package_map: "/system/etc/package.map"
- flag_map: "/system/etc/flag.map"
- flag_val: "/metadata/aconfig/system.val"
- timestamp: 12345
-}
-files {
- version: 1
- container: "product"
- package_map: "/product/etc/package.map"
- flag_map: "/product/etc/flag.map"
- flag_val: "/metadata/aconfig/product.val"
- timestamp: 54321
-}
-"#;
- let file = write_proto_to_temp_file(&text_proto).unwrap();
- let file_full_path = file.path().display().to_string();
- let file_info = find_container_storage_location(&file_full_path, "system").unwrap();
- assert_eq!(file_info.version(), 0);
- assert_eq!(file_info.container(), "system");
- assert_eq!(file_info.package_map(), "/system/etc/package.map");
- assert_eq!(file_info.flag_map(), "/system/etc/flag.map");
- assert_eq!(file_info.flag_val(), "/metadata/aconfig/system.val");
- assert_eq!(file_info.timestamp(), 12345);
-
- let file_info = find_container_storage_location(&file_full_path, "product").unwrap();
- assert_eq!(file_info.version(), 1);
- assert_eq!(file_info.container(), "product");
- assert_eq!(file_info.package_map(), "/product/etc/package.map");
- assert_eq!(file_info.flag_map(), "/product/etc/flag.map");
- assert_eq!(file_info.flag_val(), "/metadata/aconfig/product.val");
- assert_eq!(file_info.timestamp(), 54321);
-
- let err = find_container_storage_location(&file_full_path, "vendor").unwrap_err();
- assert_eq!(
- format!("{:?}", err),
- "StorageFileNotFound(Storage file does not exist for vendor)"
- );
- }
-
- fn map_and_verify(location_pb_file: &str, file_type: StorageFileType, actual_file: &str) {
+ fn map_and_verify(storage_dir: &str, file_type: StorageFileType, actual_file: &str) {
let mut opened_file = File::open(actual_file).unwrap();
let mut content = Vec::new();
opened_file.read_to_end(&mut content).unwrap();
-
- let mmaped_file =
- unsafe { get_mapped_file(location_pb_file, "system", file_type).unwrap() };
+ let mmaped_file = unsafe { get_mapped_file(storage_dir, "mockup", file_type).unwrap() };
assert_eq!(mmaped_file[..], content[..]);
}
- fn create_test_storage_files() -> [NamedTempFile; 4] {
- let package_map = copy_to_temp_file("./tests/package.map").unwrap();
- let flag_map = copy_to_temp_file("./tests/flag.map").unwrap();
- let flag_val = copy_to_temp_file("./tests/package.map").unwrap();
+ fn create_test_storage_files() -> String {
+ let mut rng = rand::thread_rng();
+ let number: u32 = rng.gen();
+ let storage_dir = String::from("/tmp/") + &number.to_string();
+ if std::fs::metadata(&storage_dir).is_ok() {
+ fs::remove_dir_all(&storage_dir).unwrap();
+ }
+ let maps_dir = storage_dir.clone() + "/maps";
+ let boot_dir = storage_dir.clone() + "/boot";
+ fs::create_dir(&storage_dir).unwrap();
+ fs::create_dir(&maps_dir).unwrap();
+ fs::create_dir(&boot_dir).unwrap();
- let text_proto = format!(
- r#"
-files {{
- version: 0
- container: "system"
- package_map: "{}"
- flag_map: "{}"
- flag_val: "{}"
- timestamp: 12345
-}}
-"#,
- package_map.path().display(),
- flag_map.path().display(),
- flag_val.path().display()
- );
- let pb_file = write_proto_to_temp_file(&text_proto).unwrap();
- [package_map, flag_map, flag_val, pb_file]
+ let package_map = storage_dir.clone() + "/maps/mockup.package.map";
+ let flag_map = storage_dir.clone() + "/maps/mockup.flag.map";
+ let flag_val = storage_dir.clone() + "/boot/mockup.val";
+ let flag_info = storage_dir.clone() + "/boot/mockup.info";
+ fs::copy("./tests/package.map", &package_map).unwrap();
+ fs::copy("./tests/flag.map", &flag_map).unwrap();
+ fs::copy("./tests/flag.val", &flag_val).unwrap();
+ fs::copy("./tests/flag.info", &flag_info).unwrap();
+
+ return storage_dir;
}
#[test]
fn test_mapped_file_contents() {
- let [package_map, flag_map, flag_val, pb_file] = create_test_storage_files();
- let pb_file_path = pb_file.path().display().to_string();
- map_and_verify(
- &pb_file_path,
- StorageFileType::PackageMap,
- &package_map.path().display().to_string(),
- );
- map_and_verify(
- &pb_file_path,
- StorageFileType::FlagMap,
- &flag_map.path().display().to_string(),
- );
- map_and_verify(
- &pb_file_path,
- StorageFileType::FlagVal,
- &flag_val.path().display().to_string(),
- );
+ let storage_dir = create_test_storage_files();
+ map_and_verify(&storage_dir, StorageFileType::PackageMap, "./tests/package.map");
+ map_and_verify(&storage_dir, StorageFileType::FlagMap, "./tests/flag.map");
+ map_and_verify(&storage_dir, StorageFileType::FlagVal, "./tests/flag.val");
+ map_and_verify(&storage_dir, StorageFileType::FlagInfo, "./tests/flag.info");
}
}
diff --git a/tools/aconfig/aconfig_storage_read_api/src/test_utils.rs b/tools/aconfig/aconfig_storage_read_api/src/test_utils.rs
deleted file mode 100644
index 84f31aa..0000000
--- a/tools/aconfig/aconfig_storage_read_api/src/test_utils.rs
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Copyright (C) 2023 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-use anyhow::Result;
-use std::fs;
-use tempfile::NamedTempFile;
-
-/// Create temp file copy
-pub(crate) fn copy_to_temp_file(source_file: &str) -> Result<NamedTempFile> {
- let file = NamedTempFile::new()?;
- fs::copy(source_file, file.path())?;
- Ok(file)
-}
diff --git a/tools/aconfig/aconfig_storage_read_api/tests/Android.bp b/tools/aconfig/aconfig_storage_read_api/tests/Android.bp
index 6b05ca6..98944d6 100644
--- a/tools/aconfig/aconfig_storage_read_api/tests/Android.bp
+++ b/tools/aconfig/aconfig_storage_read_api/tests/Android.bp
@@ -7,8 +7,7 @@
"libanyhow",
"libaconfig_storage_file",
"libaconfig_storage_read_api",
- "libprotobuf",
- "libtempfile",
+ "librand",
],
data: [
"package.map",
@@ -26,8 +25,6 @@
],
static_libs: [
"libgmock",
- "libaconfig_storage_protos_cc",
- "libprotobuf-cpp-lite",
"libaconfig_storage_read_api_cc",
"libbase",
"liblog",
diff --git a/tools/aconfig/aconfig_storage_read_api/tests/storage_read_api_test.cpp b/tools/aconfig/aconfig_storage_read_api/tests/storage_read_api_test.cpp
index 5393c49..6d29045 100644
--- a/tools/aconfig/aconfig_storage_read_api/tests/storage_read_api_test.cpp
+++ b/tools/aconfig/aconfig_storage_read_api/tests/storage_read_api_test.cpp
@@ -22,11 +22,9 @@
#include <sys/stat.h>
#include "aconfig_storage/aconfig_storage_read_api.hpp"
#include <gtest/gtest.h>
-#include <protos/aconfig_storage_metadata.pb.h>
#include <android-base/file.h>
#include <android-base/result.h>
-using android::aconfig_storage_metadata::storage_files;
using namespace android::base;
namespace api = aconfig_storage;
@@ -34,49 +32,33 @@
class AconfigStorageTest : public ::testing::Test {
protected:
- Result<std::string> copy_to_temp_file(std::string const& source_file) {
- auto temp_file = std::string(std::tmpnam(nullptr));
+ Result<void> copy_file(std::string const& src_file,
+ std::string const& dst_file) {
auto content = std::string();
- if (!ReadFileToString(source_file, &content)) {
- return Error() << "failed to read file: " << source_file;
+ if (!ReadFileToString(src_file, &content)) {
+ return Error() << "failed to read file: " << src_file;
}
- if (!WriteStringToFile(content, temp_file)) {
- return Error() << "failed to copy file: " << source_file;
+ if (!WriteStringToFile(content, dst_file)) {
+ return Error() << "failed to copy file: " << dst_file;
}
- return temp_file;
- }
-
- Result<std::string> write_storage_location_pb_file(std::string const& package_map,
- std::string const& flag_map,
- std::string const& flag_val,
- std::string const& flag_info) {
- auto temp_file = std::tmpnam(nullptr);
- auto proto = storage_files();
- auto* info = proto.add_files();
- info->set_version(0);
- info->set_container("mockup");
- info->set_package_map(package_map);
- info->set_flag_map(flag_map);
- info->set_flag_val(flag_val);
- info->set_flag_info(flag_info);
- info->set_timestamp(12345);
-
- auto content = std::string();
- proto.SerializeToString(&content);
- if (!WriteStringToFile(content, temp_file)) {
- return Error() << "failed to write storage records pb file";
- }
- return temp_file;
+ return {};
}
void SetUp() override {
auto const test_dir = android::base::GetExecutableDirectory();
- package_map = *copy_to_temp_file(test_dir + "/package.map");
- flag_map = *copy_to_temp_file(test_dir + "/flag.map");
- flag_val = *copy_to_temp_file(test_dir + "/flag.val");
- flag_info = *copy_to_temp_file(test_dir + "/flag.info");
- storage_record_pb = *write_storage_location_pb_file(
- package_map, flag_map, flag_val, flag_info);
+ storage_dir = std::string(root_dir.path);
+ auto maps_dir = storage_dir + "/maps";
+ auto boot_dir = storage_dir + "/boot";
+ mkdir(maps_dir.c_str(), 0775);
+ mkdir(boot_dir.c_str(), 0775);
+ package_map = std::string(maps_dir) + "/mockup.package.map";
+ flag_map = std::string(maps_dir) + "/mockup.flag.map";
+ flag_val = std::string(boot_dir) + "/mockup.val";
+ flag_info = std::string(boot_dir) + "/mockup.info";
+ copy_file(test_dir + "/package.map", package_map);
+ copy_file(test_dir + "/flag.map", flag_map);
+ copy_file(test_dir + "/flag.val", flag_val);
+ copy_file(test_dir + "/flag.info", flag_info);
}
void TearDown() override {
@@ -84,14 +66,14 @@
std::remove(flag_map.c_str());
std::remove(flag_val.c_str());
std::remove(flag_info.c_str());
- std::remove(storage_record_pb.c_str());
}
+ TemporaryDir root_dir;
+ std::string storage_dir;
std::string package_map;
std::string flag_map;
std::string flag_val;
std::string flag_info;
- std::string storage_record_pb;
};
/// Test to lock down storage file version query api
@@ -113,16 +95,17 @@
/// Negative test to lock down the error when mapping none exist storage files
TEST_F(AconfigStorageTest, test_none_exist_storage_file_mapping) {
auto mapped_file_result = private_api::get_mapped_file_impl(
- storage_record_pb, "vendor", api::StorageFileType::package_map);
+ storage_dir, "vendor", api::StorageFileType::package_map);
ASSERT_FALSE(mapped_file_result.ok());
- ASSERT_EQ(mapped_file_result.error().message(),
- "Unable to find storage files for container vendor");
+ ASSERT_EQ(mapped_file_result.error(),
+ std::string("failed to open ") + storage_dir
+ + "/maps/vendor.package.map: No such file or directory");
}
/// Test to lock down storage package context query api
TEST_F(AconfigStorageTest, test_package_context_query) {
auto mapped_file_result = private_api::get_mapped_file_impl(
- storage_record_pb, "mockup", api::StorageFileType::package_map);
+ storage_dir, "mockup", api::StorageFileType::package_map);
ASSERT_TRUE(mapped_file_result.ok());
auto mapped_file = std::unique_ptr<api::MappedStorageFile>(*mapped_file_result);
@@ -151,7 +134,7 @@
/// Test to lock down when querying none exist package
TEST_F(AconfigStorageTest, test_none_existent_package_context_query) {
auto mapped_file_result = private_api::get_mapped_file_impl(
- storage_record_pb, "mockup", api::StorageFileType::package_map);
+ storage_dir, "mockup", api::StorageFileType::package_map);
ASSERT_TRUE(mapped_file_result.ok());
auto mapped_file = std::unique_ptr<api::MappedStorageFile>(*mapped_file_result);
@@ -164,7 +147,7 @@
/// Test to lock down storage flag context query api
TEST_F(AconfigStorageTest, test_flag_context_query) {
auto mapped_file_result = private_api::get_mapped_file_impl(
- storage_record_pb, "mockup", api::StorageFileType::flag_map);
+ storage_dir, "mockup", api::StorageFileType::flag_map);
ASSERT_TRUE(mapped_file_result.ok());
auto mapped_file = std::unique_ptr<api::MappedStorageFile>(*mapped_file_result);
@@ -190,7 +173,7 @@
/// Test to lock down when querying none exist flag
TEST_F(AconfigStorageTest, test_none_existent_flag_context_query) {
auto mapped_file_result = private_api::get_mapped_file_impl(
- storage_record_pb, "mockup", api::StorageFileType::flag_map);
+ storage_dir, "mockup", api::StorageFileType::flag_map);
ASSERT_TRUE(mapped_file_result.ok());
auto mapped_file = std::unique_ptr<api::MappedStorageFile>(*mapped_file_result);
@@ -206,7 +189,7 @@
/// Test to lock down storage flag value query api
TEST_F(AconfigStorageTest, test_boolean_flag_value_query) {
auto mapped_file_result = private_api::get_mapped_file_impl(
- storage_record_pb, "mockup", api::StorageFileType::flag_val);
+ storage_dir, "mockup", api::StorageFileType::flag_val);
ASSERT_TRUE(mapped_file_result.ok());
auto mapped_file = std::unique_ptr<api::MappedStorageFile>(*mapped_file_result);
@@ -222,20 +205,20 @@
/// Negative test to lock down the error when querying flag value out of range
TEST_F(AconfigStorageTest, test_invalid_boolean_flag_value_query) {
auto mapped_file_result = private_api::get_mapped_file_impl(
- storage_record_pb, "mockup", api::StorageFileType::flag_val);
+ storage_dir, "mockup", api::StorageFileType::flag_val);
ASSERT_TRUE(mapped_file_result.ok());
auto mapped_file = std::unique_ptr<api::MappedStorageFile>(*mapped_file_result);
auto value = api::get_boolean_flag_value(*mapped_file, 8);
ASSERT_FALSE(value.ok());
- ASSERT_EQ(value.error().message(),
+ ASSERT_EQ(value.error(),
std::string("InvalidStorageFileOffset(Flag value offset goes beyond the end of the file.)"));
}
/// Test to lock down storage flag info query api
TEST_F(AconfigStorageTest, test_boolean_flag_info_query) {
auto mapped_file_result = private_api::get_mapped_file_impl(
- storage_record_pb, "mockup", api::StorageFileType::flag_info);
+ storage_dir, "mockup", api::StorageFileType::flag_info);
ASSERT_TRUE(mapped_file_result.ok());
auto mapped_file = std::unique_ptr<api::MappedStorageFile>(*mapped_file_result);
@@ -254,12 +237,12 @@
/// Negative test to lock down the error when querying flag info out of range
TEST_F(AconfigStorageTest, test_invalid_boolean_flag_info_query) {
auto mapped_file_result = private_api::get_mapped_file_impl(
- storage_record_pb, "mockup", api::StorageFileType::flag_info);
+ storage_dir, "mockup", api::StorageFileType::flag_info);
ASSERT_TRUE(mapped_file_result.ok());
auto mapped_file = std::unique_ptr<api::MappedStorageFile>(*mapped_file_result);
auto attribute = api::get_flag_attribute(*mapped_file, api::FlagValueType::Boolean, 8);
ASSERT_FALSE(attribute.ok());
- ASSERT_EQ(attribute.error().message(),
+ ASSERT_EQ(attribute.error(),
std::string("InvalidStorageFileOffset(Flag info offset goes beyond the end of the file.)"));
}
diff --git a/tools/aconfig/aconfig_storage_read_api/tests/storage_read_api_test.rs b/tools/aconfig/aconfig_storage_read_api/tests/storage_read_api_test.rs
index ecba573..afc44d4 100644
--- a/tools/aconfig/aconfig_storage_read_api/tests/storage_read_api_test.rs
+++ b/tools/aconfig/aconfig_storage_read_api/tests/storage_read_api_test.rs
@@ -1,71 +1,63 @@
#[cfg(not(feature = "cargo"))]
mod aconfig_storage_rust_test {
- use aconfig_storage_file::protos::storage_record_pb::write_proto_to_temp_file;
use aconfig_storage_file::{FlagInfoBit, FlagValueType, StorageFileType, StoredFlagType};
use aconfig_storage_read_api::{
get_boolean_flag_value, get_flag_attribute, get_flag_read_context,
get_package_read_context, get_storage_file_version, mapped_file::get_mapped_file,
PackageReadContext,
};
+ use rand::Rng;
use std::fs;
- use tempfile::NamedTempFile;
- pub fn copy_to_temp_file(source_file: &str) -> NamedTempFile {
- let file = NamedTempFile::new().unwrap();
- fs::copy(source_file, file.path()).unwrap();
- file
- }
+ fn create_test_storage_files() -> String {
+ let mut rng = rand::thread_rng();
+ let number: u32 = rng.gen();
+ let storage_dir = String::from("/tmp/") + &number.to_string();
+ if std::fs::metadata(&storage_dir).is_ok() {
+ fs::remove_dir_all(&storage_dir).unwrap();
+ }
+ let maps_dir = storage_dir.clone() + "/maps";
+ let boot_dir = storage_dir.clone() + "/boot";
+ fs::create_dir(&storage_dir).unwrap();
+ fs::create_dir(maps_dir).unwrap();
+ fs::create_dir(boot_dir).unwrap();
- fn create_test_storage_files() -> [NamedTempFile; 5] {
- let package_map = copy_to_temp_file("./package.map");
- let flag_map = copy_to_temp_file("./flag.map");
- let flag_val = copy_to_temp_file("./flag.val");
- let flag_info = copy_to_temp_file("./flag.info");
+ let package_map = storage_dir.clone() + "/maps/mockup.package.map";
+ let flag_map = storage_dir.clone() + "/maps/mockup.flag.map";
+ let flag_val = storage_dir.clone() + "/boot/mockup.val";
+ let flag_info = storage_dir.clone() + "/boot/mockup.info";
+ fs::copy("./package.map", package_map).unwrap();
+ fs::copy("./flag.map", flag_map).unwrap();
+ fs::copy("./flag.val", flag_val).unwrap();
+ fs::copy("./flag.info", flag_info).unwrap();
- let text_proto = format!(
- r#"
-files {{
- version: 0
- container: "mockup"
- package_map: "{}"
- flag_map: "{}"
- flag_val: "{}"
- flag_info: "{}"
- timestamp: 12345
-}}
-"#,
- package_map.path().display(),
- flag_map.path().display(),
- flag_val.path().display(),
- flag_info.path().display()
- );
- let pb_file = write_proto_to_temp_file(&text_proto).unwrap();
- [package_map, flag_map, flag_val, flag_info, pb_file]
+ storage_dir
}
#[test]
fn test_unavailable_stoarge() {
- let [_package_map, _flag_map, _flag_val, _flag_info, pb_file] = create_test_storage_files();
- let pb_file_path = pb_file.path().display().to_string();
+ let storage_dir = create_test_storage_files();
// SAFETY:
// The safety here is ensured as the test process will not write to temp storage file
let err = unsafe {
- get_mapped_file(&pb_file_path, "vendor", StorageFileType::PackageMap).unwrap_err()
+ get_mapped_file(&storage_dir, "vendor", StorageFileType::PackageMap).unwrap_err()
};
assert_eq!(
format!("{:?}", err),
- "StorageFileNotFound(Storage file does not exist for vendor)"
+ format!(
+ "StorageFileNotFound(storage file {}/maps/vendor.package.map does not exist)",
+ storage_dir
+ )
);
}
#[test]
fn test_package_context_query() {
- let [_package_map, _flag_map, _flag_val, _flag_info, pb_file] = create_test_storage_files();
- let pb_file_path = pb_file.path().display().to_string();
+ let storage_dir = create_test_storage_files();
// SAFETY:
// The safety here is ensured as the test process will not write to temp storage file
let package_mapped_file = unsafe {
- get_mapped_file(&pb_file_path, "mockup", StorageFileType::PackageMap).unwrap()
+ get_mapped_file(&storage_dir, "mockup", StorageFileType::PackageMap).unwrap()
};
let package_context =
@@ -92,12 +84,11 @@
#[test]
fn test_none_exist_package_context_query() {
- let [_package_map, _flag_map, _flag_val, _flag_info, pb_file] = create_test_storage_files();
- let pb_file_path = pb_file.path().display().to_string();
+ let storage_dir = create_test_storage_files();
// SAFETY:
// The safety here is ensured as the test process will not write to temp storage file
let package_mapped_file = unsafe {
- get_mapped_file(&pb_file_path, "mockup", StorageFileType::PackageMap).unwrap()
+ get_mapped_file(&storage_dir, "mockup", StorageFileType::PackageMap).unwrap()
};
let package_context_option =
@@ -108,12 +99,11 @@
#[test]
fn test_flag_context_query() {
- let [_package_map, _flag_map, _flag_val, _flag_info, pb_file] = create_test_storage_files();
- let pb_file_path = pb_file.path().display().to_string();
+ let storage_dir = create_test_storage_files();
// SAFETY:
// The safety here is ensured as the test process will not write to temp storage file
let flag_mapped_file =
- unsafe { get_mapped_file(&pb_file_path, "mockup", StorageFileType::FlagMap).unwrap() };
+ unsafe { get_mapped_file(&storage_dir, "mockup", StorageFileType::FlagMap).unwrap() };
let baseline = vec![
(0, "enabled_ro", StoredFlagType::ReadOnlyBoolean, 1u16),
@@ -135,12 +125,11 @@
#[test]
fn test_none_exist_flag_context_query() {
- let [_package_map, _flag_map, _flag_val, _flag_info, pb_file] = create_test_storage_files();
- let pb_file_path = pb_file.path().display().to_string();
+ let storage_dir = create_test_storage_files();
// SAFETY:
// The safety here is ensured as the test process will not write to temp storage file
let flag_mapped_file =
- unsafe { get_mapped_file(&pb_file_path, "mockup", StorageFileType::FlagMap).unwrap() };
+ unsafe { get_mapped_file(&storage_dir, "mockup", StorageFileType::FlagMap).unwrap() };
let flag_context_option =
get_flag_read_context(&flag_mapped_file, 0, "none_exist").unwrap();
assert_eq!(flag_context_option, None);
@@ -152,12 +141,11 @@
#[test]
fn test_boolean_flag_value_query() {
- let [_package_map, _flag_map, _flag_val, _flag_info, pb_file] = create_test_storage_files();
- let pb_file_path = pb_file.path().display().to_string();
+ let storage_dir = create_test_storage_files();
// SAFETY:
// The safety here is ensured as the test process will not write to temp storage file
let flag_value_file =
- unsafe { get_mapped_file(&pb_file_path, "mockup", StorageFileType::FlagVal).unwrap() };
+ unsafe { get_mapped_file(&storage_dir, "mockup", StorageFileType::FlagVal).unwrap() };
let baseline: Vec<bool> = vec![false, true, true, false, true, true, true, true];
for (offset, expected_value) in baseline.into_iter().enumerate() {
let flag_value = get_boolean_flag_value(&flag_value_file, offset as u32).unwrap();
@@ -167,12 +155,11 @@
#[test]
fn test_invalid_boolean_flag_value_query() {
- let [_package_map, _flag_map, _flag_val, _flag_info, pb_file] = create_test_storage_files();
- let pb_file_path = pb_file.path().display().to_string();
+ let storage_dir = create_test_storage_files();
// SAFETY:
// The safety here is ensured as the test process will not write to temp storage file
let flag_value_file =
- unsafe { get_mapped_file(&pb_file_path, "mockup", StorageFileType::FlagVal).unwrap() };
+ unsafe { get_mapped_file(&storage_dir, "mockup", StorageFileType::FlagVal).unwrap() };
let err = get_boolean_flag_value(&flag_value_file, 8u32).unwrap_err();
assert_eq!(
format!("{:?}", err),
@@ -182,12 +169,11 @@
#[test]
fn test_flag_info_query() {
- let [_package_map, _flag_map, _flag_val, _flag_info, pb_file] = create_test_storage_files();
- let pb_file_path = pb_file.path().display().to_string();
+ let storage_dir = create_test_storage_files();
// SAFETY:
// The safety here is ensured as the test process will not write to temp storage file
let flag_info_file =
- unsafe { get_mapped_file(&pb_file_path, "mockup", StorageFileType::FlagInfo).unwrap() };
+ unsafe { get_mapped_file(&storage_dir, "mockup", StorageFileType::FlagInfo).unwrap() };
let is_rw: Vec<bool> = vec![true, false, true, true, false, false, false, true];
for (offset, expected_value) in is_rw.into_iter().enumerate() {
let attribute =
@@ -200,12 +186,11 @@
#[test]
fn test_invalid_boolean_flag_info_query() {
- let [_package_map, _flag_map, _flag_val, _flag_info, pb_file] = create_test_storage_files();
- let pb_file_path = pb_file.path().display().to_string();
+ let storage_dir = create_test_storage_files();
// SAFETY:
// The safety here is ensured as the test process will not write to temp storage file
let flag_info_file =
- unsafe { get_mapped_file(&pb_file_path, "mockup", StorageFileType::FlagInfo).unwrap() };
+ unsafe { get_mapped_file(&storage_dir, "mockup", StorageFileType::FlagInfo).unwrap() };
let err = get_flag_attribute(&flag_info_file, FlagValueType::Boolean, 8u32).unwrap_err();
assert_eq!(
format!("{:?}", err),
diff --git a/tools/aconfig/aconfig_storage_write_api/Android.bp b/tools/aconfig/aconfig_storage_write_api/Android.bp
index 4dbdbbf..0f1962c 100644
--- a/tools/aconfig/aconfig_storage_write_api/Android.bp
+++ b/tools/aconfig/aconfig_storage_write_api/Android.bp
@@ -77,7 +77,6 @@
export_include_dirs: ["include"],
static_libs: [
"libaconfig_storage_read_api_cc",
- "libaconfig_storage_protos_cc",
"libprotobuf-cpp-lite",
"libbase",
],
diff --git a/tools/aconfig/aconfig_storage_write_api/Cargo.toml b/tools/aconfig/aconfig_storage_write_api/Cargo.toml
index eaa55f2..2ce6edf 100644
--- a/tools/aconfig/aconfig_storage_write_api/Cargo.toml
+++ b/tools/aconfig/aconfig_storage_write_api/Cargo.toml
@@ -13,7 +13,6 @@
memmap2 = "0.8.0"
tempfile = "3.9.0"
thiserror = "1.0.56"
-protobuf = "3.2.0"
aconfig_storage_file = { path = "../aconfig_storage_file" }
aconfig_storage_read_api = { path = "../aconfig_storage_read_api" }
diff --git a/tools/aconfig/aconfig_storage_write_api/aconfig_storage_write_api.cpp b/tools/aconfig/aconfig_storage_write_api/aconfig_storage_write_api.cpp
index f529f79..cabc65e 100644
--- a/tools/aconfig/aconfig_storage_write_api/aconfig_storage_write_api.cpp
+++ b/tools/aconfig/aconfig_storage_write_api/aconfig_storage_write_api.cpp
@@ -1,7 +1,6 @@
#include <android-base/file.h>
#include <android-base/logging.h>
-#include <protos/aconfig_storage_metadata.pb.h>
#include <sys/mman.h>
#include <sys/stat.h>
@@ -11,34 +10,31 @@
#include "aconfig_storage/lib.rs.h"
#include "aconfig_storage/aconfig_storage_write_api.hpp"
-using storage_records_pb = android::aconfig_storage_metadata::storage_files;
-using storage_record_pb = android::aconfig_storage_metadata::storage_file_info;
-using namespace android::base;
-
namespace aconfig_storage {
/// Map a storage file
-Result<MutableMappedStorageFile*> map_mutable_storage_file(std::string const& file) {
+android::base::Result<MutableMappedStorageFile*> map_mutable_storage_file(
+ std::string const& file) {
struct stat file_stat;
if (stat(file.c_str(), &file_stat) < 0) {
- return ErrnoError() << "stat failed";
+ return android::base::ErrnoError() << "stat failed";
}
if ((file_stat.st_mode & (S_IWUSR | S_IWGRP | S_IWOTH)) == 0) {
- return Error() << "cannot map nonwriteable file";
+ return android::base::Error() << "cannot map nonwriteable file";
}
size_t file_size = file_stat.st_size;
const int fd = open(file.c_str(), O_RDWR | O_NOFOLLOW | O_CLOEXEC);
if (fd == -1) {
- return ErrnoError() << "failed to open " << file;
+ return android::base::ErrnoError() << "failed to open " << file;
};
void* const map_result =
mmap(nullptr, file_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
if (map_result == MAP_FAILED) {
- return ErrnoError() << "mmap failed";
+ return android::base::ErrnoError() << "mmap failed";
}
auto mapped_file = new MutableMappedStorageFile();
@@ -49,7 +45,7 @@
}
/// Set boolean flag value
-Result<void> set_boolean_flag_value(
+android::base::Result<void> set_boolean_flag_value(
const MutableMappedStorageFile& file,
uint32_t offset,
bool value) {
@@ -57,13 +53,13 @@
static_cast<uint8_t*>(file.file_ptr), file.file_size);
auto update_cxx = update_boolean_flag_value_cxx(content, offset, value);
if (!update_cxx.update_success) {
- return Error() << std::string(update_cxx.error_message.c_str());
+ return android::base::Error() << update_cxx.error_message.c_str();
}
return {};
}
/// Set if flag has server override
-Result<void> set_flag_has_server_override(
+android::base::Result<void> set_flag_has_server_override(
const MutableMappedStorageFile& file,
FlagValueType value_type,
uint32_t offset,
@@ -73,13 +69,13 @@
auto update_cxx = update_flag_has_server_override_cxx(
content, static_cast<uint16_t>(value_type), offset, value);
if (!update_cxx.update_success) {
- return Error() << std::string(update_cxx.error_message.c_str());
+ return android::base::Error() << update_cxx.error_message.c_str();
}
return {};
}
/// Set if flag has local override
-Result<void> set_flag_has_local_override(
+android::base::Result<void> set_flag_has_local_override(
const MutableMappedStorageFile& file,
FlagValueType value_type,
uint32_t offset,
@@ -89,12 +85,12 @@
auto update_cxx = update_flag_has_local_override_cxx(
content, static_cast<uint16_t>(value_type), offset, value);
if (!update_cxx.update_success) {
- return Error() << std::string(update_cxx.error_message.c_str());
+ return android::base::Error() << update_cxx.error_message.c_str();
}
return {};
}
-Result<void> create_flag_info(
+android::base::Result<void> create_flag_info(
std::string const& package_map,
std::string const& flag_map,
std::string const& flag_info_out) {
diff --git a/tools/aconfig/aconfig_storage_write_api/include/aconfig_storage/aconfig_storage_write_api.hpp b/tools/aconfig/aconfig_storage_write_api/include/aconfig_storage/aconfig_storage_write_api.hpp
index ff06cbc..0bba7ff 100644
--- a/tools/aconfig/aconfig_storage_write_api/include/aconfig_storage/aconfig_storage_write_api.hpp
+++ b/tools/aconfig/aconfig_storage_write_api/include/aconfig_storage/aconfig_storage_write_api.hpp
@@ -6,7 +6,6 @@
#include <android-base/result.h>
#include <aconfig_storage/aconfig_storage_read_api.hpp>
-using namespace android::base;
namespace aconfig_storage {
@@ -14,24 +13,24 @@
struct MutableMappedStorageFile : MappedStorageFile {};
/// Map a storage file
-Result<MutableMappedStorageFile*> map_mutable_storage_file(
+android::base::Result<MutableMappedStorageFile*> map_mutable_storage_file(
std::string const& file);
/// Set boolean flag value
-Result<void> set_boolean_flag_value(
+android::base::Result<void> set_boolean_flag_value(
const MutableMappedStorageFile& file,
uint32_t offset,
bool value);
/// Set if flag has server override
-Result<void> set_flag_has_server_override(
+android::base::Result<void> set_flag_has_server_override(
const MutableMappedStorageFile& file,
FlagValueType value_type,
uint32_t offset,
bool value);
/// Set if flag has local override
-Result<void> set_flag_has_local_override(
+android::base::Result<void> set_flag_has_local_override(
const MutableMappedStorageFile& file,
FlagValueType value_type,
uint32_t offset,
@@ -41,7 +40,7 @@
/// \input package_map: package map file
/// \input flag_map: flag map file
/// \input flag_info_out: flag info file to be created
-Result<void> create_flag_info(
+android::base::Result<void> create_flag_info(
std::string const& package_map,
std::string const& flag_map,
std::string const& flag_info_out);
diff --git a/tools/aconfig/aconfig_storage_write_api/tests/Android.bp b/tools/aconfig/aconfig_storage_write_api/tests/Android.bp
index 85568e0..f6409b7 100644
--- a/tools/aconfig/aconfig_storage_write_api/tests/Android.bp
+++ b/tools/aconfig/aconfig_storage_write_api/tests/Android.bp
@@ -25,8 +25,6 @@
],
static_libs: [
"libgmock",
- "libaconfig_storage_protos_cc",
- "libprotobuf-cpp-lite",
"libaconfig_storage_read_api_cc",
"libaconfig_storage_write_api_cc",
"libbase",
diff --git a/tools/aconfig/aconfig_storage_write_api/tests/storage_write_api_test.cpp b/tools/aconfig/aconfig_storage_write_api/tests/storage_write_api_test.cpp
index 5437379..31183fa 100644
--- a/tools/aconfig/aconfig_storage_write_api/tests/storage_write_api_test.cpp
+++ b/tools/aconfig/aconfig_storage_write_api/tests/storage_write_api_test.cpp
@@ -22,11 +22,9 @@
#include "aconfig_storage/aconfig_storage_read_api.hpp"
#include "aconfig_storage/aconfig_storage_write_api.hpp"
#include <gtest/gtest.h>
-#include <protos/aconfig_storage_metadata.pb.h>
#include <android-base/file.h>
#include <android-base/result.h>
-using android::aconfig_storage_metadata::storage_files;
using namespace android::base;
namespace api = aconfig_storage;
diff --git a/tools/check-flagged-apis/src/com/android/checkflaggedapis/CheckFlaggedApisTest.kt b/tools/check-flagged-apis/src/com/android/checkflaggedapis/CheckFlaggedApisTest.kt
index 111ea91..8e285f6 100644
--- a/tools/check-flagged-apis/src/com/android/checkflaggedapis/CheckFlaggedApisTest.kt
+++ b/tools/check-flagged-apis/src/com/android/checkflaggedapis/CheckFlaggedApisTest.kt
@@ -121,6 +121,26 @@
}
@Test
+ fun testParseApiSignatureInterfacesInheritFromJavaLangObject() {
+ val apiSignature =
+ """
+ // Signature format: 2.0
+ package android {
+ @FlaggedApi("android.flag.foo") public interface Interface {
+ }
+ }
+ """
+ .trim()
+ val expected =
+ setOf(
+ Pair(
+ Symbol.createClass("android/Interface", "java/lang/Object", setOf()),
+ Flag("android.flag.foo")))
+ val actual = parseApiSignature("in-memory", apiSignature.byteInputStream())
+ assertEquals(expected, actual)
+ }
+
+ @Test
fun testParseFlagValues() {
val expected: Map<Flag, Boolean> =
mapOf(Flag("android.flag.foo") to true, Flag("android.flag.bar") to true)
diff --git a/tools/check-flagged-apis/src/com/android/checkflaggedapis/Main.kt b/tools/check-flagged-apis/src/com/android/checkflaggedapis/Main.kt
index a277ce8..1d2440d 100644
--- a/tools/check-flagged-apis/src/com/android/checkflaggedapis/Main.kt
+++ b/tools/check-flagged-apis/src/com/android/checkflaggedapis/Main.kt
@@ -205,7 +205,11 @@
val symbol =
Symbol.createClass(
cls.baselineElementId(),
- cls.superClass()?.baselineElementId(),
+ if (cls.isInterface()) {
+ "java/lang/Object"
+ } else {
+ cls.superClass()?.baselineElementId()
+ },
cls.allInterfaces()
.map { it.baselineElementId() }
.filter { it != cls.baselineElementId() }
diff --git a/tools/compliance/go.mod b/tools/compliance/go.mod
index bd04077..532efd4 100644
--- a/tools/compliance/go.mod
+++ b/tools/compliance/go.mod
@@ -1,29 +1,11 @@
+go 1.22
+
module android/soong/tools/compliance
-require google.golang.org/protobuf v0.0.0
-
-replace google.golang.org/protobuf v0.0.0 => ../../../../external/golang-protobuf
-
require (
- android/soong v0.0.0
github.com/google/blueprint v0.0.0
+ android/soong v0.0.0
+ google.golang.org/protobuf v0.0.0
github.com/spdx/tools-golang v0.0.0
+ github.com/google/go-cmp v0.0.0
)
-
-replace github.com/spdx/tools-golang v0.0.0 => ../../../../external/spdx-tools
-
-require golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f // indirect
-
-replace android/soong v0.0.0 => ../../../soong
-
-replace github.com/google/blueprint => ../../../blueprint
-
-// Indirect deps from golang-protobuf
-exclude github.com/golang/protobuf v1.5.0
-
-replace github.com/google/go-cmp v0.5.5 => ../../../../external/go-cmp
-
-// Indirect dep from go-cmp
-exclude golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543
-
-go 1.21
diff --git a/tools/compliance/go.sum b/tools/compliance/go.sum
deleted file mode 100644
index cbe76d9..0000000
--- a/tools/compliance/go.sum
+++ /dev/null
@@ -1,2 +0,0 @@
-golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f h1:uF6paiQQebLeSXkrTqHqz0MXhXXS1KgF41eUdBNvxK0=
-golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8=
diff --git a/tools/compliance/go.work b/tools/compliance/go.work
new file mode 100644
index 0000000..a24d2ea
--- /dev/null
+++ b/tools/compliance/go.work
@@ -0,0 +1,18 @@
+go 1.22
+
+use (
+ .
+ ../../../../build/blueprint
+ ../../../../build/soong
+ ../../../../external/go-cmp
+ ../../../../external/golang-protobuf
+ ../../../../external/spdx-tools
+)
+
+replace (
+ github.com/google/blueprint v0.0.0 => ../../../../build/blueprint
+ android/soong v0.0.0 => ../../../../build/soong
+ github.com/google/go-cmp v0.0.0 => ../../../../external/go-cmp
+ google.golang.org/protobuf v0.0.0 => ../../../../external/golang-protobuf
+ github.com/spdx/tools-golang v0.0.0 => ../../../../external/spdx-tools
+)
diff --git a/tools/perf/format_benchmarks b/tools/perf/format_benchmarks
index 26493b2..807e546 100755
--- a/tools/perf/format_benchmarks
+++ b/tools/perf/format_benchmarks
@@ -25,6 +25,7 @@
import pathlib
import statistics
import zoneinfo
+import csv
import pretty
import utils
@@ -103,7 +104,7 @@
def SetFixedCol(self, row_key, columns):
self._fixed_cols[row_key] = columns
- def Write(self, out):
+ def Write(self, out, fmt):
table = []
# Expand the column items
for row in zip(*self._cols):
@@ -114,26 +115,33 @@
# Update the last row of the header with title and add separator
for i in range(len(self._titles)):
table[len(table)-1][i] = self._titles[i]
- table.append(pretty.SEPARATOR)
+ if fmt == "table":
+ table.append(pretty.SEPARATOR)
# Populate the data
for row in self._rows:
table.append([str(row)]
+ self._fixed_cols[row]
+ [str(self._data.get((col, row), "")) for col in self._cols])
- out.write(pretty.FormatTable(table, alignments="LL"))
+ if fmt == "csv":
+ csv.writer(sys.stdout, quoting=csv.QUOTE_MINIMAL).writerows(table)
+ else:
+ out.write(pretty.FormatTable(table, alignments="LL"))
-def format_duration_sec(ns):
+def format_duration_sec(ns, fmt_sec):
"Format a duration in ns to second precision"
sec = round(ns / 1000000000)
- h, sec = divmod(sec, 60*60)
- m, sec = divmod(sec, 60)
- result = ""
- if h > 0:
- result += f"{h:2d}h "
- if h > 0 or m > 0:
- result += f"{m:2d}m "
- return result + f"{sec:2d}s"
+ if fmt_sec:
+ return f"{sec}"
+ else:
+ h, sec = divmod(sec, 60*60)
+ m, sec = divmod(sec, 60)
+ result = ""
+ if h > 0:
+ result += f"{h:2d}h "
+ if h > 0 or m > 0:
+ result += f"{m:2d}m "
+ return result + f"{sec:2d}s"
def main(argv):
@@ -142,6 +150,12 @@
allow_abbrev=False, # Don't let people write unsupportable scripts.
description="Print analysis tables for benchmarks")
+ parser.add_argument("--csv", action="store_true",
+ help="Print in CSV instead of table.")
+
+ parser.add_argument("--sec", action="store_true",
+ help="Print in seconds instead of minutes and seconds")
+
parser.add_argument("--tags", nargs="*",
help="The tags to print, in order.")
@@ -196,9 +210,9 @@
summary["branch"],
summary["tag"]]
+ list(key)),
- cell[0]["title"], format_duration_sec(duration_ns))
+ cell[0]["title"], format_duration_sec(duration_ns, args.sec))
- table.Write(sys.stdout)
+ table.Write(sys.stdout, "csv" if args.csv else "table")
if __name__ == "__main__":
main(sys.argv)
diff --git a/tools/releasetools/common.py b/tools/releasetools/common.py
index 2367691..d91a713 100644
--- a/tools/releasetools/common.py
+++ b/tools/releasetools/common.py
@@ -1971,7 +1971,7 @@
return None
-def _BuildVendorBootImage(sourcedir, partition_name, info_dict=None):
+def _BuildVendorBootImage(sourcedir, fs_config_file, partition_name, info_dict=None):
"""Build a vendor boot image from the specified sourcedir.
Take a ramdisk, dtb, and vendor_cmdline from the input (in 'sourcedir'), and
@@ -1987,7 +1987,7 @@
img = tempfile.NamedTemporaryFile()
ramdisk_format = GetRamdiskFormat(info_dict)
- ramdisk_img = _MakeRamdisk(sourcedir, ramdisk_format=ramdisk_format)
+ ramdisk_img = _MakeRamdisk(sourcedir, fs_config_file=fs_config_file, ramdisk_format=ramdisk_format)
# use MKBOOTIMG from environ, or "mkbootimg" if empty or not set
mkbootimg = os.getenv('MKBOOTIMG') or "mkbootimg"
@@ -2101,8 +2101,9 @@
if info_dict is None:
info_dict = OPTIONS.info_dict
+ fs_config = "META/" + tree_subdir.lower() + "_filesystem_config.txt"
data = _BuildVendorBootImage(
- os.path.join(unpack_dir, tree_subdir), "vendor_boot", info_dict)
+ os.path.join(unpack_dir, tree_subdir), os.path.join(unpack_dir, fs_config), "vendor_boot", info_dict)
if data:
return File(name, data)
return None
@@ -2126,7 +2127,7 @@
info_dict = OPTIONS.info_dict
data = _BuildVendorBootImage(
- os.path.join(unpack_dir, tree_subdir), "vendor_kernel_boot", info_dict)
+ os.path.join(unpack_dir, tree_subdir), None, "vendor_kernel_boot", info_dict)
if data:
return File(name, data)
return None
diff --git a/tools/releasetools/ota_from_target_files.py b/tools/releasetools/ota_from_target_files.py
index 5a024ce..985cd56 100755
--- a/tools/releasetools/ota_from_target_files.py
+++ b/tools/releasetools/ota_from_target_files.py
@@ -329,7 +329,7 @@
OPTIONS.enable_vabc_xor = True
OPTIONS.force_minor_version = None
OPTIONS.compressor_types = None
-OPTIONS.enable_zucchini = True
+OPTIONS.enable_zucchini = False
OPTIONS.enable_puffdiff = None
OPTIONS.enable_lz4diff = False
OPTIONS.vabc_compression_param = None