Loading core/java/com/android/internal/pm/pkg/component/AconfigFlags.java +15 −0 Original line number Diff line number Diff line Loading @@ -226,6 +226,21 @@ public class AconfigFlags { } private Boolean getFlagValueFromNewStorage(String flagPackageAndName) { // We still need to check mFlagValues in case addFlagValuesForTesting() was called for // testing purposes. if (!mFlagValues.isEmpty() && mFlagValues.containsKey(flagPackageAndName)) { Boolean value = mFlagValues.get(flagPackageAndName); if (DEBUG) { Slog.v( LOG_TAG, "Aconfig flag value (FOR TESTING) for " + flagPackageAndName + " = " + value); } return value; } int index = flagPackageAndName.lastIndexOf('.'); if (index < 0) { Slog.e(LOG_TAG, "Unable to parse package name from " + flagPackageAndName); Loading services/tests/PackageManagerServiceTests/server/src/com/android/server/pm/PackageParserTest.java +42 −1 Original line number Diff line number Diff line Loading @@ -65,10 +65,13 @@ import android.content.pm.SigningDetails; import android.os.Bundle; import android.os.Parcel; import android.os.Parcelable; import android.platform.test.annotations.DisableFlags; import android.platform.test.annotations.EnableFlags; import android.platform.test.annotations.Presubmit; import android.platform.test.annotations.RequiresFlagsEnabled; import android.platform.test.flag.junit.CheckFlagsRule; import android.platform.test.flag.junit.DeviceFlagsValueProvider; import android.platform.test.flag.junit.SetFlagsRule; import android.util.ArraySet; import androidx.annotation.Nullable; Loading Loading @@ -150,6 +153,9 @@ public class PackageParserTest { @Rule public final CheckFlagsRule mCheckFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule(); @Rule public final SetFlagsRule mSetFlagsRule = new SetFlagsRule(); private File mTmpDir; private static final File FRAMEWORK = new File("/system/framework/framework-res.apk"); private static final String TEST_APP1_APK = "PackageParserTestApp1.apk"; Loading Loading @@ -846,7 +852,42 @@ public class PackageParserTest { @Test @RequiresFlagsEnabled(android.content.res.Flags.FLAG_MANIFEST_FLAGGING) public void testParseWithFeatureFlagAttributes() throws Exception { @DisableFlags(android.content.res.Flags.FLAG_USE_NEW_ACONFIG_STORAGE) public void testParseWithFeatureFlagAttributes_oldStorage() throws Exception { final File testFile = extractFile(TEST_APP8_APK); try (PackageParser2 parser = new TestPackageParser2()) { Map<String, Boolean> flagValues = new HashMap<>(); flagValues.put("my.flag1", true); flagValues.put("my.flag2", false); flagValues.put("my.flag3", false); flagValues.put("my.flag4", true); ParsingPackageUtils.getAconfigFlags().addFlagValuesForTesting(flagValues); // The manifest has: // <permission android:name="PERM1" android:featureFlag="my.flag1 " /> // <permission android:name="PERM2" android:featureFlag=" !my.flag2" /> // <permission android:name="PERM3" android:featureFlag="my.flag3" /> // <permission android:name="PERM4" android:featureFlag="!my.flag4" /> // <permission android:name="PERM5" android:featureFlag="unknown.flag" /> // Therefore with the above flag values, only PERM1 and PERM2 should be present. final ParsedPackage pkg = parser.parsePackage(testFile, 0, false); List<String> permissionNames = pkg.getPermissions().stream().map(ParsedComponent::getName).toList(); assertThat(permissionNames).contains(PACKAGE_NAME + ".PERM1"); assertThat(permissionNames).contains(PACKAGE_NAME + ".PERM2"); assertThat(permissionNames).doesNotContain(PACKAGE_NAME + ".PERM3"); assertThat(permissionNames).doesNotContain(PACKAGE_NAME + ".PERM4"); assertThat(permissionNames).doesNotContain(PACKAGE_NAME + ".PERM5"); } finally { testFile.delete(); } } @Test @RequiresFlagsEnabled(android.content.res.Flags.FLAG_MANIFEST_FLAGGING) @EnableFlags(android.content.res.Flags.FLAG_USE_NEW_ACONFIG_STORAGE) public void testParseWithFeatureFlagAttributes_newStorage() throws Exception { final File testFile = extractFile(TEST_APP8_APK); try (PackageParser2 parser = new TestPackageParser2()) { Map<String, Boolean> flagValues = new HashMap<>(); Loading Loading
core/java/com/android/internal/pm/pkg/component/AconfigFlags.java +15 −0 Original line number Diff line number Diff line Loading @@ -226,6 +226,21 @@ public class AconfigFlags { } private Boolean getFlagValueFromNewStorage(String flagPackageAndName) { // We still need to check mFlagValues in case addFlagValuesForTesting() was called for // testing purposes. if (!mFlagValues.isEmpty() && mFlagValues.containsKey(flagPackageAndName)) { Boolean value = mFlagValues.get(flagPackageAndName); if (DEBUG) { Slog.v( LOG_TAG, "Aconfig flag value (FOR TESTING) for " + flagPackageAndName + " = " + value); } return value; } int index = flagPackageAndName.lastIndexOf('.'); if (index < 0) { Slog.e(LOG_TAG, "Unable to parse package name from " + flagPackageAndName); Loading
services/tests/PackageManagerServiceTests/server/src/com/android/server/pm/PackageParserTest.java +42 −1 Original line number Diff line number Diff line Loading @@ -65,10 +65,13 @@ import android.content.pm.SigningDetails; import android.os.Bundle; import android.os.Parcel; import android.os.Parcelable; import android.platform.test.annotations.DisableFlags; import android.platform.test.annotations.EnableFlags; import android.platform.test.annotations.Presubmit; import android.platform.test.annotations.RequiresFlagsEnabled; import android.platform.test.flag.junit.CheckFlagsRule; import android.platform.test.flag.junit.DeviceFlagsValueProvider; import android.platform.test.flag.junit.SetFlagsRule; import android.util.ArraySet; import androidx.annotation.Nullable; Loading Loading @@ -150,6 +153,9 @@ public class PackageParserTest { @Rule public final CheckFlagsRule mCheckFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule(); @Rule public final SetFlagsRule mSetFlagsRule = new SetFlagsRule(); private File mTmpDir; private static final File FRAMEWORK = new File("/system/framework/framework-res.apk"); private static final String TEST_APP1_APK = "PackageParserTestApp1.apk"; Loading Loading @@ -846,7 +852,42 @@ public class PackageParserTest { @Test @RequiresFlagsEnabled(android.content.res.Flags.FLAG_MANIFEST_FLAGGING) public void testParseWithFeatureFlagAttributes() throws Exception { @DisableFlags(android.content.res.Flags.FLAG_USE_NEW_ACONFIG_STORAGE) public void testParseWithFeatureFlagAttributes_oldStorage() throws Exception { final File testFile = extractFile(TEST_APP8_APK); try (PackageParser2 parser = new TestPackageParser2()) { Map<String, Boolean> flagValues = new HashMap<>(); flagValues.put("my.flag1", true); flagValues.put("my.flag2", false); flagValues.put("my.flag3", false); flagValues.put("my.flag4", true); ParsingPackageUtils.getAconfigFlags().addFlagValuesForTesting(flagValues); // The manifest has: // <permission android:name="PERM1" android:featureFlag="my.flag1 " /> // <permission android:name="PERM2" android:featureFlag=" !my.flag2" /> // <permission android:name="PERM3" android:featureFlag="my.flag3" /> // <permission android:name="PERM4" android:featureFlag="!my.flag4" /> // <permission android:name="PERM5" android:featureFlag="unknown.flag" /> // Therefore with the above flag values, only PERM1 and PERM2 should be present. final ParsedPackage pkg = parser.parsePackage(testFile, 0, false); List<String> permissionNames = pkg.getPermissions().stream().map(ParsedComponent::getName).toList(); assertThat(permissionNames).contains(PACKAGE_NAME + ".PERM1"); assertThat(permissionNames).contains(PACKAGE_NAME + ".PERM2"); assertThat(permissionNames).doesNotContain(PACKAGE_NAME + ".PERM3"); assertThat(permissionNames).doesNotContain(PACKAGE_NAME + ".PERM4"); assertThat(permissionNames).doesNotContain(PACKAGE_NAME + ".PERM5"); } finally { testFile.delete(); } } @Test @RequiresFlagsEnabled(android.content.res.Flags.FLAG_MANIFEST_FLAGGING) @EnableFlags(android.content.res.Flags.FLAG_USE_NEW_ACONFIG_STORAGE) public void testParseWithFeatureFlagAttributes_newStorage() throws Exception { final File testFile = extractFile(TEST_APP8_APK); try (PackageParser2 parser = new TestPackageParser2()) { Map<String, Boolean> flagValues = new HashMap<>(); Loading