Merge "Add debugging trails on Zygote package mapping" into main am: 3c1291ecab

Original change: https://android-review.googlesource.com/c/platform/packages/modules/ConfigInfrastructure/+/3527314

Change-Id: Ibff8bdd39faaeafd94af0cae8f55f15a6e752806
Signed-off-by: Automerger Merge Worker <[email protected]>
diff --git a/apex/Android.bp b/apex/Android.bp
index 88971f3..5f886ca 100644
--- a/apex/Android.bp
+++ b/apex/Android.bp
@@ -40,12 +40,15 @@
         // classes into an API surface, e.g. public, system, etc.. Doing so will
         // result in a build failure due to inconsistent flags.
         package_prefixes: [
+            "android.internal.configinfra",
+            "android.provider.configinfra.internal.protobuf",
             "android.provider.aidl",
             "android.provider.flags",
             "android.provider.internal.aconfig.storage",
             "android.provider.internal.modules.utils.build",
 
             "android.os.flagging",
+            "android.provider.x.android.provider.flags",
         ],
     },
     // The bootclasspath_fragments that provide APIs on which this depends.
diff --git a/framework/Android.bp b/framework/Android.bp
index a4c9eef..05f0f8f 100644
--- a/framework/Android.bp
+++ b/framework/Android.bp
@@ -24,10 +24,11 @@
     ],
     defaults: ["framework-module-defaults"],
     permitted_packages: [
+        "android.internal.configinfra",
         "android.provider",
         "android.provider.flags",
+        "android.provider.x",
         "android.provider.aidl",
-
         "android.os.flagging",
     ],
     apex_available: [
@@ -44,6 +45,7 @@
         "aconfig_storage_stub",
     ],
     static_libs: [
+        "aconfigd_java_proto_lite_lib",
         "configinfra_framework_flags_java_lib",
         "modules-utils-build",
         "aconfig_storage_file_java",
diff --git a/framework/api/module-lib-current.txt b/framework/api/module-lib-current.txt
index ad11041..f62dcc7 100644
--- a/framework/api/module-lib-current.txt
+++ b/framework/api/module-lib-current.txt
@@ -1,4 +1,12 @@
 // Signature format: 2.0
+package android.os.flagging {
+
+  @FlaggedApi("android.provider.flags.stage_flags_for_build") public final class ConfigInfrastructureFrameworkInitializer {
+    method @FlaggedApi("android.provider.flags.stage_flags_for_build") public static void registerServiceWrappers();
+  }
+
+}
+
 package android.provider {
 
   public final class DeviceConfig {
diff --git a/framework/api/system-current.txt b/framework/api/system-current.txt
index 5b330af..9a25ad4 100644
--- a/framework/api/system-current.txt
+++ b/framework/api/system-current.txt
@@ -1,4 +1,22 @@
 // Signature format: 2.0
+package android.os.flagging {
+
+  @FlaggedApi("android.provider.flags.stage_flags_for_build") public class AconfigWriteException extends android.util.AndroidRuntimeException {
+    ctor @FlaggedApi("android.provider.flags.stage_flags_for_build") public AconfigWriteException(@NonNull String);
+    ctor @FlaggedApi("android.provider.flags.stage_flags_for_build") public AconfigWriteException(@NonNull String, @NonNull Throwable);
+  }
+
+  @FlaggedApi("android.provider.flags.stage_flags_for_build") public final class FlagManager {
+    method @FlaggedApi("android.provider.flags.stage_flags_for_build") public void clearBooleanLocalOverridesImmediately(@Nullable java.util.Set<java.lang.String>);
+    method @FlaggedApi("android.provider.flags.stage_flags_for_build") public void clearBooleanLocalOverridesOnReboot(@Nullable java.util.Set<java.lang.String>);
+    method @FlaggedApi("android.provider.flags.stage_flags_for_build") public void setBooleanLocalOverridesImmediately(@NonNull java.util.Map<java.lang.String,java.lang.Boolean>);
+    method @FlaggedApi("android.provider.flags.stage_flags_for_build") public void setBooleanLocalOverridesOnReboot(@NonNull java.util.Map<java.lang.String,java.lang.Boolean>);
+    method @FlaggedApi("android.provider.flags.stage_flags_for_build") public void setBooleanOverridesOnReboot(@NonNull java.util.Map<java.lang.String,java.lang.Boolean>);
+    method @FlaggedApi("android.provider.flags.stage_flags_for_build") public void setBooleanOverridesOnSystemBuildFingerprint(@NonNull String, @NonNull java.util.Map<java.lang.String,java.lang.Boolean>);
+  }
+
+}
+
 package android.provider {
 
   public final class DeviceConfig {
@@ -7,8 +25,9 @@
     method @RequiresPermission(android.Manifest.permission.WRITE_DEVICE_CONFIG) public static void clearLocalOverride(@NonNull String, @NonNull String);
     method @RequiresPermission(android.Manifest.permission.MONITOR_DEVICE_CONFIG_ACCESS) public static void clearMonitorCallback(@NonNull android.content.ContentResolver);
     method @RequiresPermission(anyOf={android.Manifest.permission.WRITE_DEVICE_CONFIG, android.Manifest.permission.WRITE_ALLOWLISTED_DEVICE_CONFIG}) public static boolean deleteProperty(@NonNull String, @NonNull String);
-    method @FlaggedApi("android.provider.flags.dump_improvements") @RequiresPermission(android.Manifest.permission.DUMP) public static void dump(@NonNull android.os.ParcelFileDescriptor, @NonNull java.io.PrintWriter, @NonNull String, @Nullable String[]);
+    method @FlaggedApi("android.provider.flags.dump_improvements") public static void dump(@NonNull java.io.PrintWriter, @NonNull String, @Nullable String[]);
     method @NonNull public static java.util.Set<java.lang.String> getAdbWritableFlags();
+    method @FlaggedApi("android.provider.flags.device_config_writable_namespaces_api") @NonNull public static java.util.Set<java.lang.String> getAdbWritableNamespaces();
     method @NonNull public static java.util.Set<android.provider.DeviceConfig.Properties> getAllProperties();
     method public static boolean getBoolean(@NonNull String, @NonNull String, boolean);
     method @RequiresPermission(android.Manifest.permission.READ_DEVICE_CONFIG) public static float getFloat(@NonNull String, @NonNull String, float);
@@ -27,6 +46,7 @@
     method @RequiresPermission(anyOf={android.Manifest.permission.WRITE_DEVICE_CONFIG, android.Manifest.permission.WRITE_ALLOWLISTED_DEVICE_CONFIG}) public static boolean setProperties(@NonNull android.provider.DeviceConfig.Properties) throws android.provider.DeviceConfig.BadConfigException;
     method @RequiresPermission(anyOf={android.Manifest.permission.WRITE_DEVICE_CONFIG, android.Manifest.permission.WRITE_ALLOWLISTED_DEVICE_CONFIG}) public static boolean setProperty(@NonNull String, @NonNull String, @Nullable String, boolean);
     method @RequiresPermission(anyOf={android.Manifest.permission.WRITE_DEVICE_CONFIG, android.Manifest.permission.READ_WRITE_SYNC_DISABLED_MODE_CONFIG}) public static void setSyncDisabledMode(int);
+    field @FlaggedApi("android.provider.flags.dump_improvements") public static final String DUMP_ARG_NAMESPACE = "--namespace";
     field public static final String NAMESPACE_ACCESSIBILITY = "accessibility";
     field public static final String NAMESPACE_ACTIVITY_MANAGER = "activity_manager";
     field public static final String NAMESPACE_ACTIVITY_MANAGER_NATIVE_BOOT = "activity_manager_native_boot";
@@ -145,7 +165,9 @@
   }
 
   @FlaggedApi("android.provider.flags.stage_flags_for_build") public final class StageOtaFlags {
-    method @FlaggedApi("android.provider.flags.stage_flags_for_build") public static void stageBooleanAconfigFlagsForBuild(@NonNull java.util.Map<java.lang.String,java.lang.Boolean>, @NonNull String);
+    method @FlaggedApi("android.provider.flags.stage_flags_for_build") public static int stageBooleanAconfigFlagsForBuild(@NonNull java.util.Map<java.lang.String,java.lang.Boolean>, @NonNull String);
+    field public static final int STATUS_STAGE_SUCCESS = 0; // 0x0
+    field public static final int STATUS_STORAGE_NOT_ENABLED = -1; // 0xffffffff
   }
 
   public final class UpdatableDeviceConfigServiceReadiness {
diff --git a/framework/flags.aconfig b/framework/flags.aconfig
index e2b4c58..665a2ac 100644
--- a/framework/flags.aconfig
+++ b/framework/flags.aconfig
@@ -45,11 +45,10 @@
 }
 
 flag {
-  name: "new_storage_public_write_api"
-  namespace: "core_experiments_team_internal"
-  description: "API flag for writing new storage"
-  bug: "372729920"
-  is_fixed_read_only: true
+  name: "device_config_writable_namespaces_api"
+  namespace: "psap_ai"
+  description: "API flag for accessing DeviceConfig writable namespaces"
+  bug: "364083026"
   is_exported: true
 }
 
@@ -70,3 +69,13 @@
   bug: "375431994"
   is_exported: true
 }
+
+flag {
+  name: "use_proto_input_stream"
+  namespace: "core_experiments_team_internal"
+  description: "Use ProtoInputStream to deserialize protos instead of proto lite lib."
+  bug: "390667838"
+  metadata {
+    purpose: PURPOSE_BUGFIX
+  }
+}
diff --git a/framework/jarjar-rules.txt b/framework/jarjar-rules.txt
index f7641fa..2108e8f 100644
--- a/framework/jarjar-rules.txt
+++ b/framework/jarjar-rules.txt
@@ -1,2 +1,8 @@
 rule com.android.modules.utils.** android.provider.internal.modules.utils.@1
 rule android.aconfig.storage.** android.provider.internal.aconfig.storage.@1
+rule com.google.protobuf.** android.provider.configinfra.internal.protobuf.@1
+rule android.aconfigd.** android.internal.configinfra.aconfigd.@1
+
+rule android.provider.flags.*FeatureFlags* android.provider.x.@0
+rule android.provider.flags.FeatureFlags* android.provider.x.@0
+rule android.provider.flags.Flags android.provider.x.@0
diff --git a/framework/java/android/os/flagging/AconfigWriteException.java b/framework/java/android/os/flagging/AconfigWriteException.java
new file mode 100644
index 0000000..57aabc9
--- /dev/null
+++ b/framework/java/android/os/flagging/AconfigWriteException.java
@@ -0,0 +1,42 @@
+/*
+ * 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.
+ */
+
+package android.os.flagging;
+
+import android.annotation.FlaggedApi;
+import android.annotation.NonNull;
+import android.annotation.SystemApi;
+import android.provider.flags.Flags;
+import android.util.AndroidRuntimeException;
+
+/**
+ * Exception raised when there is an error writing to aconfig flag storage.
+ *
+ * @hide
+ */
+@SystemApi
+@FlaggedApi(Flags.FLAG_STAGE_FLAGS_FOR_BUILD)
+public class AconfigWriteException extends AndroidRuntimeException {
+    @FlaggedApi(Flags.FLAG_STAGE_FLAGS_FOR_BUILD)
+    public AconfigWriteException(@NonNull String message) {
+        super(message);
+    }
+
+    @FlaggedApi(Flags.FLAG_STAGE_FLAGS_FOR_BUILD)
+    public AconfigWriteException(@NonNull String message, @NonNull Throwable cause) {
+        super(message, cause);
+    }
+}
diff --git a/framework/java/android/os/flagging/AconfigdSocketWriter.java b/framework/java/android/os/flagging/AconfigdSocketWriter.java
new file mode 100644
index 0000000..eac4b70
--- /dev/null
+++ b/framework/java/android/os/flagging/AconfigdSocketWriter.java
@@ -0,0 +1,96 @@
+/*
+ * 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.
+ */
+
+package android.os.flagging;
+
+import android.aconfigd.Aconfigd.StorageRequestMessages;
+import android.aconfigd.Aconfigd.StorageReturnMessages;
+import android.annotation.NonNull;
+import android.net.LocalSocket;
+import android.net.LocalSocketAddress;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.nio.ByteBuffer;
+import java.nio.ByteOrder;
+import java.util.Arrays;
+
+/**
+ * Writes messages to aconfigd, and parses responses.
+ *
+ * @hide
+ */
+final class AconfigdSocketWriter {
+    private static final String SOCKET_ADDRESS = "aconfigd_system";
+
+    private final LocalSocket mSocket;
+
+    /**
+     * Create a new aconfigd socket connection.
+     *
+     * @hide
+     */
+    public AconfigdSocketWriter() throws IOException {
+        mSocket = new LocalSocket();
+        LocalSocketAddress address =
+                new LocalSocketAddress(SOCKET_ADDRESS, LocalSocketAddress.Namespace.RESERVED);
+        if (!mSocket.isConnected()) {
+            mSocket.connect(address);
+        }
+    }
+
+    /**
+     * Serialize {@code messages}, send to aconfigd, then receive and parse response.
+     *
+     * @param messages messages to send to aconfigd
+     * @return a {@code StorageReturnMessages} received from the socket
+     * @throws IOException if there is an IOException communicating with the socket
+     * @hide
+     */
+    public StorageReturnMessages sendMessages(@NonNull StorageRequestMessages messages)
+            throws IOException {
+        OutputStream outputStream = mSocket.getOutputStream();
+        byte[] requestMessageBytes = messages.toByteArray();
+        outputStream.write(ByteBuffer.allocate(4).putInt(requestMessageBytes.length).array());
+        outputStream.write(requestMessageBytes);
+        outputStream.flush();
+
+        InputStream inputStream = mSocket.getInputStream();
+        byte[] lengthBytes = new byte[4];
+        int bytesRead = inputStream.read(lengthBytes);
+        if (bytesRead != 4) {
+            throw new IOException(
+                    "Failed to read message length. Expected 4 bytes, read "
+                            + bytesRead
+                            + " bytes, with content: "
+                            + Arrays.toString(lengthBytes));
+        }
+        int messageLength = ByteBuffer.wrap(lengthBytes).order(ByteOrder.BIG_ENDIAN).getInt();
+        byte[] responseMessageBytes = new byte[messageLength];
+        bytesRead = inputStream.read(responseMessageBytes);
+        if (bytesRead != messageLength) {
+            throw new IOException(
+                    "Failed to read complete message. Expected "
+                            + messageLength
+                            + " bytes, read "
+                            + bytesRead
+                            + " bytes");
+        }
+
+        return StorageReturnMessages.parseFrom(responseMessageBytes);
+    }
+}
diff --git a/framework/java/android/os/flagging/ConfigInfrastructureFrameworkInitializer.java b/framework/java/android/os/flagging/ConfigInfrastructureFrameworkInitializer.java
new file mode 100644
index 0000000..3d7e655
--- /dev/null
+++ b/framework/java/android/os/flagging/ConfigInfrastructureFrameworkInitializer.java
@@ -0,0 +1,50 @@
+/*
+ * 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.
+ */
+
+package android.os.flagging;
+
+import android.annotation.FlaggedApi;
+import android.annotation.SystemApi;
+import android.app.SystemServiceRegistry;
+import android.provider.flags.Flags;
+
+/**
+ * Initializes framework services.
+ *
+ * @hide
+ */
+@SystemApi(client = SystemApi.Client.MODULE_LIBRARIES)
+@FlaggedApi(Flags.FLAG_STAGE_FLAGS_FOR_BUILD)
+public final class ConfigInfrastructureFrameworkInitializer {
+    /** Prevent instantiation. */
+    private ConfigInfrastructureFrameworkInitializer() {}
+
+    /**
+     * Called by {@link SystemServiceRegistry}'s static initializer and registers
+     * {@link FlagManager} to {@link Context}, so that {@link Context#getSystemService} can return
+     * it.
+     *
+     * <p>If this is called from other places, it throws a {@link IllegalStateException).
+     *
+     */
+    @FlaggedApi(Flags.FLAG_STAGE_FLAGS_FOR_BUILD)
+    public static void registerServiceWrappers() {
+        SystemServiceRegistry.registerContextAwareService(
+                FlagManager.FLAG_SERVICE_NAME,
+                FlagManager.class,
+                (context) -> new FlagManager(context));
+    }
+}
diff --git a/framework/java/android/os/flagging/FlagManager.java b/framework/java/android/os/flagging/FlagManager.java
new file mode 100644
index 0000000..1566e15
--- /dev/null
+++ b/framework/java/android/os/flagging/FlagManager.java
@@ -0,0 +1,312 @@
+/*
+ * 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.
+ */
+
+package android.os.flagging;
+
+import android.aconfigd.Aconfigd.FlagOverride;
+import android.aconfigd.Aconfigd.StorageRequestMessage;
+import android.aconfigd.Aconfigd.StorageRequestMessage.FlagOverrideType;
+import android.aconfigd.Aconfigd.StorageRequestMessage.RemoveOverrideType;
+import android.aconfigd.Aconfigd.StorageRequestMessages;
+import android.aconfigd.Aconfigd.StorageReturnMessage;
+import android.aconfigd.Aconfigd.StorageReturnMessages;
+import android.annotation.FlaggedApi;
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.annotation.SystemApi;
+import android.annotation.SystemService;
+import android.content.Context;
+import android.provider.flags.Flags;
+
+import java.io.IOException;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * Provides write access to aconfigd-backed flag storage.
+ *
+ * @hide
+ */
+@SystemApi
+@FlaggedApi(Flags.FLAG_STAGE_FLAGS_FOR_BUILD)
+@SystemService(FlagManager.FLAG_SERVICE_NAME)
+public final class FlagManager {
+    /**
+     * Create a new FlagManager.
+     *
+     * @hide
+     */
+    @FlaggedApi(Flags.FLAG_STAGE_FLAGS_FOR_BUILD)
+    public FlagManager(@NonNull Context unusedContext) {}
+
+    /**
+     * Use with {@link #getSystemService(String)} to retrieve a {@link
+     * android.os.flagging.FlagManager} for pushing flag values to aconfig.
+     *
+     * @see Context#getSystemService(String)
+     *
+     * @hide
+     */
+    @FlaggedApi(Flags.FLAG_STAGE_FLAGS_FOR_BUILD)
+    public static final String FLAG_SERVICE_NAME = "flag";
+
+    /**
+     * Stage flag values, to apply when the device boots into system build {@code buildFingerprint}.
+     *
+     * <p>The mapping persists across reboots, until the device finally boots into the system {@code
+     * buildFingerprint}, when the mapping is cleared.
+     *
+     * <p>Only one {@code buildFingerprint} and map of flags can be stored at a time. Subsequent
+     * calls will overwrite the existing mapping.
+     *
+     * <p>If overrides are staged for the next reboot, from {@link
+     * WriteAconfig#setOverridesOnReboot}, and overrides are also staged for a {@code
+     * buildFingerprint}, and the device boots into {@code buildFingerprint}, the {@code
+     * buildFingerprint}-associated overrides will take precedence over the reboot-associated
+     * overrides.
+     *
+     * @param buildFingerprint a system build fingerprint identifier.
+     * @param flags map from flag qualified name to new value.
+     * @throws AconfigWriteException if the write fails.
+     * @see android.os.Build.FINGERPRINT
+     */
+    @FlaggedApi(Flags.FLAG_STAGE_FLAGS_FOR_BUILD)
+    public void setBooleanOverridesOnSystemBuildFingerprint(
+            @NonNull String buildFingerprint, @NonNull Map<String, Boolean> flags) {
+        StorageRequestMessages requestMessages =
+                buildOtaFlagStagingMessages(Flag.buildFlags(flags), buildFingerprint);
+        sendMessages(requestMessages);
+    }
+
+    /**
+     * Stage flag values, to apply when the device reboots.
+     *
+     * <p>These flags will be cleared on the next reboot, regardless of whether they take effect.
+     * See {@link setBooleanOverridesOnSystemBuildFingerprint} for a thorough description of how the
+     * set of flags to take effect is determined on the next boot.
+     *
+     * @param flags map from flag qualified name to new value.
+     * @throws AconfigWriteException if the write fails.
+     *
+     */
+    @FlaggedApi(Flags.FLAG_STAGE_FLAGS_FOR_BUILD)
+    public void setBooleanOverridesOnReboot(@NonNull Map<String, Boolean> flags) {
+        StorageRequestMessages requestMessages =
+                buildFlagOverrideMessages(
+                        Flag.buildFlags(flags), FlagOverrideType.SERVER_ON_REBOOT);
+        sendMessages(requestMessages);
+    }
+
+    /**
+     * Set local overrides, to apply on device reboot.
+     *
+     * <p>Local overrides take precedence over normal overrides. They must be cleared for normal
+     * overrides to take effect again.
+     *
+     * @param flags map from flag qualified name to new value.
+     * @see clearBooleanLocalOverridesOnReboot
+     * @see clearBooleanLocalOverridesImmediately
+     */
+    @FlaggedApi(Flags.FLAG_STAGE_FLAGS_FOR_BUILD)
+    public void setBooleanLocalOverridesOnReboot(@NonNull Map<String, Boolean> flags) {
+        StorageRequestMessages requestMessages =
+                buildFlagOverrideMessages(Flag.buildFlags(flags), FlagOverrideType.LOCAL_ON_REBOOT);
+        sendMessages(requestMessages);
+    }
+
+    /**
+     * Set local overrides, to apply immediately.
+     *
+     * <p>Local overrides take precedence over normal overrides. They must be cleared for normal
+     * overrides to take effect again.
+     *
+     * <p>Note that processes cache flag values, so a process restart or reboot is still required to
+     * get the latest flag value.
+     *
+     * @param flags map from flag qualified name to new value.
+     * @see clearBooleanLocalOverridesOnReboot
+     * @see clearBooleanLocalOverridesImmediately
+     */
+    @FlaggedApi(Flags.FLAG_STAGE_FLAGS_FOR_BUILD)
+    public void setBooleanLocalOverridesImmediately(@NonNull Map<String, Boolean> flags) {
+        StorageRequestMessages requestMessages =
+                buildFlagOverrideMessages(Flag.buildFlags(flags), FlagOverrideType.LOCAL_IMMEDIATE);
+        sendMessages(requestMessages);
+    }
+
+    /**
+     * Clear local overrides, to take effect on reboot.
+     *
+     * <p>If {@code flags} is {@code null}, clear all local overrides.
+     *
+     * @param flags map from flag qualified name to new value.
+     * @see setBooleanLocalOverridesOnReboot
+     * @see setBooleanLocalOverridesImmediately
+     */
+    @FlaggedApi(Flags.FLAG_STAGE_FLAGS_FOR_BUILD)
+    public void clearBooleanLocalOverridesOnReboot(@Nullable Set<String> flags) {
+        StorageRequestMessages requestMessages =
+                buildClearFlagOverridesMessages(
+                        Flag.buildFlagsWithoutValues(flags),
+                        RemoveOverrideType.REMOVE_LOCAL_ON_REBOOT);
+        sendMessages(requestMessages);
+    }
+
+    /**
+     * Clear local overrides, to take effect immediately.
+     *
+     * <p>Note that processes cache flag values, so a process restart or reboot is still required to
+     * get the latest flag value.
+     *
+     * <p>If {@code flags} is {@code null}, clear all local overrides.
+     *
+     * @param flags map from flag qualified name to new value.
+     * @see setBooleanLocalOverridesOnReboot
+     * @see setBooleanLocalOverridesImmediately
+     */
+    @FlaggedApi(Flags.FLAG_STAGE_FLAGS_FOR_BUILD)
+    public void clearBooleanLocalOverridesImmediately(@Nullable Set<String> flags) {
+        StorageRequestMessages requestMessages =
+                buildClearFlagOverridesMessages(
+                        Flag.buildFlagsWithoutValues(flags),
+                        RemoveOverrideType.REMOVE_LOCAL_IMMEDIATE);
+        sendMessages(requestMessages);
+    }
+
+    private void sendMessages(StorageRequestMessages messages) {
+        try {
+            StorageReturnMessages returnMessages =
+                    (new AconfigdSocketWriter()).sendMessages(messages);
+
+            String errorMessage = "";
+            for (StorageReturnMessage message : returnMessages.getMsgsList()) {
+                if (message.hasErrorMessage()) {
+                    errorMessage += message.getErrorMessage() + "\n";
+                }
+            }
+
+            if (!errorMessage.isEmpty()) {
+                throw new AconfigWriteException("error(s) writing aconfig flags: " + errorMessage);
+            }
+        } catch (IOException e) {
+            throw new AconfigWriteException("IO error writing aconfig flags", e);
+        }
+    }
+
+    private static class Flag {
+        public final String packageName;
+        public final String flagName;
+        public final String value;
+
+        public Flag(@NonNull String qualifiedName, @Nullable Boolean value) {
+            packageName = qualifiedName.substring(0, qualifiedName.lastIndexOf("."));
+            flagName = qualifiedName.substring(qualifiedName.lastIndexOf(".") + 1);
+            this.value = Boolean.toString(value);
+        }
+
+        public static Set<Flag> buildFlags(@NonNull Map<String, Boolean> flags) {
+            HashSet<Flag> flagSet = new HashSet();
+            for (Map.Entry<String, Boolean> flagAndValue : flags.entrySet()) {
+                flagSet.add(new Flag(flagAndValue.getKey(), flagAndValue.getValue()));
+            }
+            return flagSet;
+        }
+
+        public static Set<Flag> buildFlagsWithoutValues(@NonNull Set<String> flags) {
+            HashSet<Flag> flagSet = new HashSet();
+            for (String flag : flags) {
+                flagSet.add(new Flag(flag, null));
+            }
+            return flagSet;
+        }
+    }
+
+    private static StorageRequestMessages buildFlagOverrideMessages(
+            @NonNull Set<Flag> flagSet, FlagOverrideType overrideType) {
+        StorageRequestMessages.Builder requestMessagesBuilder = StorageRequestMessages.newBuilder();
+        for (Flag flag : flagSet) {
+            StorageRequestMessage.FlagOverrideMessage message =
+                    StorageRequestMessage.FlagOverrideMessage.newBuilder()
+                            .setPackageName(flag.packageName)
+                            .setFlagName(flag.flagName)
+                            .setFlagValue(flag.value)
+                            .setOverrideType(overrideType)
+                            .build();
+            StorageRequestMessage requestMessage =
+                    StorageRequestMessage.newBuilder().setFlagOverrideMessage(message).build();
+            requestMessagesBuilder.addMsgs(requestMessage);
+        }
+        return requestMessagesBuilder.build();
+    }
+
+    private static StorageRequestMessages buildOtaFlagStagingMessages(
+            @NonNull Set<Flag> flagSet, @NonNull String buildFingerprint) {
+        StorageRequestMessage.OTAFlagStagingMessage.Builder otaMessageBuilder =
+                StorageRequestMessage.OTAFlagStagingMessage.newBuilder()
+                        .setBuildId(buildFingerprint);
+        for (Flag flag : flagSet) {
+            FlagOverride override =
+                    FlagOverride.newBuilder()
+                            .setPackageName(flag.packageName)
+                            .setFlagName(flag.flagName)
+                            .setFlagValue(flag.value)
+                            .build();
+            otaMessageBuilder.addOverrides(override);
+        }
+        StorageRequestMessage.OTAFlagStagingMessage otaMessage = otaMessageBuilder.build();
+        StorageRequestMessage requestMessage =
+                StorageRequestMessage.newBuilder().setOtaStagingMessage(otaMessage).build();
+        StorageRequestMessages.Builder requestMessagesBuilder = StorageRequestMessages.newBuilder();
+        requestMessagesBuilder.addMsgs(requestMessage);
+        return requestMessagesBuilder.build();
+    }
+
+    private static StorageRequestMessages buildClearFlagOverridesMessages(
+            @Nullable Set<Flag> flagSet, RemoveOverrideType removeOverrideType) {
+        StorageRequestMessages.Builder requestMessagesBuilder = StorageRequestMessages.newBuilder();
+
+        if (flagSet == null) {
+            StorageRequestMessage.RemoveLocalOverrideMessage message =
+                    StorageRequestMessage.RemoveLocalOverrideMessage.newBuilder()
+                            .setRemoveAll(true)
+                            .setRemoveOverrideType(removeOverrideType)
+                            .build();
+            StorageRequestMessage requestMessage =
+                    StorageRequestMessage.newBuilder()
+                            .setRemoveLocalOverrideMessage(message)
+                            .build();
+            requestMessagesBuilder.addMsgs(requestMessage);
+            return requestMessagesBuilder.build();
+        }
+
+        for (Flag flag : flagSet) {
+            StorageRequestMessage.RemoveLocalOverrideMessage message =
+                    StorageRequestMessage.RemoveLocalOverrideMessage.newBuilder()
+                            .setPackageName(flag.packageName)
+                            .setFlagName(flag.flagName)
+                            .setRemoveOverrideType(removeOverrideType)
+                            .setRemoveAll(false)
+                            .build();
+            StorageRequestMessage requestMessage =
+                    StorageRequestMessage.newBuilder()
+                            .setRemoveLocalOverrideMessage(message)
+                            .build();
+            requestMessagesBuilder.addMsgs(requestMessage);
+        }
+        return requestMessagesBuilder.build();
+    }
+}
diff --git a/framework/java/android/provider/DeviceConfig.java b/framework/java/android/provider/DeviceConfig.java
index 3a819e0..f9f8555 100644
--- a/framework/java/android/provider/DeviceConfig.java
+++ b/framework/java/android/provider/DeviceConfig.java
@@ -34,6 +34,12 @@
 import android.content.ContentResolver;
 import android.database.ContentObserver;
 import android.net.Uri;
+import android.os.Binder;
+import android.os.IBinder;
+import android.os.ParcelFileDescriptor;
+import android.provider.DeviceConfigServiceManager;
+import android.provider.DeviceConfigInitializer;
+import android.provider.aidl.IDeviceConfigManager;
 import android.provider.flags.Flags;
 import android.ravenwood.annotation.RavenwoodKeepWholeClass;
 import android.ravenwood.annotation.RavenwoodRedirect;
@@ -43,6 +49,7 @@
 import android.util.ArraySet;
 import android.util.Log;
 import android.util.Pair;
+import android.util.Slog;
 
 import com.android.internal.annotations.GuardedBy;
 import com.android.modules.utils.build.SdkLevel;
@@ -67,15 +74,6 @@
 import java.util.TreeSet;
 import java.util.concurrent.Executor;
 
-import android.util.Log;
-
-import android.provider.aidl.IDeviceConfigManager;
-import android.provider.DeviceConfigServiceManager;
-import android.provider.DeviceConfigInitializer;
-import android.os.Binder;
-import android.os.IBinder;
-import android.os.ParcelFileDescriptor;
-
 /**
  * Device level configuration parameters which can be tuned by a separate configuration service.
  * Namespaces that end in "_native" such as {@link #NAMESPACE_NETD_NATIVE} are intended to be used
@@ -1057,6 +1055,20 @@
     @SystemApi
     public static final int SYNC_DISABLED_MODE_UNTIL_REBOOT = 2;
 
+
+    // NOTE: this API is only used by the framework code, but using MODULE_LIBRARIES causes a
+    // build-time error on CtsDeviceConfigTestCases, so it's using PRIVILEGED_APPS.
+    /**
+     * Optional argument to {@link #dump(ParcelFileDescriptor, PrintWriter, String, String[])} to
+     * indicate that the next argument is a namespace. How {@code dump()} will handle that
+     * argument is documented there.
+     *
+     * @hide
+     */
+    @SystemApi(client = SystemApi.Client.PRIVILEGED_APPS)
+    @FlaggedApi(Flags.FLAG_DUMP_IMPROVEMENTS)
+    public static final String DUMP_ARG_NAMESPACE = "--namespace";
+
     private static final Object sLock = new Object();
     @GuardedBy("sLock")
     private static ArrayMap<OnPropertiesChangedListener, Pair<String, Executor>> sListeners =
@@ -1064,6 +1076,7 @@
     @GuardedBy("sLock")
     private static Map<String, Pair<ContentObserver, Integer>> sNamespaces = new HashMap<>();
     private static final String TAG = "DeviceConfig";
+    private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
 
     private static final DeviceConfigDataStore sDataStore = newDataStore();
 
@@ -1271,7 +1284,7 @@
         try {
             return Integer.parseInt(value);
         } catch (NumberFormatException e) {
-            Log.e(TAG, "Parsing integer failed for " + namespace + ":" + name);
+            Slog.e(TAG, "Parsing integer failed for " + namespace + ":" + name);
             return defaultValue;
         }
     }
@@ -1296,7 +1309,7 @@
         try {
             return Long.parseLong(value);
         } catch (NumberFormatException e) {
-            Log.e(TAG, "Parsing long failed for " + namespace + ":" + name);
+            Slog.e(TAG, "Parsing long failed for " + namespace + ":" + name);
             return defaultValue;
         }
     }
@@ -1322,7 +1335,7 @@
         try {
             return Float.parseFloat(value);
         } catch (NumberFormatException e) {
-            Log.e(TAG, "Parsing float failed for " + namespace + ":" + name);
+            Slog.e(TAG, "Parsing float failed for " + namespace + ":" + name);
             return defaultValue;
         }
     }
