diff options
3 files changed, 27 insertions, 26 deletions
diff --git a/services/core/java/com/android/server/PackageWatchdog.java b/services/core/java/com/android/server/PackageWatchdog.java index 4507193a5aff..ec40971c38ee 100644 --- a/services/core/java/com/android/server/PackageWatchdog.java +++ b/services/core/java/com/android/server/PackageWatchdog.java @@ -247,9 +247,8 @@ public class PackageWatchdog { } for (int pIndex = 0; pIndex < packages.size(); pIndex++) { - String packageToReport = packages.get(pIndex).getPackageName(); - long packageVersionCode = packages.get(pIndex).getVersionCode(); - // Observer that will receive failure for packageToReport + VersionedPackage versionedPackage = packages.get(pIndex); + // Observer that will receive failure for versionedPackage PackageHealthObserver currentObserverToNotify = null; int currentObserverImpact = Integer.MAX_VALUE; @@ -258,9 +257,8 @@ public class PackageWatchdog { ObserverInternal observer = mAllObservers.valueAt(oIndex); PackageHealthObserver registeredObserver = observer.mRegisteredObserver; if (registeredObserver != null - && observer.onPackageFailure(packageToReport)) { - int impact = registeredObserver.onHealthCheckFailed(packageToReport, - packageVersionCode); + && observer.onPackageFailure(versionedPackage.getPackageName())) { + int impact = registeredObserver.onHealthCheckFailed(versionedPackage); if (impact != PackageHealthObserverImpact.USER_IMPACT_NONE && impact < currentObserverImpact) { currentObserverToNotify = registeredObserver; @@ -271,7 +269,7 @@ public class PackageWatchdog { // Execute action with least user impact if (currentObserverToNotify != null) { - currentObserverToNotify.execute(packageToReport, packageVersionCode); + currentObserverToNotify.execute(versionedPackage); } } } @@ -310,19 +308,19 @@ public class PackageWatchdog { /** Register instances of this interface to receive notifications on package failure. */ public interface PackageHealthObserver { /** - * Called when health check fails for the {@code packageName}. + * Called when health check fails for the {@code versionedPackage}. * * @return any one of {@link PackageHealthObserverImpact} to express the impact * to the user on {@link #execute} */ - @PackageHealthObserverImpact int onHealthCheckFailed(String packageName, long versionCdoe); + @PackageHealthObserverImpact int onHealthCheckFailed(VersionedPackage versionedPackage); /** * Executes mitigation for {@link #onHealthCheckFailed}. * * @return {@code true} if action was executed successfully, {@code false} otherwise */ - boolean execute(String packageName, long versionCode); + boolean execute(VersionedPackage versionedPackage); // TODO(zezeozue): Ensure uniqueness? /** diff --git a/services/core/java/com/android/server/rollback/RollbackPackageHealthObserver.java b/services/core/java/com/android/server/rollback/RollbackPackageHealthObserver.java index d00817f652ba..8e041602c75f 100644 --- a/services/core/java/com/android/server/rollback/RollbackPackageHealthObserver.java +++ b/services/core/java/com/android/server/rollback/RollbackPackageHealthObserver.java @@ -57,7 +57,7 @@ public final class RollbackPackageHealthObserver implements PackageHealthObserve } @Override - public int onHealthCheckFailed(String packageName, long versionCode) { + public int onHealthCheckFailed(VersionedPackage failedPackage) { VersionedPackage moduleMetadataPackage = getModuleMetadataPackage(); if (moduleMetadataPackage == null) { // Ignore failure, no mainline update available @@ -66,7 +66,7 @@ public final class RollbackPackageHealthObserver implements PackageHealthObserve RollbackInfo rollback = getAvailableMainlineRollback(mContext.getSystemService(RollbackManager.class), - packageName, versionCode, moduleMetadataPackage); + failedPackage, moduleMetadataPackage); if (rollback == null) { // Don't handle the notification, no rollbacks available for the package return PackageHealthObserverImpact.USER_IMPACT_NONE; @@ -76,7 +76,7 @@ public final class RollbackPackageHealthObserver implements PackageHealthObserve } @Override - public boolean execute(String packageName, long versionCode) { + public boolean execute(VersionedPackage failedPackage) { VersionedPackage moduleMetadataPackage = getModuleMetadataPackage(); if (moduleMetadataPackage == null) { // Ignore failure, no mainline update available @@ -85,10 +85,11 @@ public final class RollbackPackageHealthObserver implements PackageHealthObserve RollbackManager rollbackManager = mContext.getSystemService(RollbackManager.class); RollbackInfo rollback = getAvailableMainlineRollback(rollbackManager, - packageName, versionCode, moduleMetadataPackage); + failedPackage, moduleMetadataPackage); if (rollback == null) { - Slog.w(TAG, "Expected rollback but no rollback found for package: [ " - + packageName + "] with versionCode: [" + versionCode + "]"); + Slog.w(TAG, "Expected rollback but no mainline rollback found for package: [ " + + failedPackage.getPackageName() + "] with versionCode: [" + + failedPackage.getVersionCode() + "]"); return false; } @@ -114,7 +115,7 @@ public final class RollbackPackageHealthObserver implements PackageHealthObserve mHandler.post(() -> rollbackManager.commitRollback(rollback.getRollbackId(), - Collections.singletonList(new VersionedPackage(packageName, versionCode)), + Collections.singletonList(moduleMetadataPackage), rollbackReceiver.getIntentSender())); // Assume rollback executed successfully return true; @@ -134,7 +135,7 @@ public final class RollbackPackageHealthObserver implements PackageHealthObserve } private RollbackInfo getAvailableMainlineRollback(RollbackManager rollbackManager, - String packageName, long versionCode, VersionedPackage moduleMetadataPackage) { + VersionedPackage failedPackage, VersionedPackage moduleMetadataPackage) { for (RollbackInfo rollback : rollbackManager.getAvailableRollbacks()) { // We only rollback mainline packages, so check if rollback contains the // module metadata provider, if it does, the rollback is a mainline rollback @@ -142,10 +143,11 @@ public final class RollbackPackageHealthObserver implements PackageHealthObserve boolean hasFailedPackage = false; for (PackageRollbackInfo packageRollback : rollback.getPackages()) { hasModuleMetadataPackage |= packageRollback.getPackageName().equals( - moduleMetadataPackage.getPackageName()); - hasFailedPackage |= packageRollback.getPackageName().equals(packageName) + moduleMetadataPackage.getPackageName()); + hasFailedPackage |= packageRollback.getPackageName().equals( + failedPackage.getPackageName()) && packageRollback.getVersionRolledBackFrom().getVersionCode() - == versionCode; + == failedPackage.getVersionCode(); } if (hasModuleMetadataPackage && hasFailedPackage) { return rollback; diff --git a/tests/PackageWatchdog/src/com/android/server/PackageWatchdogTest.java b/tests/PackageWatchdog/src/com/android/server/PackageWatchdogTest.java index c1c598d52676..77cd62e4cbd3 100644 --- a/tests/PackageWatchdog/src/com/android/server/PackageWatchdogTest.java +++ b/tests/PackageWatchdog/src/com/android/server/PackageWatchdogTest.java @@ -242,8 +242,9 @@ public class PackageWatchdogTest { PackageWatchdog watchdog = createWatchdog(); long differentVersionCode = 2L; TestObserver observer = new TestObserver(OBSERVER_NAME_1) { - public int onHealthCheckFailed(String packageName, long versionCode) { - if (versionCode == VERSION_CODE) { + @Override + public int onHealthCheckFailed(VersionedPackage versionedPackage) { + if (versionedPackage.getVersionCode() == VERSION_CODE) { // Only rollback for specific versionCode return PackageHealthObserverImpact.USER_IMPACT_MEDIUM; } @@ -457,12 +458,12 @@ public class PackageWatchdogTest { mImpact = impact; } - public int onHealthCheckFailed(String packageName, long versionCode) { + public int onHealthCheckFailed(VersionedPackage versionedPackage) { return mImpact; } - public boolean execute(String packageName, long versionCode) { - mFailedPackages.add(packageName); + public boolean execute(VersionedPackage versionedPackage) { + mFailedPackages.add(versionedPackage.getPackageName()); return true; } |