diff options
author | Kweku Adams <kwekua@google.com> | 2023-12-01 01:58:13 +0000 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2023-12-01 01:58:13 +0000 |
commit | 7c88043780c4535f516643e08f08edc4686e9866 (patch) | |
tree | b4c8c2de7788b9848af56e6613fd48fdd4a43f2c /apex | |
parent | 28e5463be0e0ed5dc1a64ff87cfb84676ee1ac13 (diff) | |
parent | ea77a1ea9855eb62556573203a1e4a56f9869d2b (diff) | |
download | base-7c88043780c4535f516643e08f08edc4686e9866.tar.gz |
Merge "Move some tracking starts out of constructor." into main
Diffstat (limited to 'apex')
9 files changed, 66 insertions, 7 deletions
diff --git a/apex/jobscheduler/service/java/com/android/server/job/JobSchedulerService.java b/apex/jobscheduler/service/java/com/android/server/job/JobSchedulerService.java index 2d972d0eebe4..fecd2fd60b1d 100644 --- a/apex/jobscheduler/service/java/com/android/server/job/JobSchedulerService.java +++ b/apex/jobscheduler/service/java/com/android/server/job/JobSchedulerService.java @@ -268,6 +268,7 @@ public class JobSchedulerService extends com.android.server.SystemService /** Master list of jobs. */ final JobStore mJobs; private final CountDownLatch mJobStoreLoadedLatch; + private final CountDownLatch mStartControllerTrackingLatch; /** Tracking the standby bucket state of each app */ final StandbyTracker mStandbyTracker; /** Tracking amount of time each package runs for. */ @@ -2521,6 +2522,7 @@ public class JobSchedulerService extends com.android.server.SystemService mBatteryStateTracker.startTracking(); // Create the controllers. + mStartControllerTrackingLatch = new CountDownLatch(1); mControllers = new ArrayList<StateController>(); mPrefetchController = new PrefetchController(this); mControllers.add(mPrefetchController); @@ -2552,6 +2554,8 @@ public class JobSchedulerService extends com.android.server.SystemService new TareController(this, backgroundJobsController, mConnectivityController); mControllers.add(mTareController); + startControllerTrackingAsync(); + mRestrictiveControllers = new ArrayList<>(); mRestrictiveControllers.add(batteryController); mRestrictiveControllers.add(mConnectivityController); @@ -2623,16 +2627,22 @@ public class JobSchedulerService extends com.android.server.SystemService public void onBootPhase(int phase) { if (PHASE_LOCK_SETTINGS_READY == phase) { // This is the last phase before PHASE_SYSTEM_SERVICES_READY. We need to ensure that + // controllers have started tracking and that // persisted jobs are loaded before we can proceed to PHASE_SYSTEM_SERVICES_READY. try { + mStartControllerTrackingLatch.await(); + } catch (InterruptedException e) { + Slog.e(TAG, "Couldn't wait on controller tracking start latch"); + } + try { mJobStoreLoadedLatch.await(); } catch (InterruptedException e) { Slog.e(TAG, "Couldn't wait on job store loading latch"); } } else if (PHASE_SYSTEM_SERVICES_READY == phase) { mConstantsObserver.start(); - for (StateController controller : mControllers) { - controller.onSystemServicesReady(); + for (int i = mControllers.size() - 1; i >= 0; --i) { + mControllers.get(i).onSystemServicesReady(); } mAppStateTracker = (AppStateTrackerImpl) Objects.requireNonNull( @@ -2695,6 +2705,17 @@ public class JobSchedulerService extends com.android.server.SystemService } } + private void startControllerTrackingAsync() { + mHandler.post(() -> { + synchronized (mLock) { + for (int i = mControllers.size() - 1; i >= 0; --i) { + mControllers.get(i).startTrackingLocked(); + } + } + mStartControllerTrackingLatch.countDown(); + }); + } + /** * Called when we have a job status object that we need to insert in our * {@link com.android.server.job.JobStore}, and make sure all the relevant controllers know @@ -5176,6 +5197,12 @@ public class JobSchedulerService extends com.android.server.SystemService return mTareController; } + @VisibleForTesting + protected void waitOnAsyncLoadingForTesting() throws Exception { + mStartControllerTrackingLatch.await(); + // Ignore the job store loading for testing. + } + // Shell command infrastructure int getJobState(PrintWriter pw, String pkgName, int userId, @Nullable String namespace, int jobId) { diff --git a/apex/jobscheduler/service/java/com/android/server/job/controllers/BackgroundJobsController.java b/apex/jobscheduler/service/java/com/android/server/job/controllers/BackgroundJobsController.java index 25b3421a55f0..cd3ba6b9e13e 100644 --- a/apex/jobscheduler/service/java/com/android/server/job/controllers/BackgroundJobsController.java +++ b/apex/jobscheduler/service/java/com/android/server/job/controllers/BackgroundJobsController.java @@ -73,6 +73,10 @@ public final class BackgroundJobsController extends StateController { LocalServices.getService(ActivityManagerInternal.class)); mAppStateTracker = (AppStateTrackerImpl) Objects.requireNonNull( LocalServices.getService(AppStateTracker.class)); + } + + @Override + public void startTrackingLocked() { mAppStateTracker.addListener(mForceAppStandbyListener); } diff --git a/apex/jobscheduler/service/java/com/android/server/job/controllers/BatteryController.java b/apex/jobscheduler/service/java/com/android/server/job/controllers/BatteryController.java index 5246f2bf838b..ddbc2ecf5e3e 100644 --- a/apex/jobscheduler/service/java/com/android/server/job/controllers/BatteryController.java +++ b/apex/jobscheduler/service/java/com/android/server/job/controllers/BatteryController.java @@ -78,11 +78,15 @@ public final class BatteryController extends RestrictingController { FlexibilityController flexibilityController) { super(service); mPowerTracker = new PowerTracker(); - mPowerTracker.startTracking(); mFlexibilityController = flexibilityController; } @Override + public void startTrackingLocked() { + mPowerTracker.startTracking(); + } + + @Override public void maybeStartTrackingJobLocked(JobStatus taskStatus, JobStatus lastJob) { if (taskStatus.hasPowerConstraint()) { final long nowElapsed = sElapsedRealtimeClock.millis(); diff --git a/apex/jobscheduler/service/java/com/android/server/job/controllers/ComponentController.java b/apex/jobscheduler/service/java/com/android/server/job/controllers/ComponentController.java index b029e0075dc2..9d4cba18b4b1 100644 --- a/apex/jobscheduler/service/java/com/android/server/job/controllers/ComponentController.java +++ b/apex/jobscheduler/service/java/com/android/server/job/controllers/ComponentController.java @@ -106,7 +106,10 @@ public class ComponentController extends StateController { public ComponentController(JobSchedulerService service) { super(service); + } + @Override + public void startTrackingLocked() { final IntentFilter filter = new IntentFilter(); filter.addAction(Intent.ACTION_PACKAGE_ADDED); filter.addAction(Intent.ACTION_PACKAGE_CHANGED); diff --git a/apex/jobscheduler/service/java/com/android/server/job/controllers/FlexibilityController.java b/apex/jobscheduler/service/java/com/android/server/job/controllers/FlexibilityController.java index a900d162ab96..13a474ccf451 100644 --- a/apex/jobscheduler/service/java/com/android/server/job/controllers/FlexibilityController.java +++ b/apex/jobscheduler/service/java/com/android/server/job/controllers/FlexibilityController.java @@ -201,6 +201,10 @@ public final class FlexibilityController extends StateController { mPercentToDropConstraints = mFcConfig.DEFAULT_PERCENT_TO_DROP_FLEXIBLE_CONSTRAINTS; mPrefetchController = prefetchController; + } + + @Override + public void startTrackingLocked() { if (mFlexibilityEnabled) { mPrefetchController.registerPrefetchChangedListener(mPrefetchChangedListener); } diff --git a/apex/jobscheduler/service/java/com/android/server/job/controllers/IdleController.java b/apex/jobscheduler/service/java/com/android/server/job/controllers/IdleController.java index 47d3fd5bc8c4..adee322f60cf 100644 --- a/apex/jobscheduler/service/java/com/android/server/job/controllers/IdleController.java +++ b/apex/jobscheduler/service/java/com/android/server/job/controllers/IdleController.java @@ -19,7 +19,6 @@ package com.android.server.job.controllers; import static com.android.server.job.JobSchedulerService.sElapsedRealtimeClock; import android.annotation.NonNull; -import android.content.Context; import android.content.pm.PackageManager; import android.os.UserHandle; import android.provider.DeviceConfig; @@ -56,7 +55,7 @@ public final class IdleController extends RestrictingController implements Idlen public IdleController(JobSchedulerService service, FlexibilityController flexibilityController) { super(service); - initIdleStateTracking(mContext); + initIdleStateTracker(); mFlexibilityController = flexibilityController; } @@ -127,7 +126,7 @@ public final class IdleController extends RestrictingController implements Idlen * Idle state tracking, and messaging with the task manager when * significant state changes occur */ - private void initIdleStateTracking(Context ctx) { + private void initIdleStateTracker() { final boolean isCar = mContext.getPackageManager().hasSystemFeature( PackageManager.FEATURE_AUTOMOTIVE); if (isCar) { @@ -135,7 +134,11 @@ public final class IdleController extends RestrictingController implements Idlen } else { mIdleTracker = new DeviceIdlenessTracker(); } - mIdleTracker.startTracking(ctx, mService, this); + } + + @Override + public void startTrackingLocked() { + mIdleTracker.startTracking(mContext, mService, this); } @Override diff --git a/apex/jobscheduler/service/java/com/android/server/job/controllers/PrefetchController.java b/apex/jobscheduler/service/java/com/android/server/job/controllers/PrefetchController.java index fdeb072cacb3..865e5417faf2 100644 --- a/apex/jobscheduler/service/java/com/android/server/job/controllers/PrefetchController.java +++ b/apex/jobscheduler/service/java/com/android/server/job/controllers/PrefetchController.java @@ -134,7 +134,10 @@ public class PrefetchController extends StateController { mThresholdAlarmListener = new ThresholdAlarmListener( mContext, AppSchedulingModuleThread.get().getLooper()); mUsageStatsManagerInternal = LocalServices.getService(UsageStatsManagerInternal.class); + } + @Override + public void startTrackingLocked() { mUsageStatsManagerInternal .registerLaunchTimeChangedListener(mEstimatedLaunchTimeChangedListener); } diff --git a/apex/jobscheduler/service/java/com/android/server/job/controllers/StateController.java b/apex/jobscheduler/service/java/com/android/server/job/controllers/StateController.java index 44ac798c2912..2b9205117316 100644 --- a/apex/jobscheduler/service/java/com/android/server/job/controllers/StateController.java +++ b/apex/jobscheduler/service/java/com/android/server/job/controllers/StateController.java @@ -56,6 +56,12 @@ public abstract class StateController { } /** + * Called to get the controller to start tracking relevant information. This is called before + * {@link #onSystemServicesReady()}. + */ + public void startTrackingLocked() {} + + /** * Called when the system boot phase has reached * {@link com.android.server.SystemService#PHASE_SYSTEM_SERVICES_READY}. */ @@ -67,6 +73,7 @@ public abstract class StateController { * This logic is put here so the JobManager can be completely agnostic of Controller logic. * Also called when updating a task, so implementing controllers have to be aware of * preexisting tasks. + * This will never be called before {@link #onSystemServicesReady()}. */ public abstract void maybeStartTrackingJobLocked(JobStatus jobStatus, JobStatus lastJob); diff --git a/apex/jobscheduler/service/java/com/android/server/job/controllers/StorageController.java b/apex/jobscheduler/service/java/com/android/server/job/controllers/StorageController.java index 11e2ff7bd77f..0c48c4e5a766 100644 --- a/apex/jobscheduler/service/java/com/android/server/job/controllers/StorageController.java +++ b/apex/jobscheduler/service/java/com/android/server/job/controllers/StorageController.java @@ -55,6 +55,10 @@ public final class StorageController extends StateController { public StorageController(JobSchedulerService service) { super(service); mStorageTracker = new StorageTracker(); + } + + @Override + public void startTrackingLocked() { mStorageTracker.startTracking(); } |