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();