diff options
3 files changed, 26 insertions, 1 deletions
diff --git a/services/core/java/com/android/server/pm/InstallPackageHelper.java b/services/core/java/com/android/server/pm/InstallPackageHelper.java index d41727fc781f..36790ab99c28 100644 --- a/services/core/java/com/android/server/pm/InstallPackageHelper.java +++ b/services/core/java/com/android/server/pm/InstallPackageHelper.java @@ -830,7 +830,7 @@ final class InstallPackageHelper { doRestore = performRollbackManagerRestore(userId, token, request); } - if (succeeded && !request.hasPostInstallRunnable()) { + if (succeeded && doRestore && !request.hasPostInstallRunnable()) { boolean hasNeverBeenRestored = packageSetting != null && packageSetting.isPendingRestore(); request.setPostInstallRunnable(() -> { diff --git a/services/core/java/com/android/server/pm/Settings.java b/services/core/java/com/android/server/pm/Settings.java index 0f868eb9fb8f..1309e44af6d3 100644 --- a/services/core/java/com/android/server/pm/Settings.java +++ b/services/core/java/com/android/server/pm/Settings.java @@ -3243,6 +3243,9 @@ public final class Settings implements Watchable, Snappable, ResilientAtomicFile if (pkg.isForceQueryableOverride()) { serializer.attributeBoolean(null, "forceQueryable", true); } + if (pkg.isPendingRestore()) { + serializer.attributeBoolean(null, "pendingRestore", true); + } if (pkg.isLoading()) { serializer.attributeBoolean(null, "isLoading", true); } @@ -4046,6 +4049,7 @@ public final class Settings implements Watchable, Snappable, ResilientAtomicFile PackageSetting packageSetting = null; long versionCode = 0; boolean installedForceQueryable = false; + boolean isPendingRestore = false; float loadingProgress = 0; long loadingCompletedTime = 0; UUID domainSetId; @@ -4071,6 +4075,7 @@ public final class Settings implements Watchable, Snappable, ResilientAtomicFile cpuAbiOverrideString = parser.getAttributeValue(null, "cpuAbiOverride"); updateAvailable = parser.getAttributeBoolean(null, "updateAvailable", false); installedForceQueryable = parser.getAttributeBoolean(null, "forceQueryable", false); + isPendingRestore = parser.getAttributeBoolean(null, "pendingRestore", false); loadingProgress = parser.getAttributeFloat(null, "loadingProgress", 0); loadingCompletedTime = parser.getAttributeLongHex(null, "loadingCompletedTime", 0); @@ -4244,6 +4249,7 @@ public final class Settings implements Watchable, Snappable, ResilientAtomicFile .setSecondaryCpuAbi(secondaryCpuAbiString) .setUpdateAvailable(updateAvailable) .setForceQueryableOverride(installedForceQueryable) + .setPendingRestore(isPendingRestore) .setLoadingProgress(loadingProgress) .setLoadingCompletedTime(loadingCompletedTime) .setAppMetadataFilePath(appMetadataFilePath) diff --git a/services/tests/PackageManagerServiceTests/server/src/com/android/server/pm/PackageManagerSettingsTests.java b/services/tests/PackageManagerServiceTests/server/src/com/android/server/pm/PackageManagerSettingsTests.java index 8ad557c7bbfd..89b4aea216f9 100644 --- a/services/tests/PackageManagerServiceTests/server/src/com/android/server/pm/PackageManagerSettingsTests.java +++ b/services/tests/PackageManagerServiceTests/server/src/com/android/server/pm/PackageManagerSettingsTests.java @@ -1008,6 +1008,25 @@ public class PackageManagerSettingsTests { } @Test + public void testWriteReadPendingRestore() { + Settings settings = makeSettings(); + PackageSetting packageSetting = createPackageSetting(PACKAGE_NAME_1); + packageSetting.setAppId(Process.FIRST_APPLICATION_UID); + packageSetting.setPkg(PackageImpl.forTesting(PACKAGE_NAME_1).hideAsParsed() + .setUid(packageSetting.getAppId()) + .hideAsFinal()); + + packageSetting.setPendingRestore(true); + settings.mPackages.put(PACKAGE_NAME_1, packageSetting); + + settings.writeLPr(computer, /*sync=*/true); + settings.mPackages.clear(); + + assertThat(settings.readLPw(computer, createFakeUsers()), is(true)); + assertThat(settings.getPackageLPr(PACKAGE_NAME_1).isPendingRestore(), is(true)); + } + + @Test public void testWriteReadArchiveState() { Settings settings = makeSettings(); PackageSetting packageSetting = createPackageSetting(PACKAGE_NAME_1); |