@@ -1565,13 +1578,21 @@
         }
     }
 
+    // TODO(b/364399200): should provide a getOnPropertiesChangedListeners() methods instead and let
+    // caller implement dump() instead
+
     // NOTE: this API is only used by the framework code, but using MODULE_LIBRARIES causes a
     // build-time error on CtsDeviceConfigTestCases, so it's using PRIVILEGED_APPS.
     /**
-     * Dumps internal state into the given {@code fd} or {@code pw}.
+     * Dumps internal state into the given {@code fd} or {@code printWriter}.
      *
-     * @param fd file descriptor that will output the dump state. Typically used for binary dumps.
-     * @param pw print writer that will output the dump state. Typically used for formatted text.
+     * <p><b>Note:</b> Currently the only supported argument is
+     * {@link DeviceConfig#DUMP_ARG_NAMESPACE}, which will filter the output using a substring of
+     * the next argument. But other arguments might be
+     * dynamically added in the future, without documentation - this method is meant only for
+     * debugging purposes, and should not be used as a formal API.
+     *
+     * @param printWriter print writer that will output the dump state.
      * @param prefix prefix added to each line
      * @param args (optional) arguments passed by {@code dumpsys}.
      *
@@ -1579,19 +1600,44 @@
      */
     @SystemApi(client = SystemApi.Client.PRIVILEGED_APPS)
     @FlaggedApi(Flags.FLAG_DUMP_IMPROVEMENTS)
