Remove all overrides of an app that isn't installed when flag changes

There can be a race condition between a package override flag becoming empty and that package being uninstalled. An issue will occur if the change to the flag is processed after the package is uninstalled (and therefore this package won't be processed) but before the package receiver received a package removed intent (and won't remove overrides because the package override flag is empty).

Fix: 201059968
Test: atest FrameworksMockingServicesTests:AppCompatOverridesServiceTest
Change-Id: I9ccc52b6448eabe76053af9e03686a8409805848
This commit is contained in:
tomnatan
2022-01-10 13:11:01 +00:00
committed by Tom Natan
parent 0d042eb0ec
commit 1a19e33dbd
2 changed files with 15 additions and 10 deletions

View File

@@ -25,6 +25,7 @@ import static android.provider.DeviceConfig.NAMESPACE_APP_COMPAT_OVERRIDES;
import static com.android.server.compat.overrides.AppCompatOverridesParser.FLAG_OWNED_CHANGE_IDS;
import static com.android.server.compat.overrides.AppCompatOverridesParser.FLAG_REMOVE_OVERRIDES;
import static java.util.Collections.emptyMap;
import static java.util.Collections.emptySet;
import android.annotation.NonNull;
@@ -157,17 +158,17 @@ public final class AppCompatOverridesService {
Map<String, CompatibilityOverridesToRemoveConfig> packageNameToOverridesToRemove =
new ArrayMap<>();
for (String packageName : packageNames) {
Long versionCode = getVersionCodeOrNull(packageName);
if (versionCode == null) {
// Package isn't installed yet.
continue;
}
Set<Long> changeIdsToSkip = packageToChangeIdsToSkip.getOrDefault(packageName,
emptySet());
Map<Long, PackageOverride> overridesToAdd = mOverridesParser.parsePackageOverrides(
properties.getString(packageName, /* defaultValue= */ ""), packageName,
versionCode, changeIdsToSkip);
Map<Long, PackageOverride> overridesToAdd = emptyMap();
Long versionCode = getVersionCodeOrNull(packageName);
if (versionCode != null) {
// Only if package installed add overrides, otherwise just remove.
overridesToAdd = mOverridesParser.parsePackageOverrides(
properties.getString(packageName, /* defaultValue= */ ""), packageName,
versionCode, changeIdsToSkip);
}
if (!overridesToAdd.isEmpty()) {
packageNameToOverridesToAdd.put(packageName,
new CompatibilityOverrideConfig(overridesToAdd));

View File

@@ -183,7 +183,8 @@ public class AppCompatOverridesServiceTest {
mOverridesToRemoveByPackageConfigCaptor.getValue().packageNameToOverridesToRemove;
Map<Long, PackageOverride> addedOverrides;
assertThat(packageNameToAddedOverrides.keySet()).containsExactly(PACKAGE_1, PACKAGE_3);
assertThat(packageNameToRemovedOverrides.keySet()).containsExactly(PACKAGE_3, PACKAGE_4);
assertThat(packageNameToRemovedOverrides.keySet()).containsExactly(PACKAGE_2, PACKAGE_3,
PACKAGE_4);
// Package 1
addedOverrides = packageNameToAddedOverrides.get(PACKAGE_1).overrides;
assertThat(addedOverrides).hasSize(3);
@@ -193,6 +194,9 @@ public class AppCompatOverridesServiceTest {
new PackageOverride.Builder().setMinVersionCode(2).setEnabled(true).build());
assertThat(addedOverrides.get(789L)).isEqualTo(
new PackageOverride.Builder().setEnabled(false).build());
// Package 2
assertThat(packageNameToRemovedOverrides.get(PACKAGE_2).changeIds).containsExactly(123L,
456L, 789L);
// Package 3
addedOverrides = packageNameToAddedOverrides.get(PACKAGE_3).overrides;
assertThat(addedOverrides).hasSize(1);