Loading services/core/java/com/android/server/PackageWatchdog.java +8 −10 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading @@ -271,7 +269,7 @@ public class PackageWatchdog { // Execute action with least user impact if (currentObserverToNotify != null) { currentObserverToNotify.execute(packageToReport, packageVersionCode); currentObserverToNotify.execute(versionedPackage); } } } Loading Loading @@ -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? /** Loading services/core/java/com/android/server/rollback/RollbackPackageHealthObserver.java +13 −11 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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; Loading @@ -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 Loading @@ -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; } Loading @@ -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; Loading @@ -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 Loading @@ -143,9 +144,10 @@ public final class RollbackPackageHealthObserver implements PackageHealthObserve for (PackageRollbackInfo packageRollback : rollback.getPackages()) { hasModuleMetadataPackage |= packageRollback.getPackageName().equals( moduleMetadataPackage.getPackageName()); hasFailedPackage |= packageRollback.getPackageName().equals(packageName) hasFailedPackage |= packageRollback.getPackageName().equals( failedPackage.getPackageName()) && packageRollback.getVersionRolledBackFrom().getVersionCode() == versionCode; == failedPackage.getVersionCode(); } if (hasModuleMetadataPackage && hasFailedPackage) { return rollback; Loading tests/PackageWatchdog/src/com/android/server/PackageWatchdogTest.java +6 −5 Original line number Diff line number Diff line Loading @@ -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; } Loading Loading @@ -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; } Loading Loading
services/core/java/com/android/server/PackageWatchdog.java +8 −10 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading @@ -271,7 +269,7 @@ public class PackageWatchdog { // Execute action with least user impact if (currentObserverToNotify != null) { currentObserverToNotify.execute(packageToReport, packageVersionCode); currentObserverToNotify.execute(versionedPackage); } } } Loading Loading @@ -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? /** Loading
services/core/java/com/android/server/rollback/RollbackPackageHealthObserver.java +13 −11 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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; Loading @@ -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 Loading @@ -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; } Loading @@ -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; Loading @@ -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 Loading @@ -143,9 +144,10 @@ public final class RollbackPackageHealthObserver implements PackageHealthObserve for (PackageRollbackInfo packageRollback : rollback.getPackages()) { hasModuleMetadataPackage |= packageRollback.getPackageName().equals( moduleMetadataPackage.getPackageName()); hasFailedPackage |= packageRollback.getPackageName().equals(packageName) hasFailedPackage |= packageRollback.getPackageName().equals( failedPackage.getPackageName()) && packageRollback.getVersionRolledBackFrom().getVersionCode() == versionCode; == failedPackage.getVersionCode(); } if (hasModuleMetadataPackage && hasFailedPackage) { return rollback; Loading
tests/PackageWatchdog/src/com/android/server/PackageWatchdogTest.java +6 −5 Original line number Diff line number Diff line Loading @@ -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; } Loading Loading @@ -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; } Loading