diff options
5 files changed, 55 insertions, 1 deletions
diff --git a/services/core/java/com/android/server/PackageWatchdog.java b/services/core/java/com/android/server/PackageWatchdog.java index eb037095c6c9..d42a3dc9b6b3 100644 --- a/services/core/java/com/android/server/PackageWatchdog.java +++ b/services/core/java/com/android/server/PackageWatchdog.java @@ -16,13 +16,18 @@ package com.android.server; +import static android.content.Intent.ACTION_REBOOT; +import static android.content.Intent.ACTION_SHUTDOWN; import static android.service.watchdog.ExplicitHealthCheckService.PackageConfig; import static java.lang.annotation.RetentionPolicy.SOURCE; import android.annotation.IntDef; import android.annotation.Nullable; +import android.content.BroadcastReceiver; import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.content.pm.VersionedPackage; @@ -2001,6 +2006,31 @@ public class PackageWatchdog { } } } + } + + /** + * Register broadcast receiver for shutdown. + * We would save the observer state to persist across boots. + * + * @hide + */ + public void registerShutdownBroadcastReceiver() { + BroadcastReceiver shutdownEventReceiver = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + // Only write if intent is relevant to device reboot or shutdown. + String intentAction = intent.getAction(); + if (ACTION_REBOOT.equals(intentAction) + || ACTION_SHUTDOWN.equals(intentAction)) { + writeNow(); + } + } + }; + // Setup receiver for device reboots or shutdowns. + IntentFilter filter = new IntentFilter(ACTION_REBOOT); + filter.addAction(ACTION_SHUTDOWN); + mContext.registerReceiverForAllUsers(shutdownEventReceiver, filter, null, + /* run on main thread */ null); } } diff --git a/services/core/java/com/android/server/crashrecovery/CrashRecoveryModule.java b/services/core/java/com/android/server/crashrecovery/CrashRecoveryModule.java index 317c91e9a289..5f2fbcedce88 100644 --- a/services/core/java/com/android/server/crashrecovery/CrashRecoveryModule.java +++ b/services/core/java/com/android/server/crashrecovery/CrashRecoveryModule.java @@ -41,6 +41,7 @@ public class CrashRecoveryModule { @Override public void onStart() { RescueParty.registerHealthObserver(mSystemContext); + mPackageWatchdog.registerShutdownBroadcastReceiver(); mPackageWatchdog.noteBoot(); } diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 07c8ee75f932..33ca8a8e0f9e 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -31,6 +31,7 @@ import static android.content.pm.PackageManager.MATCH_FACTORY_ONLY; import static android.content.pm.PackageManager.MATCH_SYSTEM_ONLY; import static android.content.pm.PackageManager.PERMISSION_GRANTED; import static android.content.pm.PackageManager.USER_MIN_ASPECT_RATIO_UNSET; +import static android.crashrecovery.flags.Flags.refactorCrashrecovery; import static android.os.Process.INVALID_UID; import static android.os.Trace.TRACE_TAG_PACKAGE_MANAGER; import static android.os.storage.StorageManager.FLAG_STORAGE_CE; @@ -3037,7 +3038,9 @@ public class PackageManagerService implements PackageSender, TestUtilityService mCompilerStats.writeNow(); mDexManager.writePackageDexUsageNow(); mDynamicCodeLogger.writeNow(); - PackageWatchdog.getInstance(mContext).writeNow(); + if (!refactorCrashrecovery()) { + PackageWatchdog.getInstance(mContext).writeNow(); + } synchronized (mLock) { mPackageUsage.writeNow(mSettings.getPackagesLocked()); diff --git a/services/tests/mockingservicestests/src/com/android/server/crashrecovery/CrashRecoveryModuleTest.java b/services/tests/mockingservicestests/src/com/android/server/crashrecovery/CrashRecoveryModuleTest.java index c481f84719f4..d0b7cc7b70e6 100644 --- a/services/tests/mockingservicestests/src/com/android/server/crashrecovery/CrashRecoveryModuleTest.java +++ b/services/tests/mockingservicestests/src/com/android/server/crashrecovery/CrashRecoveryModuleTest.java @@ -84,8 +84,10 @@ public class CrashRecoveryModuleTest { @Test public void testLifecycleServiceStart() { mLifecycle.onStart(); + doNothing().when(mPackageWatchdog).registerShutdownBroadcastReceiver(); verify(mPackageWatchdog, times(1)).noteBoot(); + verify(mPackageWatchdog, times(1)).registerShutdownBroadcastReceiver(); ExtendedMockito.verify(() -> RescueParty.registerHealthObserver(any()), Mockito.times(1)); } diff --git a/tests/PackageWatchdog/src/com/android/server/PackageWatchdogTest.java b/tests/PackageWatchdog/src/com/android/server/PackageWatchdogTest.java index a8b383cd4274..ab406ef4632e 100644 --- a/tests/PackageWatchdog/src/com/android/server/PackageWatchdogTest.java +++ b/tests/PackageWatchdog/src/com/android/server/PackageWatchdogTest.java @@ -23,9 +23,12 @@ import static com.android.dx.mockito.inline.extended.ExtendedMockito.doAnswer; import static com.google.common.truth.Truth.assertThat; import static org.junit.Assert.assertTrue; +import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.anyLong; import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.reset; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; @@ -33,6 +36,7 @@ import static org.mockito.Mockito.when; import android.Manifest; import android.content.Context; +import android.content.Intent; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.content.pm.VersionedPackage; @@ -116,6 +120,7 @@ public class PackageWatchdogTest { private ConnectivityModuleConnector mConnectivityModuleConnector; @Mock private PackageManager mMockPackageManager; + @Mock Intent mMockIntent; // Mock only sysprop apis private PackageWatchdog.BootThreshold mSpyBootThreshold; @Captor @@ -1669,6 +1674,19 @@ public class PackageWatchdogTest { PackageWatchdog.DEFAULT_TRIGGER_FAILURE_DURATION_MS); } + /** + * Tests device config changes are propagated correctly. + */ + @Test + public void testRegisterShutdownBroadcastReceiver() { + PackageWatchdog watchdog = createWatchdog(); + doReturn(mMockIntent).when(mSpyContext) + .registerReceiverForAllUsers(any(), any(), any(), any()); + + watchdog.registerShutdownBroadcastReceiver(); + verify(mSpyContext).registerReceiverForAllUsers(any(), any(), eq(null), eq(null)); + } + private void adoptShellPermissions(String... permissions) { InstrumentationRegistry .getInstrumentation() |