Merge "Remove unused PRODUCT_AVF_KERNEL_MODULES_ENABLED" into main
diff --git a/core/Makefile b/core/Makefile
index 94fc88e..d4e241e 100644
--- a/core/Makefile
+++ b/core/Makefile
@@ -5109,8 +5109,10 @@
 $(error EMPTY_VENDOR_SKU_PLACEHOLDER is an internal variable and cannot be used for DEIVCE_MANIFEST_SKUS)
 endif
 
-# -- Check system manifest / matrix including fragments (excluding other framework manifests / matrices, e.g. product);
-check_vintf_system_deps := $(filter $(TARGET_OUT)/etc/vintf/%, $(check_vintf_common_srcs))
+# -- Check system and system_ext manifests / matrices including fragments (excluding other framework manifests / matrices, e.g. product);
+check_vintf_system_deps := $(filter $(TARGET_OUT)/etc/vintf/% \
+                                    $(TARGET_OUT_SYSTEM_EXT)/etc/vintf/%, \
+                                    $(check_vintf_common_srcs))
 ifneq ($(check_vintf_system_deps),)
 check_vintf_has_system := true
 
@@ -5138,8 +5140,9 @@
 check_vintf_system_deps :=
 
 # -- Check vendor manifest / matrix including fragments (excluding other device manifests / matrices)
-check_vintf_vendor_deps := $(filter $(TARGET_OUT_VENDOR)/etc/vintf/%, $(check_vintf_common_srcs))
-check_vintf_vendor_deps += $(filter $(TARGET_OUT_VENDOR)/apex/%, $(check_vintf_common_srcs))
+check_vintf_vendor_deps := $(filter $(TARGET_OUT_VENDOR)/etc/vintf/% \
+                                    $(TARGET_OUT_VENDOR)/apex/%, \
+                                    $(check_vintf_common_srcs))
 ifneq ($(strip $(check_vintf_vendor_deps)),)
 check_vintf_has_vendor := true
 check_vintf_vendor_log := $(intermediates)/check_vintf_vendor.log
diff --git a/core/main.mk b/core/main.mk
index 9b98efe..a05f757 100644
--- a/core/main.mk
+++ b/core/main.mk
@@ -434,6 +434,8 @@
   # To speedup startup of non-preopted builds, don't verify or compile the boot image.
   ADDITIONAL_SYSTEM_PROPERTIES += dalvik.vm.image-dex2oat-filter=extract
 endif
+# b/323566535
+ADDITIONAL_SYSTEM_PROPERTIES += init.svc_debug.no_fatal.zygote=true
 endif
 
 ## asan ##
diff --git a/target/product/fullmte.mk b/target/product/fullmte.mk
index 5e2a694..b622496 100644
--- a/target/product/fullmte.mk
+++ b/target/product/fullmte.mk
@@ -20,8 +20,7 @@
 # For more details, see:
 # https://source.android.com/docs/security/test/memory-safety/arm-mte
 ifeq ($(filter memtag_heap,$(SANITIZE_TARGET)),)
-  # TODO(b/292478827): Re-enable memtag_stack when new toolchain rolls.
-  SANITIZE_TARGET := $(strip $(SANITIZE_TARGET) memtag_heap)
+  SANITIZE_TARGET := $(strip $(SANITIZE_TARGET) memtag_heap memtag_stack)
   SANITIZE_TARGET_DIAG := $(strip $(SANITIZE_TARGET_DIAG) memtag_heap)
 endif
 PRODUCT_PRODUCT_PROPERTIES += persist.arm64.memtag.default=sync
diff --git a/target/product/go_defaults_common.mk b/target/product/go_defaults_common.mk
index ba0912c..5218f29 100644
--- a/target/product/go_defaults_common.mk
+++ b/target/product/go_defaults_common.mk
@@ -49,6 +49,3 @@
 # use the go specific handheld_core_hardware.xml from frameworks
 PRODUCT_COPY_FILES += \
     frameworks/native/data/etc/go_handheld_core_hardware.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/handheld_core_hardware.xml
-
-# Dedupe VNDK libraries with identical core variants.
-TARGET_VNDK_USE_CORE_VARIANT := true
diff --git a/teams/Android.bp b/teams/Android.bp
index 89c719f..bae8e80 100644
--- a/teams/Android.bp
+++ b/teams/Android.bp
@@ -4335,3 +4335,32 @@
     // go/trendy/manage/engineers/5093014696525824
     trendy_team_id: "5093014696525824",
 }
