From 39e248ca7b2f33b220039b7d74d26f6b9db27df7 Mon Sep 17 00:00:00 2001 From: Kweku Adams Date: Sat, 6 Aug 2022 00:15:58 +0000 Subject: [PATCH] Shift some bootup work to later phases. Shift some of the work required at boot to later phases. For example, some of the data isn't needed until we're able to start 3rd party apps, so shift that data loading to the THIRD_PARTY_APPS_CAN_START phase. Bug: 241553134 Test: Android boots up and TARE loads properly Change-Id: I4ad7d912b3318ad5c18f3347ac74b1046e637eb0 --- .../server/tare/InternalResourceService.java | 87 ++++++++++++------- 1 file changed, 57 insertions(+), 30 deletions(-) diff --git a/apex/jobscheduler/service/java/com/android/server/tare/InternalResourceService.java b/apex/jobscheduler/service/java/com/android/server/tare/InternalResourceService.java index 2da00c7a8e2c4..6d5c16021ea93 100644 --- a/apex/jobscheduler/service/java/com/android/server/tare/InternalResourceService.java +++ b/apex/jobscheduler/service/java/com/android/server/tare/InternalResourceService.java @@ -274,24 +274,19 @@ public class InternalResourceService extends SystemService { public void onBootPhase(int phase) { mBootPhase = phase; - if (PHASE_SYSTEM_SERVICES_READY == phase) { - mConfigObserver.start(); - mDeviceIdleController = IDeviceIdleController.Stub.asInterface( - ServiceManager.getService(Context.DEVICE_IDLE_CONTROLLER)); - setupEverything(); - } else if (PHASE_BOOT_COMPLETED == phase) { - if (!mExemptListLoaded) { - synchronized (mLock) { - try { - mExemptedApps = - new ArraySet<>(mDeviceIdleController.getFullPowerWhitelist()); - } catch (RemoteException e) { - // Shouldn't happen. - Slog.wtf(TAG, e); - } - mExemptListLoaded = true; - } - } + switch (phase) { + case PHASE_SYSTEM_SERVICES_READY: + mConfigObserver.start(); + mDeviceIdleController = IDeviceIdleController.Stub.asInterface( + ServiceManager.getService(Context.DEVICE_IDLE_CONTROLLER)); + onBootPhaseSystemServicesReady(); + break; + case PHASE_THIRD_PARTY_APPS_CAN_START: + onBootPhaseThirdPartyAppsCanStart(); + break; + case PHASE_BOOT_COMPLETED: + onBootPhaseBootCompleted(); + break; } } @@ -403,10 +398,9 @@ public class InternalResourceService extends SystemService { final ArraySet added = new ArraySet<>(); try { mExemptedApps = new ArraySet<>(mDeviceIdleController.getFullPowerWhitelist()); + mExemptListLoaded = true; } catch (RemoteException e) { // Shouldn't happen. - Slog.wtf(TAG, e); - return; } for (int i = mExemptedApps.size() - 1; i >= 0; --i) { @@ -695,17 +689,11 @@ public class InternalResourceService extends SystemService { /** Perform long-running and/or heavy setup work. This should be called off the main thread. */ private void setupHeavyWork() { + if (mBootPhase < PHASE_THIRD_PARTY_APPS_CAN_START || !mIsEnabled) { + return; + } synchronized (mLock) { loadInstalledPackageListLocked(); - if (mBootPhase >= PHASE_BOOT_COMPLETED && !mExemptListLoaded) { - try { - mExemptedApps = new ArraySet<>(mDeviceIdleController.getFullPowerWhitelist()); - } catch (RemoteException e) { - // Shouldn't happen. - Slog.wtf(TAG, e); - } - mExemptListLoaded = true; - } final boolean isFirstSetup = !mScribe.recordExists(); if (isFirstSetup) { mAgent.grantBirthrightsLocked(); @@ -726,18 +714,57 @@ public class InternalResourceService extends SystemService { } } - private void setupEverything() { + private void onBootPhaseSystemServicesReady() { if (mBootPhase < PHASE_SYSTEM_SERVICES_READY || !mIsEnabled) { return; } synchronized (mLock) { registerListeners(); mCurrentBatteryLevel = getCurrentBatteryLevel(); + } + } + + private void onBootPhaseThirdPartyAppsCanStart() { + if (mBootPhase < PHASE_THIRD_PARTY_APPS_CAN_START || !mIsEnabled) { + return; + } + synchronized (mLock) { mHandler.post(this::setupHeavyWork); mCompleteEconomicPolicy.setup(mConfigObserver.getAllDeviceConfigProperties()); } } + private void onBootPhaseBootCompleted() { + if (mBootPhase < PHASE_BOOT_COMPLETED || !mIsEnabled) { + return; + } + synchronized (mLock) { + if (!mExemptListLoaded) { + try { + mExemptedApps = new ArraySet<>(mDeviceIdleController.getFullPowerWhitelist()); + mExemptListLoaded = true; + } catch (RemoteException e) { + // Shouldn't happen. + } + } + } + } + + private void setupEverything() { + if (!mIsEnabled) { + return; + } + if (mBootPhase >= PHASE_SYSTEM_SERVICES_READY) { + onBootPhaseSystemServicesReady(); + } + if (mBootPhase >= PHASE_THIRD_PARTY_APPS_CAN_START) { + onBootPhaseThirdPartyAppsCanStart(); + } + if (mBootPhase >= PHASE_BOOT_COMPLETED) { + onBootPhaseBootCompleted(); + } + } + private void tearDownEverything() { if (mIsEnabled) { return;