-    @RequiresPermission(DUMP)
-    public static void dump(@NonNull ParcelFileDescriptor fd, @NonNull PrintWriter pw,
-            @NonNull String dumpPrefix, @Nullable String[] args) {
+    public static void dump(@NonNull PrintWriter printWriter, @NonNull String dumpPrefix,
+            @Nullable String[] args) {
+        if (DEBUG) {
+            Slog.d(TAG, "dump(): args=" + Arrays.toString(args));
+        }
+        Objects.requireNonNull(printWriter, "printWriter cannot be null");
+
         Comparator<OnPropertiesChangedListener> comparator = (o1, o2) -> o1.toString()
                 .compareTo(o2.toString());
         TreeMap<String, Set<OnPropertiesChangedListener>> listenersByNamespace  =
                 new TreeMap<>();
         ArraySet<OnPropertiesChangedListener> uniqueListeners = new ArraySet<>();
+        String filter = null;
+        if (args.length > 0) {
+            switch (args[0]) {
+                case DUMP_ARG_NAMESPACE:
+                    if (args.length < 2) {
+                        throw new IllegalArgumentException(
+                                "argument " + DUMP_ARG_NAMESPACE + " requires an extra argument");
+                    }
+                    filter = args[1];
+                    if (DEBUG) {
+                        Slog.d(TAG, "dump(): setting filter as " + filter);
+                    }
+                    break;
+                default:
+                    Slog.w(TAG, "dump(): ignoring invalid arguments: " + Arrays.toString(args));
+                    break;
+            }
+        }
         int listenersSize;
         synchronized (sLock) {
             listenersSize = sListeners.size();
             for (int i = 0; i < listenersSize; i++) {
                 var namespace = sListeners.valueAt(i).first;
+                if (filter != null && !namespace.contains(filter)) {
+                    continue;
+                }
                 var listener = sListeners.keyAt(i);
                 var listeners = listenersByNamespace.get(namespace);
                 if (listeners == null) {
@@ -1603,14 +1649,14 @@
                 uniqueListeners.add(listener);
             }
         }
-        pw.printf("%s%d listeners for %d namespaces:\n", dumpPrefix, uniqueListeners.size(),
+        printWriter.printf("%s%d listeners for %d namespaces:\n", dumpPrefix, uniqueListeners.size(),
                 listenersByNamespace.size());
         for (var entry : listenersByNamespace.entrySet()) {
             var namespace = entry.getKey();
             var listeners = entry.getValue();
-            pw.printf("%s%s: %d listeners\n", dumpPrefix, namespace, listeners.size());
+            printWriter.printf("%s%s: %d listeners\n", dumpPrefix, namespace, listeners.size());
             for (var listener : listeners) {
-                pw.printf("%s%s%s\n", dumpPrefix, dumpPrefix, listener);
+                printWriter.printf("%s%s%s\n", dumpPrefix, dumpPrefix, listener);
             }
         }
     }
@@ -1734,7 +1780,7 @@
                 properties = getProperties(namespace, keys);
             } catch (SecurityException e) {
                 // Silently failing to not crash binder or listener threads.
-                Log.e(TAG, "OnPropertyChangedListener update failed: permission violation.");
+                Slog.e(TAG, "OnPropertyChangedListener update failed: permission violation.");
                 return;
             }
 
@@ -1777,6 +1823,16 @@
     }
 
     /**
+     * Returns the list of namespaces in which all flags can be written with adb as non-root.
+     * @hide
+     */
+    @SystemApi
+    @FlaggedApi(Flags.FLAG_DEVICE_CONFIG_WRITABLE_NAMESPACES_API)
+    public static @NonNull Set<String> getAdbWritableNamespaces() {
+        return WritableNamespaces.ALLOWLIST;
+    }
+
+    /**
      * Interface for monitoring changes to properties. Implementations will receive callbacks when
      * properties change, including a {@link Properties} object which contains a single namespace
      * and all of the properties which changed for that namespace. This includes properties which
@@ -1913,7 +1969,7 @@
             try {
                 return Integer.parseInt(value);
             } catch (NumberFormatException e) {
-                Log.e(TAG, "Parsing int failed for " + name);
+                Slog.e(TAG, "Parsing int failed for " + name);
                 return defaultValue;
             }
         }
@@ -1935,7 +1991,7 @@
             try {
                 return Long.parseLong(value);
             } catch (NumberFormatException e) {
-                Log.e(TAG, "Parsing long failed for " + name);
+                Slog.e(TAG, "Parsing long failed for " + name);
                 return defaultValue;
             }
         }
@@ -1957,7 +2013,7 @@
             try {
                 return Float.parseFloat(value);
             } catch (NumberFormatException e) {
-                Log.e(TAG, "Parsing float failed for " + name);
+                Slog.e(TAG, "Parsing float failed for " + name);
                 return defaultValue;
             }
         }
diff --git a/framework/java/android/provider/StageOtaFlags.java b/framework/java/android/provider/StageOtaFlags.java
index 6d56ee6..74d697b 100644
--- a/framework/java/android/provider/StageOtaFlags.java
+++ b/framework/java/android/provider/StageOtaFlags.java
@@ -13,49 +13,161 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-
 package android.provider;
 
+import android.aconfigd.Aconfigd.FlagOverride;
+import android.aconfigd.Aconfigd.StorageRequestMessage;
+import android.aconfigd.Aconfigd.StorageRequestMessages;
+import android.aconfigd.Aconfigd.StorageReturnMessages;
+import android.annotation.IntDef;
 import android.annotation.FlaggedApi;
 import android.annotation.NonNull;
 import android.annotation.SystemApi;
+import android.net.LocalSocket;
+import android.net.LocalSocketAddress;
 import android.provider.flags.Flags;
+import android.util.AndroidRuntimeException;
 import android.util.Log;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.io.File;
+import java.nio.ByteBuffer;
+import java.nio.ByteOrder;
 import java.util.Map;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Retention;
 
 /** @hide */
 @SystemApi
 @FlaggedApi(Flags.FLAG_STAGE_FLAGS_FOR_BUILD)
 public final class StageOtaFlags {
   private static String LOG_TAG = "StageOtaFlags";
+  private static final String SOCKET_ADDRESS = "aconfigd_system";
+  private static final String STORAGE_MARKER_FILE_PATH
+        = "/metadata/aconfig/boot/enable_only_new_storage";
+
+  /** Aconfig storage is disabled and unavailable for writes. @hide */
+  @SystemApi public static final int STATUS_STORAGE_NOT_ENABLED = -1;
+  /** Stage request was successful. @hide */
+  @SystemApi public static final int STATUS_STAGE_SUCCESS = 0;
+
+  /** @hide */
+  @IntDef(prefix = { "STATUS_" }, value = {
+    STATUS_STORAGE_NOT_ENABLED,
+    STATUS_STAGE_SUCCESS,
+  })
+  @Retention(RetentionPolicy.SOURCE)
+  public @interface StageStatus {}
 
   private StageOtaFlags() {}
 
   /**
    * Stage aconfig flags to be applied when booting into {@code buildId}.
    *
-   * <p>Only a single {@code buildId} and its corresponding flags are stored at
-   * once. Every invocation of this method will overwrite whatever mapping was
-   * previously stored.
+   * <p>Only a single {@code buildId} and its corresponding flags are stored at once. Every
+   * invocation of this method will overwrite whatever mapping was previously stored.
    *
-   * It is an implementation error to call this if the storage is not
-   * initialized and ready to receive writes. Callers must ensure that it is
-   * available before invoking.
+   * <p>It is an implementation error to call this if the storage is not initialized and ready to
+   * receive writes. Callers must ensure that it is available before invoking.
    *
-   * TODO(b/361783454): create an isStorageAvailable API and mention it in this
-   * docstring.
+   * <p>TODO(b/361783454): create an isStorageAvailable API and mention it in this docstring.
    *
    * @param flags a map from {@code <packagename>.<flagname>} to flag values
    * @param buildId when the device boots into buildId, it will apply {@code flags}
-   * @throws IllegalStateException if the storage is not ready to receive writes
-   *
+   * @throws AndroidRuntimeException if communication with aconfigd fails
    * @hide
    */
   @SystemApi
   @FlaggedApi(Flags.FLAG_STAGE_FLAGS_FOR_BUILD)
-  public static void stageBooleanAconfigFlagsForBuild(
+  @StageStatus
+  public static int stageBooleanAconfigFlagsForBuild(
       @NonNull Map<String, Boolean> flags, @NonNull String buildId) {
     int flagCount = flags.size();
     Log.d(LOG_TAG, "stageFlagsForBuild invoked for " + flagCount + " flags");
+
+    try {
+      LocalSocket socket = new LocalSocket();
+      LocalSocketAddress address =
+          new LocalSocketAddress(SOCKET_ADDRESS, LocalSocketAddress.Namespace.RESERVED);
+      if (!socket.isConnected()) {
+        socket.connect(address);
+      }
+      InputStream inputStream = socket.getInputStream();
+      OutputStream outputStream = socket.getOutputStream();
+
+      StorageRequestMessages requestMessages = buildRequestMessages(flags, buildId);
+
+      writeToSocket(outputStream, requestMessages);
+      readFromSocket(inputStream);
+    } catch (IOException e) {
+      throw new AndroidRuntimeException(e);
+    }
+
+    return STATUS_STAGE_SUCCESS;
+  }
+
+  private static void writeToSocket(
+      OutputStream outputStream, StorageRequestMessages requestMessages) throws IOException {
+    byte[] messageBytes = requestMessages.toByteArray();
+    outputStream.write(ByteBuffer.allocate(4).putInt(messageBytes.length).array());
+    outputStream.write(messageBytes);
+    outputStream.flush();
+  }
+
+  private static StorageReturnMessages readFromSocket(InputStream inputStream) throws IOException {
+    byte[] lengthBytes = new byte[4];
+    int bytesRead = inputStream.read(lengthBytes);
+    if (bytesRead != 4) {
+      throw new IOException("Failed to read message length");
+    }
+
+    int messageLength = ByteBuffer.wrap(lengthBytes).order(ByteOrder.BIG_ENDIAN).getInt();
+
+    byte[] messageBytes = new byte[messageLength];
+    bytesRead = inputStream.read(messageBytes);
+    if (bytesRead != messageLength) {
+      throw new IOException("Failed to read complete message");
+    }
+
+    return StorageReturnMessages.parseFrom(messageBytes);
+  }
+
+  private static StorageRequestMessages buildRequestMessages(
+      @NonNull Map<String, Boolean> flags, @NonNull String buildId) {
+    StorageRequestMessage.OTAFlagStagingMessage.Builder otaMessageBuilder =
+        StorageRequestMessage.OTAFlagStagingMessage.newBuilder().setBuildId(buildId);
+    for (Map.Entry<String, Boolean> flagAndValue : flags.entrySet()) {
+      String qualifiedFlagName = flagAndValue.getKey();
+
+      // aconfig flags follow a package_name [dot] flag_name convention and will always have
+      // a [dot] character in the flag name.
+      //
+      // If a [dot] character wasn't found it's likely because this was a legacy flag. We make no
+      // assumptions here and still attempt to stage these flags with aconfigd and let it decide
+      // whether to use the flag / discard it.
+      String packageName = "";
+      String flagName = qualifiedFlagName;
+      int idx = qualifiedFlagName.lastIndexOf(".");
+      if (idx != -1) {
+        packageName = qualifiedFlagName.substring(0, qualifiedFlagName.lastIndexOf("."));
+        flagName = qualifiedFlagName.substring(qualifiedFlagName.lastIndexOf(".") + 1);
+      }
+
+      String value = flagAndValue.getValue() ? "true" : "false";
+      FlagOverride override =
+          FlagOverride.newBuilder()
+              .setPackageName(packageName)
+              .setFlagName(flagName)
+              .setFlagValue(value)
+              .build();
+      otaMessageBuilder.addOverrides(override);
+    }
+    StorageRequestMessage.OTAFlagStagingMessage otaMessage = otaMessageBuilder.build();
+    StorageRequestMessage requestMessage =
+        StorageRequestMessage.newBuilder().setOtaStagingMessage(otaMessage).build();
+    StorageRequestMessages requestMessages =
+        StorageRequestMessages.newBuilder().addMsgs(requestMessage).build();
+    return requestMessages;
   }
 }
diff --git a/framework/java/android/provider/WritableFlags.java b/framework/java/android/provider/WritableFlags.java
index 47f5acf..e6c1f77 100644
--- a/framework/java/android/provider/WritableFlags.java
+++ b/framework/java/android/provider/WritableFlags.java
@@ -1,5 +1,7 @@
 package android.provider;
 
+import android.ravenwood.annotation.RavenwoodKeepWholeClass;
+
 import java.util.Arrays;
 import java.util.HashSet;
 import java.util.Set;
@@ -13,15 +15,19 @@
  * description of the flag's functionality, and a justification for why it needs to be
  * allowlisted.
  */
+@RavenwoodKeepWholeClass
 final class WritableFlags {
     public static final Set<String> ALLOWLIST =
             new HashSet<String>(Arrays.asList(
+                "a.a.a/b.b",
+                "a.a.a/b.b.b",
                 "accessibility/enable_font_scaling_qs_tile",
                 "accessibility/enable_magnifier_thumbnail",
                 "activity_manager/am_block_activity_starts_after_home",
                 "activity_manager/android_app_data_isolation_min_sdk",
                 "activity_manager/background_activity_starts_package_names_whitelist",
                 "activity_manager/bg_abusive_notification_minimal_interval",
+                "activity_manager/bg_auto_restricted_bucket_on_bg_restricted",
                 "activity_manager/bg_current_drain_auto_restrict_abusive_apps_enabled",
                 "activity_manager/bg_current_drain_threshold_to_bg_restricted",
                 "activity_manager/bg_prompt_abusive_apps_to_bg_restricted",
@@ -31,14 +37,32 @@
                 "activity_manager/compact_proc_state_throttle",
                 "activity_manager/compact_statsd_sample_rate",
                 "activity_manager/containing",
-                "activity_manager/containing",
+                "activity_manager/data_sync_fgs_timeout_duration",
                 "activity_manager/default_background_activity_starts_enabled",
                 "activity_manager/default_background_fgs_starts_restriction_enabled",
                 "activity_manager/enable_app_start_info",
                 "activity_manager/enforce_exported_flag_requirement",
+                "activity_manager/fgs_crash_extra_wait_duration",
+                "activity_manager/fgs_type_perm_enforcement_flag_camera",
+                "activity_manager/fgs_type_perm_enforcement_flag_connected_device",
+                "activity_manager/fgs_type_perm_enforcement_flag_data_sync",
+                "activity_manager/fgs_type_perm_enforcement_flag_health",
+                "activity_manager/fgs_type_perm_enforcement_flag_location",
+                "activity_manager/fgs_type_perm_enforcement_flag_media_playback",
+                "activity_manager/fgs_type_perm_enforcement_flag_media_projection",
+                "activity_manager/fgs_type_perm_enforcement_flag_microphone",
+                "activity_manager/fgs_type_perm_enforcement_flag_phone_call",
+                "activity_manager/fgs_type_perm_enforcement_flag_remote_messaging",
+                "activity_manager/fgs_type_perm_enforcement_flag_special_use",
+                "activity_manager/fgs_type_perm_enforcement_flag_system_exempted",
+                "activity_manager/fg_to_bg_fgs_grace_duration",
                 "activity_manager/low_swap_threshold_percent",
                 "activity_manager/lru_weight",
                 "activity_manager/max_cached_processes",
+                "activity_manager/max_phantom_processes",
+                "activity_manager/max_service_connections_per_process",
+                "activity_manager/media_processing_fgs_timeout_duration",
+                "activity_manager_native_boot/freeze_debounce_timeout",
                 "activity_manager_native_boot/freeze_debounce_timeout_ms",
                 "activity_manager_native_boot/freeze_exempt_inst_pkg",
                 "activity_manager_native_boot/modern_queue_enabled",
@@ -49,113 +73,39 @@
                 "activity_manager/proactive_kills_enabled",
                 "activity_manager/push_messaging_over_quota_behavior",
                 "activity_manager/rss_weight",
+                "activity_manager/service_start_foreground_timeout_ms",
+                "activity_manager/short_fgs_anr_extra_wait_duration",
+                "activity_manager/short_fgs_proc_state_extra_wait_duration",
+                "activity_manager/short_fgs_timeout_duration",
+                "activity_manager/top_to_fgs_grace_duration",
                 "activity_manager/use_compaction",
                 "activity_manager/use_oom_re_ranking",
                 "activity_manager/uses_weight",
                 "adaptive_charging/adaptive_charging_enabled",
                 "adaptive_charging/adaptive_charging_notification",
-                "adservices/adid_kill_switch",
-                "adservices/adservice_enabled",
-                "adservices/adservice_system_service_enabled",
-                "adservices/appsetid_kill_switch",
-                "adservices/back_compact_test_param",
-                "adservices/disable_sdk_sandbox",
-                "adservices/enable_test_param",
-                "adservices/enable_topic_contributors_check",
-                "adservices/enrollment_blocklist_ids",
-                "adservices/fledge_ad_selection_bidding_timeout_per_ca_ms",
-                "adservices/fledge_ad_selection_concurrent_bidding_count",
-                "adservices/fledge_ad_selection_enforce_foreground_status_ad_selection_override",
-                "adservices/fledge_ad_selection_enforce_foreground_status_custom_audience",
-                "adservices/fledge_ad_selection_enforce_foreground_status_report_impression",
-                "adservices/fledge_ad_selection_enforce_foreground_status_run_ad_selection",
-                "adservices/fledge_ad_selection_overall_timeout_ms",
-                "adservices/fledge_ad_selection_scoring_timeout_ms",
-                "adservices/fledge_background_fetch_eligible_update_base_interval_s",
-                "adservices/fledge_background_fetch_enabled",
-                "adservices/fledge_background_fetch_job_flex_ms",
-                "adservices/fledge_background_fetch_job_max_runtime_ms",
-                "adservices/fledge_background_fetch_job_period_ms",
-                "adservices/fledge_background_fetch_max_num_updated",
-                "adservices/fledge_background_fetch_max_response_size_b",
-                "adservices/fledge_background_fetch_network_connect_timeout_ms",
-                "adservices/fledge_background_fetch_network_read_timeout_ms",
-                "adservices/fledge_background_fetch_thread_pool_size",
-                "adservices/fledge_custom_audience_active_time_window_ms",
-                "adservices/fledge_custom_audience_default_expire_in_ms",
-                "adservices/fledge_custom_audience_max_activate_in_ms",
-                "adservices/fledge_custom_audience_max_ads_size_b",
-                "adservices/fledge_custom_audience_max_bidding_logic_uri_size_b",
-                "adservices/fledge_custom_audience_max_count",
-                "adservices/fledge_custom_audience_max_daily_update_uri_size_b",
-                "adservices/fledge_custom_audience_max_expire_in_ms",
-                "adservices/fledge_custom_audience_max_name_size_b",
-                "adservices/fledge_custom_audience_max_num_ads",
-                "adservices/fledge_custom_audience_max_owner_count",
-                "adservices/fledge_custom_audience_max_trusted_bidding_data_size_b",
-                "adservices/fledge_custom_audience_max_user_bidding_signals_size_b",
-                "adservices/fledge_custom_audience_per_app_max_count",
-                "adservices/fledge_custom_audience_service_kill_switch",
-                "adservices/fledge_js_isolate_enforce_max_heap_size",
-                "adservices/fledge_js_isolate_max_heap_size_bytes",
-                "adservices/fledge_report_impression_overall_timeout_ms",
-                "adservices/fledge_select_ads_kill_switch",
-                "adservices/foreground_validation_status_level",
-                "adservices/ga_ux_enabled",
-                "adservices/global_kill_switch",
-                "adservices/mdd_android_sharing_sample_interval",
-                "adservices/mdd_api_logging_sample_interval",
-                "adservices/mdd_background_task_kill_switch",
-                "adservices/mdd_cellular_charging_gcm_task_period_seconds",
-                "adservices/mdd_charging_gcm_task_period_seconds",
-                "adservices/mdd_default_sample_interval",
-                "adservices/mdd_download_events_sample_interval",
-                "adservices/mdd_group_stats_logging_sample_interval",
-                "adservices/mdd_logger_kill_switch",
-                "adservices/mdd_maintenance_gcm_task_period_seconds",
-                "adservices/mdd_measurement_manifest_file_url",
-                "adservices/mdd_mobstore_file_service_stats_sample_interval",
-                "adservices/mdd_network_stats_logging_sample_interval",
-                "adservices/mdd_storage_stats_logging_sample_interval",
-                "adservices/mdd_topics_classifier_manifest_file_url",
-                "adservices/mdd_ui_ota_strings_manifest_file_url",
-                "adservices/mdd_wifi_charging_gcm_task_period_seconds",
-                "adservices/measurement_api_delete_registrations_kill_switch",
-                "adservices/measurement_api_register_source_kill_switch",
-                "adservices/measurement_api_register_trigger_kill_switch",
-                "adservices/measurement_api_register_web_source_kill_switch",
-                "adservices/measurement_api_register_web_trigger_kill_switch",
-                "adservices/measurement_api_status_kill_switch",
-                "adservices/measurement_job_aggregate_fallback_reporting_kill_switch",
-                "adservices/measurement_job_aggregate_reporting_kill_switch",
-                "adservices/measurement_job_attribution_kill_switch",
-                "adservices/measurement_job_delete_expired_kill_switch",
-                "adservices/measurement_job_event_fallback_reporting_kill_switch",
-                "adservices/measurement_job_event_reporting_kill_switch",
-                "adservices/measurement_kill_switch",
-                "adservices/measurement_receiver_delete_packages_kill_switch",
-                "adservices/measurement_receiver_install_attribution_kill_switch",
-                "adservices/ppapi_app_allow_list",
-                "adservices/ppapi_app_signature_allow_list",
-                "adservices/sdksandbox_customized_sdk_context_enabled",
-                "adservices/topics_epoch_job_flex_ms",
-                "adservices/topics_epoch_job_period_ms",
-                "adservices/topics_kill_switch",
-                "adservices/topics_number_of_lookback_epochs",
-                "adservices/topics_number_of_random_topics",
-                "adservices/topics_number_of_top_topics",
-                "adservices/topics_percentage_for_random_topics",
-                "adservices/ui_dialogs_feature_enabled",
-                "adservices/ui_ota_strings_download_deadline",
-                "adservices/ui_ota_strings_feature_enabled",
+                "alarm_manager/allow_while_idle_compat_quota",
+                "alarm_manager/allow_while_idle_compat_window",
+                "alarm_manager/allow_while_idle_quota",
+                "alarm_manager/allow_while_idle_window",
+                "alarm_manager/app_standby_restricted_window",
+                "alarm_manager/app_standby_window",
                 "alarm_manager/lazy_batching",
+                "alarm_manager/max_alarm_managers_per_uid",
+                "alarm_manager/min_futurity",
+                "alarm_manager/min_interval",
+                "alarm_manager/min_window",
+                "alarm_manager/priority_alarm_manager_delay",
                 "alarm_manager/temporary_quota_bump",
+                "ambient_context/service_enabled",
+                "android/system_gesture_exclusion_limit_dp",
                 "app_cloning/cloned_apps_enabled",
                 "app_cloning/enable_app_cloning_building_blocks",
+                "app_compat/hidden_api_access_statslog_sampling_rate",
                 "app_compat/hidden_api_log_sampling_rate",
                 "app_compat/hidden_api_statslog_sampling_rate",
                 "app_compat_overrides/cn_wps_moffice_eng_flag",
                 "app_compat_overrides/com_amanotes_beathopper_flag",
+                "app_compat_overrides/com.android.cts.appcompat.preinstalloverride",
                 "app_compat_overrides/com_balaji_alt_flag",
                 "app_compat_overrides/com_camerasideas_instashot_flag",
                 "app_compat_overrides/com_facebook_lite_flag",
@@ -190,16 +140,31 @@
                 "app_compat_overrides/net_zedge_android_flag",
                 "app_compat_overrides/org_telegram_messenger_flag",
                 "app_compat_overrides/org_zwanoo_android_speedtest_flag",
+                "app_compat_overrides/owned_change_ids",
                 "app_compat_overrides/owned_change_ids_flag",
+                "app_compat_overrides/remove_overrides",
                 "app_compat_overrides/remove_overrides_flag",
                 "app_compat_overrides/sg_bigo_live_flag",
                 "app_compat_overrides/tw_mobileapp_qrcode_banner_flag",
                 "app_compat_overrides/us_zoom_videomeetings_flag",
+                "appfunctions/execute_app_function_cancellation_timeout_millis",
+                "appfunctions/execute_app_function_timeout_millis",
                 "app_hibernation/app_hibernation_enabled",
                 "app_hibernation/app_hibernation_targets_pre_s_apps",
                 "app_hibernation/auto_revoke_check_frequency_millis",
+                "appsearch/app_function_call_timeout_millis",
+                "appsearch/contacts_indexer_enabled",
+                "app_standby/broadcast_response_fg_threshold_state",
+                "app_standby/broadcast_response_window_timeout_ms",
+                "app_standby/broadcast_sessions_duration_ms",
+                "app_standby/broadcast_sessions_with_response_duration_ms",
+                "app_standby/brodacast_response_exempted_permissions",
+                "app_standby/brodacast_response_exempted_roles",
+                "app_standby/note_response_event_for_all_broadcast_sessions",
+                "app_standby/notification_seen_duration",
                 "app_standby/notification_seen_duration_millis",
                 "app_standby/notification_seen_promoted_bucket",
+                "app_standby/retain_notification_seen_impact_for_pre_t_apps",
                 "app_standby/trigger_quota_bump_on_notification_seen",
                 "attention_manager_service/enable_flip_to_screen_off",
                 "attention_manager_service/keep_screen_on_enabled",
@@ -208,17 +173,26 @@
                 "attention_manager_service/post_dim_check_duration_millis",
                 "attention_manager_service/pre_dim_check_duration_millis",
                 "attention_manager_service/service_enabled",
-                "autofill/autofill_credential_manager_ignore_views",
                 "autofill/autofill_credential_manager_enabled",
+                "autofill/autofill_credential_manager_ignore_views",
                 "autofill/autofill_credential_manager_suppress_fill_dialog",
                 "autofill/autofill_credential_manager_suppress_save_dialog",
                 "autofill/autofill_dialog_enabled",
                 "autofill/autofill_dialog_hints",
+                "autofill/enable_relative_location_for_relayout",
+                "autofill/enable_relayout",
+                "autofill/fill_dialog_min_wait_after_animation_end_ms",
+                "autofill/fill_dialog_timeout_ms",
                 "autofill/compat_mode_allowed_packages",
+                "autofill/fill_fields_from_current_session_only",
+                "autofill/ignore_view_state_reset_to_empty",
+                "autofill/improve_fill_dialog",
                 "autofill/include_all_autofill_type_not_none_views_in_assist_structure",
                 "autofill/include_all_views_in_assist_structure",
+                "autofill/include_invisible_view_group_in_assist_structure",
                 "autofill/landscape_body_height_max_percent",
                 "autofill/legacy_augmented_autofill_mode",
+                "autofill/max_input_length_for_autofill",
                 "autofill/multiline_filter_enabled",
                 "autofill/non_autofillable_ime_action_ids",
                 "autofill/package_and_activity_allowlist_for_triggering_fill_request",
@@ -233,14 +207,27 @@
                 "autofill/trigger_fill_request_on_filtered_important_views",
                 "autofill/trigger_fill_request_on_unimportant_view",
                 "auto_pin_confirmation/enable_auto_pin_confirmation",
+                "b.b.b/c.c",
+                "backstage_power/min_consumed_power_threshold",
                 "backup_and_restore/backup_transport_callback_timeout_millis",
                 "backup_and_restore/backup_transport_callback_timeout_millis_new",
                 "backup_and_restore/backup_transport_future_timeout_millis",
                 "backup_and_restore/backup_transport_future_timeout_millis_new",
                 "backup_and_restore/full_backup_utils_route_buffer_size_bytes",
                 "backup_and_restore/full_backup_write_to_transport_buffer_size_bytes",
+                "battery_saver/enable_night_mode",
                 "battery_saver/location_mode",
+                "biometrics/biometric_strengths",
                 "biometrics/enable_biometric_property_verification",
+                "blobstore/delete_on_last_lease_delay_ms",
+                "blobstore/lease_acquisition_wait_time_ms",
+                "blobstore/max_active_sessions",
+                "blobstore/max_committed_blobs",
+                "blobstore/max_leased_blobs",
+                "blobstore/max_permitted_pks",
+                "blobstore/session_expiry_timeout_ms",
+                "blobstore/total_bytes_per_app_limit_floor",
+                "blobstore/total_bytes_per_app_limit_fraction",
                 "bluetooth/acl",
                 "bluetooth/apm_enhancement_enabled",
                 "bluetooth/bt_audio_policy_ag",
@@ -257,6 +244,7 @@
                 "bluetooth/logging_debug_enabled_for_all",
                 "bluetooth/report_delay",
                 "bluetooth/scanning",
+                "bluetooth/scan_quota_count",
                 "camera_native/sample_bool_flag",
                 "camera_native/sample_int_flag",
                 "car/bugreport_upload_destination",
@@ -273,43 +261,27 @@
                 "configuration/minimum_dpi",
                 "configuration/namespace_to_package_mapping",
                 "configuration/test_flag",
-                "configuration/test_flag",
-                "configuration/test_flag",
                 "configuration/test_flag_three",
                 "configuration/test_flag_two",
                 "configuration/version_test_flag",
-                "connectivity/actively_prefer_bad_wifi_value",
-                "connectivity/announce_interval",
-                "connectivity/automatic_enabled",
-                "connectivity/consecutive_dns_count",
-                "connectivity/first_announce_delay",
-                "connectivity/first_probe_delay",
-                "connectivity/garp_na_roaming_version",
-                "connectivity/gratuitous_na_version",
-                "connectivity/init_reboot_enabled",
-                "connectivity/init_reboot_version",
-                "connectivity/ip_conflict_detect_version",
-                "connectivity/parse_netlink_events_version",
-                "connectivity/probe_max",
-                "connectivity/probe_min",
-                "connectivity/rapid_commit_enabled",
-                "connectivity/rapid_commit_version",
-                "connectivity/reachability_mcast_resolicit_version",
-                "connectivity/restart_configuration_delay",
-                "connectivity/server_decline_version",
-                "connectivity/slow_retransmission_version",
                 "connectivity_thermal_power_manager/cellular_thermal_adaptive_thermal_status_adaptive_action_list",
                 "connectivity_thermal_power_manager/cellular_thermal_thermal_status_action_list_param",
                 "connectivity_thermal_power_manager/cellular_thermal_thermal_status_per_shutdown_action_param",
                 "constrain_display_apis/always_constrain_display_apis",
-                "constrain_display_apis/never_constrain_display_apis_all_packages",
                 "constrain_display_apis/never_constrain_display_apis",
+                "constrain_display_apis/never_constrain_display_apis_all_packages",
                 "content_capture/idle_flush_frequency",
                 "content_capture/legacy_enable_contentcapture",
                 "content_capture/logging_level",
                 "content_capture/service_explicitly_enabled",
                 "credential_manager/enable_credential_description_api",
                 "credential_manager/enable_credential_manager",
+                "DeviceConfigBootstrapValues/processed_values",
+                "device_config_overrides/namespace3:key3",
+                "device_config_overrides/namespace3:key4",
+                "device_config_overrides/namespace4:key3",
+                "device_config_overrides/namespace4:key4",
+                "device_idle/notification_allowlist_duration_ms",
                 "device_personalization_services/accel_sensor_collection_enabled",
                 "device_personalization_services/accel_sensor_enabled",
                 "device_personalization_services/accel_sensor_max_extension_millis",
@@ -364,7 +336,6 @@
                 "device_personalization_services/ambient_music_use_latest_track_offset",
                 "device_personalization_services/annotation_confidence_cutoff",
                 "device_personalization_services/app_blocklist",
-                "device_personalization_services/app_blocklist",
                 "device_personalization_services/app_prediction_active_model",
                 "device_personalization_services/app_prediction_active_predictor",
                 "device_personalization_services/app_prediction_enable_taskbar_deduping",
@@ -394,7 +365,6 @@
                 "device_personalization_services/can_use_gms_core_to_save_boarding_pass",
                 "device_personalization_services/can_use_gpay_to_save_boarding_pass",
                 "device_personalization_services/capture_interval_millis",
-                "device_personalization_services/capture_interval_millis",
                 "device_personalization_services/characterset_lang_detection_enabled",
                 "device_personalization_services/chat_translate_languages",
                 "device_personalization_services/chronicle_enabled",
@@ -478,12 +448,6 @@
                 "device_personalization_services/emergency_disable_feature_safecomm",
                 "device_personalization_services/emergency_disable_feature_smart_dictation",
                 "device_personalization_services/enable",
-                "device_personalization_services/enable",
-                "device_personalization_services/enable",
-                "device_personalization_services/enable",
-                "device_personalization_services/enable",
-                "device_personalization_services/enable",
-                "device_personalization_services/enable",
                 "device_personalization_services/enable_action_boost_generator",
                 "device_personalization_services/enable_adaptive_audio",
                 "device_personalization_services/enable_adaptive_media_volume",
@@ -505,7 +469,6 @@
                 "device_personalization_services/enable_appsearch_universal_fetcher_clock_corpus_app_srp_preview",
                 "device_personalization_services/enable_app_widget_cache",
                 "device_personalization_services/enable_assistant_geller_data_index",
-                "device_personalization_services/enable_assistant_geller_data_index",
                 "device_personalization_services/enable_assistant_memory_generator",
                 "device_personalization_services/enable_assist_parser",
                 "device_personalization_services/enable_audio_device_event_usage",
@@ -523,7 +486,6 @@
                 "device_personalization_services/enable_biasing_for_screen_context",
                 "device_personalization_services/enable_blobstore_bitmap_fetch_in_launcher",
                 "device_personalization_services/enable_brella_in_astrea",
-                "device_personalization_services/enable_brella_in_astrea",
                 "device_personalization_services/enable_call_log_signals",
                 "device_personalization_services/enable_chat_app_biasing",
                 "device_personalization_services/enable_chronicle_eventbuffer",
@@ -531,7 +493,6 @@
                 "device_personalization_services/enable_cinematic_effect",
                 "device_personalization_services/enable_cinematic_mdd",
                 "device_personalization_services/enable_clearcut_log",
-                "device_personalization_services/enable_clearcut_log",
                 "device_personalization_services/enable_clearcut_logging",
                 "device_personalization_services/enable_clipboard_entity_type_logging",
                 "device_personalization_services/enable_cloud_search",
@@ -548,11 +509,6 @@
                 "device_personalization_services/enable_covid_card_inflate_buffer",
                 "device_personalization_services/enable_cross_device_timers",
                 "device_personalization_services/enabled",
-                "device_personalization_services/enabled",
-                "device_personalization_services/enabled",
-                "device_personalization_services/enabled",
-                "device_personalization_services/enabled",
-                "device_personalization_services/enabled",
                 "device_personalization_services/enable_dark_launch_outlook_events",
                 "device_personalization_services/enable_data_capture",
                 "device_personalization_services/enable_data_fetch",
@@ -581,14 +537,12 @@
                 "device_personalization_services/enable_example_consumption_recording",
                 "device_personalization_services/enable_example_store",
                 "device_personalization_services/enable_fa",
-                "device_personalization_services/enable_fa",
                 "device_personalization_services/enable_face_detection_from_camera",
                 "device_personalization_services/enable_face_detection_when_phone_in_portrait",
                 "device_personalization_services/enable_face_only_mode",
                 "device_personalization_services/enable_fa_synthetic",
                 "device_personalization_services/enable_fedex",
                 "device_personalization_services/enable_fed_sql",
-                "device_personalization_services/enable_fed_sql",
                 "device_personalization_services/enable_feedback_ranking",
                 "device_personalization_services/enable_flight_landing_smartspace_aiai",
                 "device_personalization_services/enable_foldable_hotseat",
@@ -605,7 +559,6 @@
                 "device_personalization_services/enable_hotel_smartspace_aiai",
                 "device_personalization_services/enable_hybrid_hotseat_client",
                 "device_personalization_services/enable_image_selection",
-                "device_personalization_services/enable_image_selection",
                 "device_personalization_services/enable_image_selection_adjustments",
                 "device_personalization_services/enable_indirect_insights",
                 "device_personalization_services/enable_input_context_snapshot_capture",
@@ -683,7 +636,6 @@
                 "device_personalization_services/enable_priority_suggestion_client",
                 "device_personalization_services/enable_proactive_hints",
                 "device_personalization_services/enable_profile_signals",
-                "device_personalization_services/enable_prominent_entities",
                 "device_personalization_services/enable_proximity",
                 "device_personalization_services/enable_punctuations",
                 "device_personalization_services/enable_query_intent_bloom_filter",
@@ -750,7 +702,6 @@
                 "device_personalization_services/enable_travel_features_type_merge",
                 "device_personalization_services/enable_typing_interactions",
                 "device_personalization_services/enable_uncaught_exception_counter",
-                "device_personalization_services/enable_uncaught_exception_counter",
                 "device_personalization_services/enable_upgrade_importance",
                 "device_personalization_services/enable_uptime_logger",
                 "device_personalization_services/enable_usage_fa",
@@ -780,7 +731,6 @@
                 "device_personalization_services/fail_new_connections",
                 "device_personalization_services/fa_min_training_interval_ms",
                 "device_personalization_services/fa_population_name",
-                "device_personalization_services/fa_population_name",
                 "device_personalization_services/fast_recognition_ui_cleanup_enabled",
                 "device_personalization_services/favorites_enabled",
                 "device_personalization_services/feature_users_count_enabled",
@@ -878,12 +828,10 @@
                 "device_personalization_services/min_tc_entity_topicality",
                 "device_personalization_services/min_trained_events_to_log",
                 "device_personalization_services/min_training_interval_millis",
-                "device_personalization_services/min_training_interval_millis",
                 "device_personalization_services/min_travel_distance_meters",
                 "device_personalization_services/min_update_interval_seconds",
                 "device_personalization_services/model_url",
                 "device_personalization_services/model_version",
-                "device_personalization_services/model_version",
                 "device_personalization_services/module_enable",
                 "device_personalization_services/music_break_mode_update_policy",
                 "device_personalization_services/music_model_generate_negative_events",
@@ -901,7 +849,6 @@
                 "device_personalization_services/now_playing_allowed",
                 "device_personalization_services/nudges_amplification",
                 "device_personalization_services/num_frames",
-                "device_personalization_services/num_frames",
                 "device_personalization_services/num_simple_draws_per_job",
                 "device_personalization_services/oak_url",
                 "device_personalization_services/ocr_model_download_enabled",
@@ -918,8 +865,6 @@
                 "device_personalization_services/paired_device_low_battery_level",
                 "device_personalization_services/param",
                 "device_personalization_services/parameter",
-                "device_personalization_services/parameter",
-                "device_personalization_services/parameter",
                 "device_personalization_services/parameters",
                 "device_personalization_services/participation_window_days",
                 "device_personalization_services/pause_camera_after_screen_on_period_millis",
@@ -938,9 +883,6 @@
                 "device_personalization_services/probe_slice_id",
                 "device_personalization_services/process_seen_messages_in_message_expiring_apps",
                 "device_personalization_services/profile_app_suggestions_enable",
-                "device_personalization_services/prominent_entities_config_superpacks_url",
-                "device_personalization_services/prominent_entities_config_version",
-                "device_personalization_services/prominent_entities_enabled_packages_list",
                 "device_personalization_services/promote_sys_pointer_in_psb",
                 "device_personalization_services/proximity_configs",
                 "device_personalization_services/proximity_sensor_enabled",
@@ -1016,10 +958,8 @@
                 "device_personalization_services/should_enable_for_common_packages",
                 "device_personalization_services/show_cross_device_timer_label",
                 "device_personalization_services/show_debug_notification",
-                "device_personalization_services/show_debug_notification",
                 "device_personalization_services/show_enabled_apps_list_in_settings",
                 "device_personalization_services/show_promo_notification",
-                "device_personalization_services/show_promo_notification",
                 "device_personalization_services/show_user_settings",
                 "device_personalization_services/silent_feedback_crash_rate_percent",
                 "device_personalization_services/sim_event_screen_session_id",
@@ -1065,7 +1005,6 @@
                 "device_personalization_services/split_text_by_newline",
                 "device_personalization_services/storage_stats_log_sample_interval",
                 "device_personalization_services/superpacks_manifest_url",
-                "device_personalization_services/superpacks_manifest_url",
                 "device_personalization_services/superpacks_manifest_ver",
                 "device_personalization_services/s_upper_threshold",
                 "device_personalization_services/supported_app_packages",
@@ -1127,7 +1066,6 @@
                 "device_personalization_services/use_mdd_download_system",
                 "device_personalization_services/use_people_db_entities",
                 "device_personalization_services/user_setting_default_value",
-                "device_personalization_services/user_setting_default_value",
                 "device_personalization_services/use_silence_detector_state_bug_fix",
                 "device_personalization_services/use_translate_kit_streaming_api",
                 "device_personalization_services/use_vocab_annotator",
@@ -1142,6 +1080,7 @@
                 "device_personalization_services/wifi_predictor_weight",
                 "device_personalization_services/write_to_pfd",
                 "device_personalization_services/youtube_export_enabled",
+                "device_policy_manager/add-isfinanced-device",
                 "device_policy_manager/deprecate_usermanagerinternal_devicepolicy",
                 "device_policy_manager/enable_coexistence",
                 "device_policy_manager/enable_device_policy_engine",
@@ -1154,26 +1093,20 @@
                 "display_manager/fixed_refresh_rate_zones",
                 "display_manager/high_refresh_rate_blacklist",
                 "display_manager/peak_refresh_rate_default",
-                "exo/app_scaling_allowed_components",
-                "exo/app_streaming_allowed_components",
-                "exo/app_streaming_blocked_components",
-                "exo/app_streaming_task_navigation_allowed_components",
-                "exo/app_streaming_task_navigation_blocked_components",
-                "exo/enter_to_send_app_packages",
-                "exo/include_default_browser_in_allowed_task_navigation_components",
-                "exo/is_exo_dogfood",
-                "exo/is_exo_eng",
-                "exo/log_exo_metrics",
-                "exo/need_scale_screen",
-                "exo/show_exo_settings",
-                "exo/tile_is_available",
-                "exo/use_encrypted_transport",
-                "exo/wirecutter_start_automatically",
+                "flipendo/default_savings_mode_launch",
                 "flipendo/essential_apps",
+                "flipendo/flipendo_enabled_launch",
+                "flipendo/grayscale_enabled_launch",
+                "flipendo/is_ask_feature_enabled_launch",
+                "flipendo/lever_hotspot_enabled_launch",
+                "flipendo/lever_work_profile_enabled_launch",
+                "flipendo/resuspend_delay_minutes",
+                "flipendo/work_profile_tab_enabled",
                 "game_driver/crosshatch_blacklists",
                 "game_overlay/bubbleshooter.orig",
                 "game_overlay/com.activision.callofduty.shooter",
                 "game_overlay/com.aim.racing",
+                "game_overlay/com.android.server.cts.device.statsdatom",
                 "game_overlay/com.aniplex.fategrandorder",
                 "game_overlay/com.aniplex.twst.jp",
                 "game_overlay/com.ansangha.drdriving",
@@ -1287,6 +1220,9 @@
                 "health_connect/entry_points_enable",
                 "health_connect/exercise_routes_enable",
                 "health_connect/session_types_enable",
+                "health_fitness/enable_complete_state_change_jobs",
+                "health_fitness/enable_pause_state_change_jobs",
+                "health_fitness/enable_rate_limiter",
                 "health_fitness/exercise_routes_enable",
                 "health_fitness/session_types_enable",
                 "input_native_boot/deep_press_enabled",
@@ -1301,13 +1237,26 @@
                 "interaction_jank_monitor/trace_threshold_frame_time_millis",
                 "interaction_jank_monitor/trace_threshold_missed_frames",
                 "ipsec/config_auto_natt_keepalives_cellular_timeout_override_seconds",
+                "jobscheduler/aq_schedule_count",
+                "jobscheduler/aq_schedule_return_failure",
+                "jobscheduler/aq_schedule_throw_exception",
+                "jobscheduler/aq_schedule_window_ms",
+                "jobscheduler/conn_transport_batch_threshold",
+                "jobscheduler/enable_api_quotas",
+                "jobscheduler/fc_applied_constraints",
+                "jobscheduler/min_ready_cpu_only_jobs_count",
+                "jobscheduler/min_ready_non_active_jobs_count",
+                "jobscheduler/qc_allowed_time_per_period_rare_ms",
+                "jobscheduler/qc_max_session_count_restricted",
+                "jobscheduler/qc_timing_session_coalescing_duration_ms",
+                "jobscheduler/runtime_min_ej_guarantee_ms",
                 "kiwi/enable_remapping_by_inputsdk_version",
                 "kiwi/input_remapping_blocklist",
                 "latency_tracker/action_request_ime_shown_enable",
+                "latency_tracker/action_show_selection_toolbar_enable",
                 "latency_tracker/action_show_voice_interaction_enable",
                 "latency_tracker/action_show_voice_interaction_sample_interval",
                 "latency_tracker/action_show_voice_interaction_trace_threshold",
-                "latency_tracker/action_show_selection_toolbar_enable",
                 "latency_tracker/action_user_switch_enable",
                 "latency_tracker/enabled",
                 "latency_tracker/sampling_interval",
@@ -1324,10 +1273,6 @@
                 "latency_tracker/trigger_action_toggle_recents",
                 "latency_tracker/trigger_action_turn_on_screen",
                 "launcher/enabled",
-                "launcher/enabled",
-                "launcher/enabled",
-                "launcher/enabled",
-                "launcher/enabled",
                 "launcher/enable_ime_latency_logger",
                 "launcher/enable_impression_logging",
                 "launcher/enable_keyboard_transition_sync",
@@ -1337,7 +1282,6 @@
                 "launcher/inject_web_top",
                 "launcher_lily/enable_camera_block",
                 "launcher_lily/enable_feature",
-                "launcher_lily/enable_feature",
                 "launcher_lily/enable_files_block",
                 "launcher_lily/enable_rani_block",
                 "launcher/match_state_charlen",
@@ -1350,12 +1294,12 @@
                 "launcher/show_search_educard_qsb",
                 "launcher/use_app_search_for_web",
                 "launcher/use_fallback_app_search",
-                "low_power_standby/enable_policy",
-                "low_power_standby/enable_standby_ports",
                 "lmkd_native/thrashing_limit_critical",
                 "location/adas_settings_allowlist",
                 "location/enable_location_provider_manager_msl",
                 "location/ignore_settings_allowlist",
+                "low_power_standby/enable_policy",
+                "low_power_standby/enable_standby_ports",
                 "media_better_together/scanning_package_minimum_importance",
                 "media/media_metrics_mode",
                 "media/player_metrics_app_allowlist",
@@ -1366,39 +1310,22 @@
                 "media/player_metrics_per_app_user_media_activity_blocklist",
                 "media/player_metrics_per_app_use_time_allowlist",
                 "media/player_metrics_per_app_use_time_blocklist",
+                "mediaprovider/allowed_cloud_providers",
+                "mediaprovider/cloud_media_feature_enabled",
+                "mediaprovider/picker_pick_images_preload_selected",
                 "memory_safety_native_boot/bootloader_override",
                 "mglru_native/lru_gen_config",
-                "namespace/key",
                 "namespace1/key1",
                 "namespace1/key2",
                 "namespace1/key3",
+                "namespace1/key_non_existing",
                 "namespace2/key1",
                 "namespace2/key2",
                 "namespace2/key3",
-                "nearby/enable_presence_broadcast_legacy",
-                "nearby/fast_pair_aosp_enabled",
-                "nearby/nano_app_min_version",
-                "nearby/support_test_app",
-                "netd_native/cache_size",
-                "netd_native/dnsevent_subsampling",
-                "netd_native/doh_early_data",
-                "netd_native/doh_session_resumption",
-                "netd_native/dot_connect_timeout",
-                "netd_native/dot_maxtries",
-                "netd_native/dot_query_timeout",
-                "netd_native/dot_revalidation_threshold",
-                "netd_native/dot_xport_unusable_threshold",
-                "netd_native/enable_async_dot",
-                "netd_native/enable_doh",
-                "netd_native/enable_keep_listening_udp",
-                "netd_native/enable_parallel_lookup",
-                "netd_native/enable_server_selection",
-                "netd_native/latency_factor",
-                "netd_native/latency_offset_ms",
-                "netd_native/limiter",
-                "netd_native/parallel_lookup_sleep_time_millis",
-                "netd_native/retransmit_interval",
-                "netd_native/retransmit_retries",
+                "namespace3/key3",
+                "namespace3/key4",
+                "namespace4/key4",
+                "namespace/key",
                 "nnapi_native/current_feature_level",
                 "nnapi_native/telemetry_enable",
                 "notification_assistant/generate_actions",
@@ -1436,29 +1363,43 @@
                 "odad/scan_least_scanned",
                 "odad/sw_scn",
                 "odad/westworld_logging",
+                "ondeviceintelligence/service_enabled",
                 "oslo/mcc_whitelist",
                 "oslo/media_app_whitelist",
                 "ota/enable_server_based_ror",
+                "ota/server_based_ror_enabled",
                 "ota/wait_for_internet_ror",
-                "package_manager_service/MinInstallableTargetSdk__install_block_enabled",
-                "package_manager_service/MinInstallableTargetSdk__install_block_strict_mode_enabled",
-                "package_manager_service/MinInstallableTargetSdk__min_installable_target_sdk",
+                "package_manager_service/deferred_no_kill_post_delete_delay_ms_extended",
                 "package_manager_service/dormant_app_threshold_days",
                 "package_manager_service/downgrade_unused_apps_enabled",
                 "package_manager_service/inactive_app_threshold_days",
                 "package_manager_service/incfs_default_timeouts",
                 "package_manager_service/install_block_enabled",
                 "package_manager_service/install_block_strict_mode_enabled",
+                "package_manager_service/is_preapproval_available",
+                "package_manager_service/is_update_ownership_enforcement_available",
                 "package_manager_service/known_digesters_list",
                 "package_manager_service/low_storage_threshold_multiplier_for_downgrade",
                 "package_manager_service/min_installable_target_sdk",
+                "package_manager_service/MinInstallableTargetSdk__install_block_enabled",
+                "package_manager_service/MinInstallableTargetSdk__install_block_strict_mode_enabled",
+                "package_manager_service/MinInstallableTargetSdk__min_installable_target_sdk",
                 "package_manager_service/strict_mode_target_sdk",
+                "package_manager_service/verification_request_timeout_millis",
+                "package_manager_service/verifier_connection_timeout_millis",
                 "permissions/auto_revoke_check_frequency_millis",
+                "permissions/auto_revoke_unused_threshold_millis2",
+                "permissions/one_time_permissions_killed_delay_millis",
+                "permissions/one_time_permissions_timeout_millis",
                 "permissions/permission_changes_store_exact_time",
                 "privacy/bg_location_check_is_enabled",
                 "privacy/camera_mic_icons_enabled",
                 "privacy/camera_toggle_enabled",
                 "privacy/data_sharing_update_period_millis",
+                "privacy/discrete_history_cutoff_millis",
+                "privacy/discrete_history_op_flags",
+                "privacy/discrete_history_ops_cslist",
+                "privacy/discrete_history_quantization_millis",
                 "privacy/location_access_check_delay_millis",
                 "privacy/location_access_check_periodic_interval_millis",
                 "privacy/location_indicators_enabled",
@@ -1467,48 +1408,93 @@
                 "privacy/max_safety_labels_persisted_per_app",
                 "privacy/mic_toggle_enabled",
                 "privacy/notification_listener_check_enabled",
-                "privacy/param",
-                "privacy/param",
-                "privacy/param",
+                "privacy/notification_listener_check_interval_millis",
                 "privacy/param",
                 "privacy/permission_rationale_enabled",
                 "privacy/permissions_hub_subattribution_enabled",
+                "privacy/photo_picker_prompt_enabled",
                 "privacy/placeholder_safety_label_updates_enabled",
                 "privacy/privacy_attribution_tag_full_log_enabled",
                 "privacy/privacy_dashboard_7_day_toggle",
                 "privacy/privacy_hub_enabled",
                 "privacy/privacy_placeholder_safety_label_data_enabled",
+                "privacy/safety_center_actions_to_override_with_default_intent",
+                "privacy/safety_center_additional_allow_package_certs",
+                "privacy/safety_center_allow_statsd_logging",
                 "privacy/safety_center_background_refresh_denied_sources",
                 "privacy/safety_center_background_refresh_is_enabled",
                 "privacy/safety_center_background_requires_charging",
+                "privacy/safety_center_hide_resolved_ui_transition_delay_millis",
                 "privacy/safety_center_is_enabled",
                 "privacy/safety_center_issue_category_allowlists",
+                "privacy/safety_center_notification_resurface_interval",
                 "privacy/safety_center_notifications_allowed_sources",
                 "privacy/safety_center_notifications_enabled",
                 "privacy/safety_center_notifications_immediate_behavior_issues",
                 "privacy/safety_center_notifications_min_delay",
                 "privacy/safety_center_override_refresh_on_page_open_sources",
                 "privacy/safety_center_periodic_background_interval_millis",
+                "privacy/safety_center_qs_tile_component_setting_flags",
                 "privacy/safety_center_refresh_fgs_allowlist_duration_millis",
                 "privacy/safety_center_refresh_sources_timeouts_millis",
+                "privacy/safety_center_replace_lock_screen_icon_action",
                 "privacy/safety_center_resolve_action_timeout_millis",
                 "privacy/safety_center_resurface_issue_delays_millis",
                 "privacy/safety_center_resurface_issue_max_counts",
                 "privacy/safety_center_show_subpages",
+                "privacy/safety_center_temp_hidden_issue_resurface_delay_millis",
                 "privacy/safety_center_untracked_sources",
-                "privacy/safety_protection_enabled",
                 "privacy/safety_label_change_notifications_enabled",
                 "privacy/safety_label_changes_job_interval_millis",
+                "privacy/safety_protection_enabled",
+                "privacy/sc_accessibility_job_interval_millis",
                 "privacy/sc_accessibility_listener_enabled",
                 "profcollect_native_boot/enable",
+                "profiling/cost_heap_profile",
+                "profiling/cost_java_heap_dump",
+                "profiling/cost_stack_sampling",
+                "profiling/cost_system_trace",
+                "profiling/heap_profile_duration_ms_default",
+                "profiling/heap_profile_duration_ms_max",
+                "profiling/heap_profile_duration_ms_min",
+                "profiling/java_heap_dump_data_source_stop_timeout_ms_default",
+                "profiling/java_heap_dump_duration_ms_default",
+                "profiling/killswitch_heap_profile",
+                "profiling/killswitch_java_heap_dump",
+                "profiling/killswitch_stack_sampling",
+                "profiling/killswitch_system_trace",
+                "profiling/max_cost_process_1_hour",
+                "profiling/max_cost_process_24_hour",
+                "profiling/max_cost_process_7_day",
+                "profiling/max_cost_system_1_hour",
+                "profiling/max_cost_system_24_hour",
+                "profiling/max_cost_system_7_day",
+                "profiling/max_result_redelivery_count",
+                "profiling/persist_queue_to_disk_frequency_ms",
+                "profiling/persist_to_disk_frequency_ms",
+                "profiling/stack_sampling_duration_ms_default",
+                "profiling/stack_sampling_duration_ms_max",
+                "profiling/stack_sampling_duration_ms_min",
+                "profiling/system_trace_duration_ms_default",
+                "profiling/system_trace_duration_ms_max",
+                "profiling/system_trace_duration_ms_min",
+                "profiling_testing/rate_limiter.disabled",
+                "reboot_readiness/active_polling_interval_ms",
+                "reboot_readiness/alarm_clock_threshold_ms",
+                "reboot_readiness/disable_app_activity_check",
+                "reboot_readiness/disable_interactivity_check",
+                "reboot_readiness/disable_subsystems_check",
+                "reboot_readiness/interactivity_threshold_ms",
+                "reboot_readiness/logging_blocking_entity_threshold_ms",
                 "remote_key_provisioning_native/enable_rkpd",
+                "repair_mode/userdata_size_gb",
+                "rollback_boot/rollback_lifetime_in_millis",
                 "rollback/containing",
                 "rollback/enable_rollback_timeout",
                 "rollback/watchdog_explicit_health_check_enabled",
                 "rollback/watchdog_request_timeout_millis",
                 "rollback/watchdog_trigger_failure_count",
                 "rollback/watchdog_trigger_failure_duration_millis",
-                "rollback_boot/rollback_lifetime_in_millis",
                 "rotation_resolver/service_enabled",
                 "runtime_native_boot/blacklisted_packages",
                 "runtime_native_boot/disable_lock_profiling",
@@ -1538,18 +1524,12 @@
                 "runtime_native/usap_pool_size_min",
                 "runtime_native/use_app_image_startup_cache",
                 "settings_stats/boolean_whitelist",
-                "settings_stats/boolean_whitelist",
-                "settings_stats/boolean_whitelist",
                 "settings_stats/float_whitelist",
-                "settings_stats/float_whitelist",
-                "settings_stats/float_whitelist",
+                "settings_stats/GlobalFeature__integer_whitelist",
                 "settings_stats/integer_whitelist",
-                "settings_stats/integer_whitelist",
-                "settings_stats/integer_whitelist",
-                "settings_stats/string_whitelist",
-                "settings_stats/string_whitelist",
                 "settings_stats/string_whitelist",
                 "statsd_java/include_certificate_hash",
+                "statsd_java/use_file_descriptor",
                 "statsd_native/app_upgrade_bucket_split",
                 "statsd_native_boot/aggregate_atoms",
                 "statsd_native_boot/enable_restricted_metrics",
@@ -1560,6 +1540,8 @@
                 "storage_native_boot/allowed_cloud_providers",
                 "storage_native_boot/anr_delay_millis",
                 "storage_native_boot/anr_delay_notify_external_storage_service",
+                "storage_native_boot/cache_reserve_percent_high",
+                "storage_native_boot/cache_reserve_percent_low",
                 "storage_native_boot/charging_required",
                 "storage_native_boot/cloud_media_enforce_provider_allowlist",
                 "storage_native_boot/cloud_media_feature_enabled",
@@ -1582,12 +1564,12 @@
                 "storage_native_boot/transcode_compat_stale",
                 "storage_native_boot/transcode_default",
                 "storage_native_boot/transcode_enabled",
+                "storage/pickerdb.default_sync_delay_ms",
                 "surface_flinger_native_boot/adpf_cpu_hint",
                 "surface_flinger_native_boot/demo_flag",
                 "surface_flinger_native_boot/max_frame_buffer_acquired_buffers",
                 "surface_flinger_native_boot/use_skia_tracing",
                 "system_scheduler/dummy_flag",
-                "system_scheduler/dummy_flag",
                 "system_scheduler/enable_fast_metrics_collection",
                 "system_scheduler/location_mode",
                 "system_time/enhanced_metrics_collection_enabled",
@@ -1605,6 +1587,7 @@
                 "system_time/time_detector_origin_priorities_override",
                 "system_time/time_zone_detector_auto_detection_enabled_default",
                 "system_time/time_zone_detector_telephony_fallback_supported",
+                "systemui/android.app.visit_person_uri",
                 "systemui/apply_sharing_app_limits_in_sysui",
                 "systemui/back_gesture_ml_name",
                 "systemui/back_gesture_ml_threshold",
@@ -1613,8 +1596,6 @@
                 "systemui/duration_per_px_fast",
                 "systemui/duration_per_px_regular",
                 "systemui/enabled",
-                "systemui/enabled",
-                "systemui/enabled",
                 "systemui/enable_notification_memory_monitoring",
                 "systemui/enable_screenshot_corner_flow",
                 "systemui/enable_screenshot_notification_smart_actions",
@@ -1622,6 +1603,8 @@
                 "systemui/exp_flag_release",
                 "systemui/fade_in_duration",
                 "systemui/generate_actions",
+                "systemui/generated_preview_api_max_calls_per_interval",
+                "systemui/generated_preview_api_reset_interval_ms",
                 "systemui/generate_replies",
                 "systemui/is_nearby_share_first_target_in_ranked_app",
                 "systemui/learn_count",
@@ -1634,6 +1617,10 @@
                 "systemui/max_total_duration",
                 "systemui/min_num_sys_gen_replies",
                 "systemui/min_total_duration",
+                "systemui/nas_generate_actions",
+                "systemui/nas_generate_replies",
+                "systemui/nas_max_messages_to_extract",
+                "systemui/nas_max_suggestions",
                 "systemui/predict_using_people_service_share",
                 "systemui/replies_require_targeting_p",
                 "systemui/scanner_activity_name",
@@ -1665,36 +1652,33 @@
                 "telephony/anomaly_setup_data_call_failure",
                 "telephony/auto_data_switch_availability_stability_time_threshold",
                 "telephony/auto_data_switch_validation_max_retry",
+                "telephony/enable_logcat_collection_for_emergency_call_diagnostics",
                 "telephony/enable_new_data_stack",
                 "telephony/enable_slicing_upsell",
                 "telephony/enable_subscription_manager_service",
+                "telephony/enable_telecom_dump_collection_for_emergency_call_diagnostics",
+                "telephony/enable_telephony_dump_collection_for_emergency_call_diagnostics",
                 "telephony/enable_work_profile_telephony",
                 "telephony/erase_modem_config",
                 "telephony/is_telephony_anomaly_report_enabled",
                 "telephony/ramping_ringer_duration",
                 "telephony/ramping_ringer_enabled",
                 "telephony/ramping_ringer_vibration_duration",
-                "testspace/flagname",
+                "test_od_namespace/key1",
                 "testspace/another",
-                "tethering/enable_java_bpf_map",
+                "testspace/flagname",
                 "textclassifier/ar_manifest",
                 "textclassifier/da_manifest",
                 "textclassifier/de_ch_manifest",
                 "textclassifier/de_li_manifest",
                 "textclassifier/de_manifest",
-                "textclassifier/de_manifest",
-                "textclassifier/en_manifest",
                 "textclassifier/en_manifest",
                 "textclassifier/es_manifest",
-                "textclassifier/es_manifest",
-                "textclassifier/fr_manifest",
                 "textclassifier/fr_manifest",
                 "textclassifier/generate_links_max_text_length",
                 "textclassifier/it_manifest",
-                "textclassifier/it_manifest",
                 "textclassifier/ja_manifest",
-                "textclassifier/ja_manifest",
-                "textclassifier/ko_manifest",
+                "textclassifier/key",
                 "textclassifier/ko_manifest",
                 "textclassifier/local_textclassifier_enabled",
                 "textclassifier/manifest_download_max_attempts",
@@ -1713,15 +1697,13 @@
                 "textclassifier/ru_manifest",
                 "textclassifier/sv_manifest",
                 "textclassifier/system_textclassifier_api_timeout_in_second",
+                "textclassifier/system_textclassifier_enabled",
                 "textclassifier/textclassifier_service_package_override",
                 "textclassifier/th_manifest",
                 "textclassifier/tr_manifest",
                 "textclassifier/universal_manifest",
-                "textclassifier/universal_manifest",
-                "textclassifier/universal_manifest",
                 "textclassifier/zh_hant_manifest",
                 "textclassifier/zh_manifest",
-                "textclassifier/zh_manifest",
                 "tv_hdr_output_control/enable_hdr_output_control",
                 "uwb/device_error_bugreport_enabled",
                 "vendor_system_native/background_cpuset",
@@ -1730,10 +1712,11 @@
                 "vendor_system_native/foreground_cpuset",
                 "vendor_system_native/restricted_cpuset",
                 "virtualization_framework_native/isolated_compilation_enabled",
+                "voice_interaction/restart_period_in_seconds",
                 "vpn/enable_pixel_ppn_feature",
                 "wallpaper_content/enabled",
-                "wearable_sensing/service_enabled_platforms",
                 "wearable_sensing/service_enabled",
+                "wearable_sensing/service_enabled_platforms",
                 "wear/ambient_auto_resume_timeout_max_reset_count",
                 "wear/bedtime_hard_mode_feature_enabled",
                 "wear/enable_backup_service_in_wear_framework",
@@ -1787,6 +1770,7 @@
                 "wifi/software_pno_enabled",
                 "wifi/stationary_scan_rssi_valid_time_ms",
                 "wifi/wfd_failure_bugreport_enabled",
+                "window_manager/ActivitySecurity__asm_restrictions_enabled",
                 "window_manager/asm_exempted_packages",
                 "window_manager/asm_restrictions_enabled",
                 "window_manager/asm_toasts_enabled",
@@ -1807,6 +1791,7 @@
                 "window_manager/rotation_resolver_timeout_millis",
                 "window_manager/screen_record_enterprise_policies",
                 "window_manager/single_use_token",
-                "window_manager/splash_screen_exception_list"
+                "window_manager/splash_screen_exception_list",
+                "wrong/nas_generate_replies"
             ));
 }
diff --git a/framework/java/android/provider/WritableNamespaces.java b/framework/java/android/provider/WritableNamespaces.java
new file mode 100644
index 0000000..e3ea00b
--- /dev/null
+++ b/framework/java/android/provider/WritableNamespaces.java
@@ -0,0 +1,51 @@
+/*
+ * 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.
+ */
+
+package android.provider;
+
+import android.ravenwood.annotation.RavenwoodKeepWholeClass;
+import android.util.ArraySet;
+
+import java.util.Arrays;
+import java.util.Set;
+
+/**
+ * Contains the list of namespaces in which any flag can be written by adb without root
+ * permissions.
+ * <p>
+ * A security review is required for any namespace that's added to this list. To add to
+ * the list, create a change and tag the OWNER. In the commit message, include a
+ * description of the flag's functionality, and a justification for why it needs to be
+ * allowlisted.
+ * @hide
+ */
+@RavenwoodKeepWholeClass
+final class WritableNamespaces {
+    public static final Set<String> ALLOWLIST =
+            new ArraySet<String>(Arrays.asList(
+                    "adservices",
+                    "captive_portal_login",
+                    "connectivity",
+                    "exo",
+                    "nearby",
+                    "netd_native",
+                    "network_security",
+                    "on_device_personalization",
+                    "tethering",
+                    "tethering_u_or_later_native",
+                    "thread_network"
+            ));
+}
diff --git a/service/javatests/src/com/android/server/deviceconfig/DeviceConfigBootstrapValuesTest.java b/service/javatests/src/com/android/server/deviceconfig/DeviceConfigBootstrapValuesTest.java
index 9d77e8c..b804ad0 100644
--- a/service/javatests/src/com/android/server/deviceconfig/DeviceConfigBootstrapValuesTest.java
+++ b/service/javatests/src/com/android/server/deviceconfig/DeviceConfigBootstrapValuesTest.java
@@ -40,6 +40,9 @@
     private static final String WRITE_DEVICE_CONFIG_PERMISSION =
             "android.permission.WRITE_DEVICE_CONFIG";
 
+    private static final String WRITE_ALLOWLISTED_DEVICE_CONFIG_PERMISSION =
+            "android.permission.WRITE_ALLOWLISTED_DEVICE_CONFIG";
+
     private static final String READ_DEVICE_CONFIG_PERMISSION =
             "android.permission.READ_DEVICE_CONFIG";
 
@@ -49,7 +52,8 @@
     public void assertParsesFiles() throws IOException {
         assumeTrue(SdkLevel.isAtLeastV());
         InstrumentationRegistry.getInstrumentation().getUiAutomation().adoptShellPermissionIdentity(
-                WRITE_DEVICE_CONFIG_PERMISSION, READ_DEVICE_CONFIG_PERMISSION);
+                WRITE_DEVICE_CONFIG_PERMISSION, WRITE_ALLOWLISTED_DEVICE_CONFIG_PERMISSION,
+                READ_DEVICE_CONFIG_PERMISSION);
 
         DeviceConfigBootstrapValues values = new DeviceConfigBootstrapValues(PATH_1);
         values.applyValuesIfNeeded();
diff --git a/service/javatests/src/com/android/server/deviceconfig/DeviceConfigTest.java b/service/javatests/src/com/android/server/deviceconfig/DeviceConfigTest.java
index a32e131..1956c79 100644
--- a/service/javatests/src/com/android/server/deviceconfig/DeviceConfigTest.java
+++ b/service/javatests/src/com/android/server/deviceconfig/DeviceConfigTest.java
@@ -15,6 +15,9 @@
  */
 package com.android.server.deviceconfig;
 
+import static org.junit.Assert.assertThrows;
+
+import android.os.ParcelFileDescriptor;
 import android.platform.test.annotations.RequiresFlagsEnabled;
 import android.platform.test.flag.junit.CheckFlagsRule;
 import android.platform.test.flag.junit.DeviceFlagsValueProvider;
@@ -41,6 +44,7 @@
     private static final String NAMESPACE_B = "B Space has no name";
 
     private static final String DUMP_PREFIX = "..";
+    private static final String[] DUMP_NO_ARGS = null;
 
     @Rule public final Expect expect = Expect.create();
     @Rule public final CheckFlagsRule checkFlagsRule =
@@ -48,6 +52,15 @@
 
     @Test
     @RequiresFlagsEnabled(Flags.FLAG_DUMP_IMPROVEMENTS)
+    public void testDump_nullPrintWriter() throws Exception {
+        try (ParcelFileDescriptor fd = ParcelFileDescriptor.createPipe()[0]) {
+            assertThrows(NullPointerException.class, () ->
+                    DeviceConfig.dump(/* printWriter= */ null, DUMP_PREFIX, DUMP_NO_ARGS));
+        }
+    }
+
+    @Test
+    @RequiresFlagsEnabled(Flags.FLAG_DUMP_IMPROVEMENTS)
     public void testDump_empty() throws Exception {
         String dump = dump();
 
@@ -90,7 +103,7 @@
         try (StringWriter sw = new StringWriter()) {
             PrintWriter pw = new PrintWriter(sw);
 
-            DeviceConfig.dump(/* fd= */ null, pw, DUMP_PREFIX, args);
+            DeviceConfig.dump(pw, DUMP_PREFIX, args);
 
             pw.flush();
             String dump = sw.toString();