+
+team {
+  name: "trendy_team_media_framework_drm",
+
+  // go/trendy/manage/engineers/5311752690335744
+  trendy_team_id: "5311752690335744",
+}
+
+team {
+  name: "trendy_team_media_framework_audio",
+
+  // go/trendy/manage/engineers/5823575353065472
+  trendy_team_id: "5823575353065472",
+}
+
+team {
+  name: "trendy_team_ar_sensors_context_hub",
+
+  // go/trendy/manage/engineers/4776371090259968
+  trendy_team_id: "4776371090259968",
+}
+
+
+team {
+  name: "trendy_team_media_codec_framework",
+
+  // go/trendy/manage/engineers/4943966050844672
+  trendy_team_id: "4943966050844672",
+}
diff --git a/tools/aconfig/aconfig/src/test.rs b/tools/aconfig/aconfig/src/test.rs
index 7b5318d..7409cda 100644
--- a/tools/aconfig/aconfig/src/test.rs
+++ b/tools/aconfig/aconfig/src/test.rs
@@ -15,6 +15,9 @@
  */
 
 #[cfg(test)]
+pub use test_utils::*;
+
+#[cfg(test)]
 pub mod test_utils {
     use crate::commands::Input;
     use aconfig_protos::ProtoParsedFlags;
@@ -340,6 +343,3 @@
         );
     }
 }
-
-#[cfg(test)]
-pub use test_utils::*;
diff --git a/tools/aconfig/aconfig_storage_file/Android.bp b/tools/aconfig/aconfig_storage_file/Android.bp
index 03402b5..8922ba4 100644
--- a/tools/aconfig/aconfig_storage_file/Android.bp
+++ b/tools/aconfig/aconfig_storage_file/Android.bp
@@ -14,6 +14,7 @@
         "libprotobuf",
         "libtempfile",
         "libmemmap2",
+        "libcxx",
         "libthiserror",
     ],
 }
@@ -78,3 +79,38 @@
     ],
     host_supported: true,
 }
+
+genrule {
+    name: "libcxx_aconfig_storage_bridge_code",
+    tools: ["cxxbridge"],
+    cmd: "$(location cxxbridge) $(in) > $(out)",
+    srcs: ["src/lib.rs"],
+    out: ["aconfig_storage/lib.rs.cc"],
+}
+
+genrule {
+    name: "libcxx_aconfig_storage_bridge_header",
+    tools: ["cxxbridge"],
+    cmd: "$(location cxxbridge) $(in) --header > $(out)",
+    srcs: ["src/lib.rs"],
+    out: ["aconfig_storage/lib.rs.h"],
+}
+
+rust_ffi_static {
+    name: "libaconfig_storage_cxx_bridge",
+    crate_name: "aconfig_storage_cxx_bridge",
+    host_supported: true,
+    defaults: ["aconfig_storage_file.defaults"],
+}
+
+cc_library_static {
+    name: "libaconfig_storage_cc",
+    srcs: ["aconfig_storage.cpp"],
+    generated_headers: [
+        "cxx-bridge-header",
+        "libcxx_aconfig_storage_bridge_header"
+    ],
+    generated_sources: ["libcxx_aconfig_storage_bridge_code"],
+    whole_static_libs: ["libaconfig_storage_cxx_bridge"],
+    export_include_dirs: ["include"],
+}
diff --git a/tools/aconfig/aconfig_storage_file/src/lib.rs b/tools/aconfig/aconfig_storage_file/src/lib.rs
index 130a0e0..84e0e90 100644
--- a/tools/aconfig/aconfig_storage_file/src/lib.rs
+++ b/tools/aconfig/aconfig_storage_file/src/lib.rs
@@ -256,8 +256,6 @@
     get_boolean_flag_value_impl(STORAGE_LOCATION_FILE, container, offset)
 }
 
-
-#[cfg(feature = "cargo")]
 #[cxx::bridge]
 mod ffi {
     // Package table query return for cc interlop
@@ -319,7 +317,6 @@
 }
 
 /// Get package start offset impl cc interlop
-#[cfg(feature = "cargo")]
 pub fn get_package_offset_cxx_impl(
     pb_file: &str,
     container: &str,
@@ -329,7 +326,6 @@
 }
 
 /// Get flag start offset impl cc interlop
-#[cfg(feature = "cargo")]
 pub fn get_flag_offset_cxx_impl(
     pb_file: &str,
     container: &str,
@@ -340,7 +336,6 @@
 }
 
 /// Get boolean flag value impl cc interlop
