summaryrefslogtreecommitdiff
path: root/apex
diff options
context:
space:
mode:
authorKweku Adams <kwekua@google.com>2023-12-01 01:58:13 +0000
committerAndroid (Google) Code Review <android-gerrit@google.com>2023-12-01 01:58:13 +0000
commit7c88043780c4535f516643e08f08edc4686e9866 (patch)
treeb4c8c2de7788b9848af56e6613fd48fdd4a43f2c /apex
parent28e5463be0e0ed5dc1a64ff87cfb84676ee1ac13 (diff)
parentea77a1ea9855eb62556573203a1e4a56f9869d2b (diff)
downloadbase-7c88043780c4535f516643e08f08edc4686e9866.tar.gz
Merge "Move some tracking starts out of constructor." into main
Diffstat (limited to 'apex')
-rw-r--r--apex/jobscheduler/service/java/com/android/server/job/JobSchedulerService.java31
-rw-r--r--apex/jobscheduler/service/java/com/android/server/job/controllers/BackgroundJobsController.java4
-rw-r--r--apex/jobscheduler/service/java/com/android/server/job/controllers/BatteryController.java6
-rw-r--r--apex/jobscheduler/service/java/com/android/server/job/controllers/ComponentController.java3
-rw-r--r--apex/jobscheduler/service/java/com/android/server/job/controllers/FlexibilityController.java4
-rw-r--r--apex/jobscheduler/service/java/com/android/server/job/controllers/IdleController.java11
-rw-r--r--apex/jobscheduler/service/java/com/android/server/job/controllers/PrefetchController.java3
-rw-r--r--apex/jobscheduler/service/java/com/android/server/job/controllers/StateController.java7
-rw-r--r--apex/jobscheduler/service/java/com/android/server/job/controllers/StorageController.java4
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();
}