Loading Android.bp +1 −0 Original line number Diff line number Diff line Loading @@ -427,6 +427,7 @@ java_defaults { "modules-utils-expresslog", "perfetto_trace_javastream_protos_jarjar", "libaconfig_java_proto_nano", "aconfig_device_paths_java", ], } Loading core/java/com/android/internal/pm/pkg/component/AconfigFlags.java +24 −7 Original line number Diff line number Diff line Loading @@ -18,6 +18,7 @@ package com.android.internal.pm.pkg.component; import static com.android.internal.pm.pkg.parsing.ParsingUtils.ANDROID_RES_NAMESPACE; import android.aconfig.DevicePaths; import android.aconfig.nano.Aconfig; import android.aconfig.nano.Aconfig.parsed_flag; import android.aconfig.nano.Aconfig.parsed_flags; Loading @@ -40,7 +41,6 @@ import org.xmlpull.v1.XmlPullParserException; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.util.List; import java.util.Map; /** Loading @@ -54,20 +54,20 @@ import java.util.Map; public class AconfigFlags { private static final String LOG_TAG = "AconfigFlags"; private static final List<String> sTextProtoFilesOnDevice = List.of( "/system/etc/aconfig_flags.pb", "/system_ext/etc/aconfig_flags.pb", "/product/etc/aconfig_flags.pb", "/vendor/etc/aconfig_flags.pb"); public enum Permission { READ_WRITE, READ_ONLY } private final ArrayMap<String, Boolean> mFlagValues = new ArrayMap<>(); private final ArrayMap<String, Permission> mFlagPermissions = new ArrayMap<>(); public AconfigFlags() { if (!Flags.manifestFlagging()) { Slog.v(LOG_TAG, "Feature disabled, skipped all loading"); return; } for (String fileName : sTextProtoFilesOnDevice) { for (String fileName : DevicePaths.parsedFlagsProtoPaths()) { try (var inputStream = new FileInputStream(fileName)) { loadAconfigDefaultValues(inputStream.readAllBytes()); } catch (IOException e) { Loading Loading @@ -184,6 +184,12 @@ public class AconfigFlags { Slog.v(LOG_TAG, "Read Aconfig default flag value " + flagPackageAndName + " = " + flagValue); mFlagValues.put(flagPackageAndName, flagValue); Permission permission = flag.permission == Aconfig.READ_ONLY ? Permission.READ_ONLY : Permission.READ_WRITE; mFlagPermissions.put(flagPackageAndName, permission); } } Loading @@ -199,6 +205,17 @@ public class AconfigFlags { return value; } /** * Get the flag permission, or null if the flag doesn't exist. * @param flagPackageAndName Full flag name formatted as 'package.flag' * @return the current permission of the given Aconfig flag, or null if there is no such flag */ @Nullable public Permission getFlagPermission(@NonNull String flagPackageAndName) { Permission permission = mFlagPermissions.get(flagPackageAndName); return permission; } /** * Check if the element in {@code parser} should be skipped because of the feature flag. * @param parser XML parser object currently parsing an element Loading packages/SettingsProvider/src/com/android/providers/settings/DeviceConfigService.java +8 −1 Original line number Diff line number Diff line Loading @@ -42,6 +42,7 @@ import android.provider.Settings.Config.SyncDisabledMode; import android.provider.UpdatableDeviceConfigServiceReadiness; import android.util.Slog; import com.android.internal.pm.pkg.component.AconfigFlags; import com.android.internal.util.FastPrintWriter; import java.io.File; Loading Loading @@ -416,7 +417,13 @@ public final class DeviceConfigService extends Binder { DeviceConfig.setProperty(namespace, key, value, makeDefault); break; case OVERRIDE: AconfigFlags.Permission permission = (new AconfigFlags()).getFlagPermission(key); if (permission == AconfigFlags.Permission.READ_ONLY) { pout.println("cannot override read-only flag " + key); } else { DeviceConfig.setLocalOverride(namespace, key, value); } break; case CLEAR_OVERRIDE: DeviceConfig.clearLocalOverride(namespace, key); Loading Loading
Android.bp +1 −0 Original line number Diff line number Diff line Loading @@ -427,6 +427,7 @@ java_defaults { "modules-utils-expresslog", "perfetto_trace_javastream_protos_jarjar", "libaconfig_java_proto_nano", "aconfig_device_paths_java", ], } Loading
core/java/com/android/internal/pm/pkg/component/AconfigFlags.java +24 −7 Original line number Diff line number Diff line Loading @@ -18,6 +18,7 @@ package com.android.internal.pm.pkg.component; import static com.android.internal.pm.pkg.parsing.ParsingUtils.ANDROID_RES_NAMESPACE; import android.aconfig.DevicePaths; import android.aconfig.nano.Aconfig; import android.aconfig.nano.Aconfig.parsed_flag; import android.aconfig.nano.Aconfig.parsed_flags; Loading @@ -40,7 +41,6 @@ import org.xmlpull.v1.XmlPullParserException; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.util.List; import java.util.Map; /** Loading @@ -54,20 +54,20 @@ import java.util.Map; public class AconfigFlags { private static final String LOG_TAG = "AconfigFlags"; private static final List<String> sTextProtoFilesOnDevice = List.of( "/system/etc/aconfig_flags.pb", "/system_ext/etc/aconfig_flags.pb", "/product/etc/aconfig_flags.pb", "/vendor/etc/aconfig_flags.pb"); public enum Permission { READ_WRITE, READ_ONLY } private final ArrayMap<String, Boolean> mFlagValues = new ArrayMap<>(); private final ArrayMap<String, Permission> mFlagPermissions = new ArrayMap<>(); public AconfigFlags() { if (!Flags.manifestFlagging()) { Slog.v(LOG_TAG, "Feature disabled, skipped all loading"); return; } for (String fileName : sTextProtoFilesOnDevice) { for (String fileName : DevicePaths.parsedFlagsProtoPaths()) { try (var inputStream = new FileInputStream(fileName)) { loadAconfigDefaultValues(inputStream.readAllBytes()); } catch (IOException e) { Loading Loading @@ -184,6 +184,12 @@ public class AconfigFlags { Slog.v(LOG_TAG, "Read Aconfig default flag value " + flagPackageAndName + " = " + flagValue); mFlagValues.put(flagPackageAndName, flagValue); Permission permission = flag.permission == Aconfig.READ_ONLY ? Permission.READ_ONLY : Permission.READ_WRITE; mFlagPermissions.put(flagPackageAndName, permission); } } Loading @@ -199,6 +205,17 @@ public class AconfigFlags { return value; } /** * Get the flag permission, or null if the flag doesn't exist. * @param flagPackageAndName Full flag name formatted as 'package.flag' * @return the current permission of the given Aconfig flag, or null if there is no such flag */ @Nullable public Permission getFlagPermission(@NonNull String flagPackageAndName) { Permission permission = mFlagPermissions.get(flagPackageAndName); return permission; } /** * Check if the element in {@code parser} should be skipped because of the feature flag. * @param parser XML parser object currently parsing an element Loading
packages/SettingsProvider/src/com/android/providers/settings/DeviceConfigService.java +8 −1 Original line number Diff line number Diff line Loading @@ -42,6 +42,7 @@ import android.provider.Settings.Config.SyncDisabledMode; import android.provider.UpdatableDeviceConfigServiceReadiness; import android.util.Slog; import com.android.internal.pm.pkg.component.AconfigFlags; import com.android.internal.util.FastPrintWriter; import java.io.File; Loading Loading @@ -416,7 +417,13 @@ public final class DeviceConfigService extends Binder { DeviceConfig.setProperty(namespace, key, value, makeDefault); break; case OVERRIDE: AconfigFlags.Permission permission = (new AconfigFlags()).getFlagPermission(key); if (permission == AconfigFlags.Permission.READ_ONLY) { pout.println("cannot override read-only flag " + key); } else { DeviceConfig.setLocalOverride(namespace, key, value); } break; case CLEAR_OVERRIDE: DeviceConfig.clearLocalOverride(namespace, key); Loading