-#[cfg(feature = "cargo")]
 pub fn get_boolean_flag_value_cxx_impl(
     pb_file: &str,
     container: &str,
@@ -350,13 +345,11 @@
 }
 
 /// Get package start offset cc interlop
-#[cfg(feature = "cargo")]
 pub fn get_package_offset_cxx(container: &str, package: &str) -> ffi::PackageOffsetQueryCXX {
     ffi::PackageOffsetQueryCXX::new(get_package_offset(container, package))
 }
 
 /// Get flag start offset cc interlop
-#[cfg(feature = "cargo")]
 pub fn get_flag_offset_cxx(
     container: &str,
     package_id: u32,
@@ -366,12 +359,10 @@
 }
 
 /// Get boolean flag value cc interlop
-#[cfg(feature = "cargo")]
 pub fn get_boolean_flag_value_cxx(container: &str, offset: u32) -> ffi::BooleanFlagValueQueryCXX {
     ffi::BooleanFlagValueQueryCXX::new(get_boolean_flag_value(container, offset))
 }
 
-#[cfg(feature = "cargo")]
 impl ffi::PackageOffsetQueryCXX {
     pub(crate) fn new(offset_result: Result<Option<PackageOffset>, AconfigStorageError>) -> Self {
         match offset_result {
@@ -402,7 +393,6 @@
     }
 }
 
-#[cfg(feature = "cargo")]
 impl ffi::FlagOffsetQueryCXX {
     pub(crate) fn new(offset_result: Result<Option<FlagOffset>, AconfigStorageError>) -> Self {
         match offset_result {
@@ -430,7 +420,6 @@
     }
 }
 
-#[cfg(feature = "cargo")]
 impl ffi::BooleanFlagValueQueryCXX {
     pub(crate) fn new(value_result: Result<bool, AconfigStorageError>) -> Self {
         match value_result {
diff --git a/tools/aconfig/aconfig_storage_file/tests/Android.bp b/tools/aconfig/aconfig_storage_file/tests/Android.bp
index 8cee611..b951273 100644
--- a/tools/aconfig/aconfig_storage_file/tests/Android.bp
+++ b/tools/aconfig/aconfig_storage_file/tests/Android.bp
@@ -16,3 +16,27 @@
     ],
     test_suites: ["general-tests"],
 }
+
+cc_test {
+    name: "aconfig_storage.test.cpp",
+    srcs: [
+        "storage_lib_cc_test.cpp",
+    ],
+    static_libs: [
+        "libgmock",
+        "libaconfig_storage_protos_cc",
+        "libprotobuf-cpp-lite",
+        "libaconfig_storage_cc",
+        "libbase",
+        "liblog",
+    ],
+    data: [
+        ":ro.package.map",
+        ":ro.flag.map",
+        ":ro.flag.val",
+    ],
+    test_suites: [
+        "device-tests",
+        "general-tests",
+    ],
+}
diff --git a/tools/aconfig/aconfig_storage_file/tests/storage_lib_cc_test.cpp b/tools/aconfig/aconfig_storage_file/tests/storage_lib_cc_test.cpp
new file mode 100644
index 0000000..7d5ba0a
--- /dev/null
+++ b/tools/aconfig/aconfig_storage_file/tests/storage_lib_cc_test.cpp
@@ -0,0 +1,161 @@
+/*
+ * Copyright (C) 2024 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.
+ */
+
+#include <string>
+#include <vector>
+
+#include "aconfig_storage/aconfig_storage.hpp"
+#include <gtest/gtest.h>
+#include <protos/aconfig_storage_metadata.pb.h>
+#include <android-base/file.h>
+
+using android::aconfig_storage_metadata::storage_files;
+using ::android::base::WriteStringToFile;
+using ::aconfig_storage::test_only_api::get_package_offset_impl;
+using ::aconfig_storage::test_only_api::get_flag_offset_impl;
+using ::aconfig_storage::test_only_api::get_boolean_flag_value_impl;
+
+void write_storage_location_pb_to_file(std::string const& file_path) {
+  auto const test_dir = android::base::GetExecutableDirectory();
+  auto proto = storage_files();
+  auto* info = proto.add_files();
+  info->set_version(0);
+  info->set_container("system");
+  info->set_package_map(test_dir + "/tests/tmp.ro.package.map");
+  info->set_flag_map(test_dir + "/tests/tmp.ro.flag.map");
+  info->set_flag_val(test_dir + "/tests/tmp.ro.flag.val");
+  info->set_timestamp(12345);
+
+  auto content = std::string();
+  proto.SerializeToString(&content);
+  ASSERT_TRUE(WriteStringToFile(content, file_path))
+      << "Failed to write a file: " << file_path;
+}
+
+TEST(AconfigStorageTest, test_package_offset_query) {
+  auto pb_file = std::string("/tmp/test_package_offset_query.pb");
+  write_storage_location_pb_to_file(pb_file);
+
+  auto query = get_package_offset_impl(
+      pb_file, "system", "com.android.aconfig.storage.test_1");
+  ASSERT_EQ(query.error_message, std::string());
+  ASSERT_TRUE(query.query_success);
+  ASSERT_TRUE(query.package_exists);
+  ASSERT_EQ(query.package_id, 0);
+  ASSERT_EQ(query.boolean_offset, 0);
+
+  query = get_package_offset_impl(
+      pb_file, "system", "com.android.aconfig.storage.test_2");
+  ASSERT_EQ(query.error_message, std::string());
+  ASSERT_TRUE(query.query_success);
+  ASSERT_TRUE(query.package_exists);
+  ASSERT_EQ(query.package_id, 1);
+  ASSERT_EQ(query.boolean_offset, 3);
+
+  query = get_package_offset_impl(
+      pb_file, "system", "com.android.aconfig.storage.test_4");
+  ASSERT_EQ(query.error_message, std::string());
+  ASSERT_TRUE(query.query_success);
+  ASSERT_TRUE(query.package_exists);
+  ASSERT_EQ(query.package_id, 2);
+  ASSERT_EQ(query.boolean_offset, 6);
+}
+
+TEST(AconfigStorageTest, test_invalid_package_offset_query) {
+  auto pb_file = std::string("/tmp/test_package_offset_query.pb");
+  write_storage_location_pb_to_file(pb_file);
+
+  auto query = get_package_offset_impl(
+      pb_file, "system", "com.android.aconfig.storage.test_3");
+  ASSERT_EQ(query.error_message, std::string());
+  ASSERT_TRUE(query.query_success);
+  ASSERT_FALSE(query.package_exists);
+
+  query = get_package_offset_impl(
+      pb_file, "vendor", "com.android.aconfig.storage.test_1");
+  ASSERT_EQ(query.error_message,
+            std::string("StorageFileNotFound(Storage file does not exist for vendor)"));
+  ASSERT_FALSE(query.query_success);
+}
+
+TEST(AconfigStorageTest, test_flag_offset_query) {
+  auto pb_file = std::string("/tmp/test_package_offset_query.pb");
+  write_storage_location_pb_to_file(pb_file);
+
+  auto baseline = std::vector<std::tuple<int, std::string, int>>{
+    {0, "enabled_ro", 1},
+    {0, "enabled_rw", 2},
+    {1, "disabled_ro", 0},
+    {2, "enabled_ro", 1},
+    {1, "enabled_fixed_ro", 1},
+    {1, "enabled_ro", 2},
+    {2, "enabled_fixed_ro", 0},
+    {0, "disabled_rw", 0},
+  };
+  for (auto const&[package_id, flag_name, expected_offset] : baseline) {
+    auto query = get_flag_offset_impl(pb_file, "system", package_id, flag_name);
+    ASSERT_EQ(query.error_message, std::string());
+    ASSERT_TRUE(query.query_success);
+    ASSERT_TRUE(query.flag_exists);
+    ASSERT_EQ(query.flag_offset, expected_offset);
+  }
+}
+
+TEST(AconfigStorageTest, test_invalid_flag_offset_query) {
+  auto pb_file = std::string("/tmp/test_invalid_package_offset_query.pb");
+  write_storage_location_pb_to_file(pb_file);
+
+  auto query = get_flag_offset_impl(pb_file, "system", 0, "none_exist");
+  ASSERT_EQ(query.error_message, std::string());
+  ASSERT_TRUE(query.query_success);
+  ASSERT_FALSE(query.flag_exists);
+
+  query = get_flag_offset_impl(pb_file, "system", 3, "enabled_ro");
+  ASSERT_EQ(query.error_message, std::string());
+  ASSERT_TRUE(query.query_success);
+  ASSERT_FALSE(query.flag_exists);
+
+  query = get_flag_offset_impl(pb_file, "vendor", 0, "enabled_ro");
+  ASSERT_EQ(query.error_message,
+            std::string("StorageFileNotFound(Storage file does not exist for vendor)"));
+  ASSERT_FALSE(query.query_success);
+}
+
+TEST(AconfigStorageTest, test_boolean_flag_value_query) {
+  auto pb_file = std::string("/tmp/test_boolean_flag_value_query.pb");
+  write_storage_location_pb_to_file(pb_file);
+  for (int offset = 0; offset < 8; ++offset) {
+    auto query = get_boolean_flag_value_impl(pb_file, "system", offset);
+    ASSERT_EQ(query.error_message, std::string());
+    ASSERT_TRUE(query.query_success);
+    ASSERT_FALSE(query.flag_value);
+  }
+}
+
+TEST(AconfigStorageTest, test_invalid_boolean_flag_value_query) {
+  auto pb_file = std::string("/tmp/test_invalid_boolean_flag_value_query.pb");
+  write_storage_location_pb_to_file(pb_file);
+
+  auto query = get_boolean_flag_value_impl(pb_file, "vendor", 0);
+  ASSERT_EQ(query.error_message,
+            std::string("StorageFileNotFound(Storage file does not exist for vendor)"));
+  ASSERT_FALSE(query.query_success);
+
+  query = get_boolean_flag_value_impl(pb_file, "system", 8);
+  ASSERT_EQ(query.error_message,
+            std::string("InvalidStorageFileOffset(Flag value offset goes beyond the end of the file.)"));
+  ASSERT_FALSE(query.query_success);
+}
diff --git a/tools/aconfig/fake_device_config/Android.bp b/tools/aconfig/fake_device_config/Android.bp
index 7420aa8..4566bf9 100644
--- a/tools/aconfig/fake_device_config/Android.bp
+++ b/tools/aconfig/fake_device_config/Android.bp
@@ -15,7 +15,8 @@
 java_library {
 	name: "fake_device_config",
 	srcs: ["src/**/*.java"],
-	sdk_version: "core_current",
+	sdk_version: "none",
+	system_modules: "core-all-system-modules",
 	host_supported: true,
 }
 
diff --git a/tools/characteristics_rro_generator.py b/tools/characteristics_rro_generator.py
index 6489673..cf873ee 100644
--- a/tools/characteristics_rro_generator.py
+++ b/tools/characteristics_rro_generator.py
@@ -1,22 +1,14 @@
 #!/usr/bin/env python3
 import sys
-from xml.dom.minidom import parseString
-
-def parse_package(manifest):
-    with open(manifest, 'r') as f:
-        data = f.read()
-    dom = parseString(data)
-    return dom.documentElement.getAttribute('package')
 
 if __name__ == '__main__':
     if len(sys.argv) != 3:
-        sys.exit(f"usage: {sys_argv[0]} target_package_manifest output\n")
-    package_name = parse_package(sys.argv[1])
+        sys.exit(f"usage: {sys_argv[0]} target_package_name output\n")
     with open(sys.argv[2], "w") as f:
         f.write(f'''<?xml version="1.0" encoding="utf-8"?>
-<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="{package_name}.auto_generated_characteristics_rro">
+                <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="{sys.argv[1]}.auto_generated_characteristics_rro">
     <application android:hasCode="false" />
-    <overlay android:targetPackage="{package_name}"
+    <overlay android:targetPackage="{sys.argv[1]}"
              android:isStatic="true"
              android:priority="0" />
 </manifest>
diff --git a/tools/perf/benchmarks b/tools/perf/benchmarks
index ad34586..6998ecd 100755
--- a/tools/perf/benchmarks
+++ b/tools/perf/benchmarks
@@ -249,6 +249,21 @@
             undo=lambda: orig.write()
         )
 
+def ChangePublicApi():
+    change = AddJavaField("frameworks/base/core/java/android/provider/Settings.java",
+                 "@android.annotation.SuppressLint(\"UnflaggedApi\") public")
+    orig_current_text = Snapshot("frameworks/base/core/api/current.txt")
+
+    def undo():
+        change.undo()
+        orig_current_text.write()
+
+    return Change(
+        label=change.label,
+        change=change.change,
+        undo=lambda: undo()
+    )
+
 def AddJavaField(filename, prefix):
     return Modify(filename,
                   lambda: f"{prefix} static final int BENCHMARK = {random.randint(0, 1000000)};\n",
@@ -740,9 +755,8 @@
                       ),
             Benchmark(id="framework_api",
                       title="Add API to Settings.java",
-                      change=AddJavaField("frameworks/base/core/java/android/provider/Settings.java",
-                                          "@android.annotation.SuppressLint(\"UnflaggedApi\") public"),
-                      modules=["framework-minus-apex"],
+                      change=ChangePublicApi(),
+                      modules=["api-stubs-docs-non-updatable-update-current-api", "framework-minus-apex"],
                       preroll=1,
                       postroll=2,
                       ),