Loading services/core/java/com/android/server/RescueParty.java +6 −11 Original line number Original line Diff line number Diff line Loading @@ -213,10 +213,10 @@ public class RescueParty { } } /** /** * Get the current rescue level. * Get the next rescue level. This indicates the next level of mitigation that may be taken. */ */ private static int getRescueLevel() { private static int getNextRescueLevel() { return MathUtils.constrain(SystemProperties.getInt(PROP_RESCUE_LEVEL, LEVEL_NONE), return MathUtils.constrain(SystemProperties.getInt(PROP_RESCUE_LEVEL, LEVEL_NONE) + 1, LEVEL_NONE, LEVEL_FACTORY_RESET); LEVEL_NONE, LEVEL_FACTORY_RESET); } } Loading @@ -225,9 +225,7 @@ public class RescueParty { * probably want to call {@link #executeRescueLevel(Context, String)}. * probably want to call {@link #executeRescueLevel(Context, String)}. */ */ private static void incrementRescueLevel(int triggerUid) { private static void incrementRescueLevel(int triggerUid) { final int level = MathUtils.constrain( final int level = getNextRescueLevel(); SystemProperties.getInt(PROP_RESCUE_LEVEL, LEVEL_NONE) + 1, LEVEL_NONE, LEVEL_FACTORY_RESET); SystemProperties.set(PROP_RESCUE_LEVEL, Integer.toString(level)); SystemProperties.set(PROP_RESCUE_LEVEL, Integer.toString(level)); EventLogTags.writeRescueLevel(level, triggerUid); EventLogTags.writeRescueLevel(level, triggerUid); Loading Loading @@ -397,10 +395,7 @@ public class RescueParty { @FailureReasons int failureReason) { @FailureReasons int failureReason) { if (failureReason == PackageWatchdog.FAILURE_REASON_APP_CRASH if (failureReason == PackageWatchdog.FAILURE_REASON_APP_CRASH || failureReason == PackageWatchdog.FAILURE_REASON_APP_NOT_RESPONDING) { || failureReason == PackageWatchdog.FAILURE_REASON_APP_NOT_RESPONDING) { int rescueLevel = MathUtils.constrain( return mapRescueLevelToUserImpact(getNextRescueLevel()); SystemProperties.getInt(PROP_RESCUE_LEVEL, LEVEL_NONE) + 1, LEVEL_NONE, LEVEL_FACTORY_RESET); return mapRescueLevelToUserImpact(rescueLevel); } else { } else { return PackageHealthObserverImpact.USER_IMPACT_NONE; return PackageHealthObserverImpact.USER_IMPACT_NONE; } } Loading Loading @@ -449,7 +444,7 @@ public class RescueParty { if (isDisabled()) { if (isDisabled()) { return PackageHealthObserverImpact.USER_IMPACT_NONE; return PackageHealthObserverImpact.USER_IMPACT_NONE; } } return mapRescueLevelToUserImpact(getRescueLevel()); return mapRescueLevelToUserImpact(getNextRescueLevel()); } } @Override @Override Loading services/tests/mockingservicestests/src/com/android/server/RescuePartyTest.java +29 −0 Original line number Original line Diff line number Diff line Loading @@ -374,6 +374,35 @@ public class RescuePartyTest { PackageHealthObserverImpact.USER_IMPACT_HIGH); PackageHealthObserverImpact.USER_IMPACT_HIGH); } } @Test public void testBootLoopLevels() { RescuePartyObserver observer = RescuePartyObserver.getInstance(mMockContext); /* Ensure that the returned user impact corresponds with the user impact of the next available rescue level, not the current one. */ SystemProperties.set(RescueParty.PROP_RESCUE_LEVEL, Integer.toString( RescueParty.LEVEL_NONE)); assertEquals(observer.onBootLoop(), PackageHealthObserverImpact.USER_IMPACT_LOW); SystemProperties.set(RescueParty.PROP_RESCUE_LEVEL, Integer.toString( RescueParty.LEVEL_RESET_SETTINGS_UNTRUSTED_DEFAULTS)); assertEquals(observer.onBootLoop(), PackageHealthObserverImpact.USER_IMPACT_LOW); SystemProperties.set(RescueParty.PROP_RESCUE_LEVEL, Integer.toString( RescueParty.LEVEL_RESET_SETTINGS_UNTRUSTED_CHANGES)); assertEquals(observer.onBootLoop(), PackageHealthObserverImpact.USER_IMPACT_HIGH); SystemProperties.set(RescueParty.PROP_RESCUE_LEVEL, Integer.toString( RescueParty.LEVEL_RESET_SETTINGS_TRUSTED_DEFAULTS)); assertEquals(observer.onBootLoop(), PackageHealthObserverImpact.USER_IMPACT_HIGH); SystemProperties.set(RescueParty.PROP_RESCUE_LEVEL, Integer.toString( LEVEL_FACTORY_RESET)); assertEquals(observer.onBootLoop(), PackageHealthObserverImpact.USER_IMPACT_HIGH); } @Test @Test public void testRescueLevelIncrementsWhenExecuted() { public void testRescueLevelIncrementsWhenExecuted() { RescuePartyObserver observer = RescuePartyObserver.getInstance(mMockContext); RescuePartyObserver observer = RescuePartyObserver.getInstance(mMockContext); Loading Loading
services/core/java/com/android/server/RescueParty.java +6 −11 Original line number Original line Diff line number Diff line Loading @@ -213,10 +213,10 @@ public class RescueParty { } } /** /** * Get the current rescue level. * Get the next rescue level. This indicates the next level of mitigation that may be taken. */ */ private static int getRescueLevel() { private static int getNextRescueLevel() { return MathUtils.constrain(SystemProperties.getInt(PROP_RESCUE_LEVEL, LEVEL_NONE), return MathUtils.constrain(SystemProperties.getInt(PROP_RESCUE_LEVEL, LEVEL_NONE) + 1, LEVEL_NONE, LEVEL_FACTORY_RESET); LEVEL_NONE, LEVEL_FACTORY_RESET); } } Loading @@ -225,9 +225,7 @@ public class RescueParty { * probably want to call {@link #executeRescueLevel(Context, String)}. * probably want to call {@link #executeRescueLevel(Context, String)}. */ */ private static void incrementRescueLevel(int triggerUid) { private static void incrementRescueLevel(int triggerUid) { final int level = MathUtils.constrain( final int level = getNextRescueLevel(); SystemProperties.getInt(PROP_RESCUE_LEVEL, LEVEL_NONE) + 1, LEVEL_NONE, LEVEL_FACTORY_RESET); SystemProperties.set(PROP_RESCUE_LEVEL, Integer.toString(level)); SystemProperties.set(PROP_RESCUE_LEVEL, Integer.toString(level)); EventLogTags.writeRescueLevel(level, triggerUid); EventLogTags.writeRescueLevel(level, triggerUid); Loading Loading @@ -397,10 +395,7 @@ public class RescueParty { @FailureReasons int failureReason) { @FailureReasons int failureReason) { if (failureReason == PackageWatchdog.FAILURE_REASON_APP_CRASH if (failureReason == PackageWatchdog.FAILURE_REASON_APP_CRASH || failureReason == PackageWatchdog.FAILURE_REASON_APP_NOT_RESPONDING) { || failureReason == PackageWatchdog.FAILURE_REASON_APP_NOT_RESPONDING) { int rescueLevel = MathUtils.constrain( return mapRescueLevelToUserImpact(getNextRescueLevel()); SystemProperties.getInt(PROP_RESCUE_LEVEL, LEVEL_NONE) + 1, LEVEL_NONE, LEVEL_FACTORY_RESET); return mapRescueLevelToUserImpact(rescueLevel); } else { } else { return PackageHealthObserverImpact.USER_IMPACT_NONE; return PackageHealthObserverImpact.USER_IMPACT_NONE; } } Loading Loading @@ -449,7 +444,7 @@ public class RescueParty { if (isDisabled()) { if (isDisabled()) { return PackageHealthObserverImpact.USER_IMPACT_NONE; return PackageHealthObserverImpact.USER_IMPACT_NONE; } } return mapRescueLevelToUserImpact(getRescueLevel()); return mapRescueLevelToUserImpact(getNextRescueLevel()); } } @Override @Override Loading
services/tests/mockingservicestests/src/com/android/server/RescuePartyTest.java +29 −0 Original line number Original line Diff line number Diff line Loading @@ -374,6 +374,35 @@ public class RescuePartyTest { PackageHealthObserverImpact.USER_IMPACT_HIGH); PackageHealthObserverImpact.USER_IMPACT_HIGH); } } @Test public void testBootLoopLevels() { RescuePartyObserver observer = RescuePartyObserver.getInstance(mMockContext); /* Ensure that the returned user impact corresponds with the user impact of the next available rescue level, not the current one. */ SystemProperties.set(RescueParty.PROP_RESCUE_LEVEL, Integer.toString( RescueParty.LEVEL_NONE)); assertEquals(observer.onBootLoop(), PackageHealthObserverImpact.USER_IMPACT_LOW); SystemProperties.set(RescueParty.PROP_RESCUE_LEVEL, Integer.toString( RescueParty.LEVEL_RESET_SETTINGS_UNTRUSTED_DEFAULTS)); assertEquals(observer.onBootLoop(), PackageHealthObserverImpact.USER_IMPACT_LOW); SystemProperties.set(RescueParty.PROP_RESCUE_LEVEL, Integer.toString( RescueParty.LEVEL_RESET_SETTINGS_UNTRUSTED_CHANGES)); assertEquals(observer.onBootLoop(), PackageHealthObserverImpact.USER_IMPACT_HIGH); SystemProperties.set(RescueParty.PROP_RESCUE_LEVEL, Integer.toString( RescueParty.LEVEL_RESET_SETTINGS_TRUSTED_DEFAULTS)); assertEquals(observer.onBootLoop(), PackageHealthObserverImpact.USER_IMPACT_HIGH); SystemProperties.set(RescueParty.PROP_RESCUE_LEVEL, Integer.toString( LEVEL_FACTORY_RESET)); assertEquals(observer.onBootLoop(), PackageHealthObserverImpact.USER_IMPACT_HIGH); } @Test @Test public void testRescueLevelIncrementsWhenExecuted() { public void testRescueLevelIncrementsWhenExecuted() { RescuePartyObserver observer = RescuePartyObserver.getInstance(mMockContext); RescuePartyObserver observer = RescuePartyObserver.getInstance(mMockContext); Loading