summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Kweku Adams <kwekua@google.com> 2022-10-14 20:12:18 +0000
committer Kweku Adams <kwekua@google.com> 2022-10-18 22:06:23 +0000
commitbc72f48fb451a52681d273e10226d1045aaec99f (patch)
treeb8feaf8e4281b2ac6690259d14cb28cfc6091f9c
parentc81b5c685e6db3798d456cf85d66bbacd879d0c2 (diff)
Reject inconsistent Job-JobWorkItem scheduling.
Reject scheduling of JobWorkItems that imply network usage but are scheduled using a JobInfo that doesn't have a network constraint. Bug: 241104082 Test: atest CtsJobSchedulerTestCases:JobWorkItemTest Change-Id: I0c74eae37d9cb60f0e671dda252a0d4f15c83070
-rw-r--r--apex/jobscheduler/service/java/com/android/server/job/JobSchedulerService.java44
1 files changed, 39 insertions, 5 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 bdd1fc548af2..048f4a48ab52 100644
--- a/apex/jobscheduler/service/java/com/android/server/job/JobSchedulerService.java
+++ b/apex/jobscheduler/service/java/com/android/server/job/JobSchedulerService.java
@@ -40,6 +40,8 @@ import android.app.job.JobSnapshot;
import android.app.job.JobWorkItem;
import android.app.usage.UsageStatsManager;
import android.app.usage.UsageStatsManagerInternal;
+import android.compat.annotation.ChangeId;
+import android.compat.annotation.EnabledAfter;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.Context;
@@ -58,6 +60,7 @@ import android.os.BatteryManager;
import android.os.BatteryManagerInternal;
import android.os.BatteryStatsInternal;
import android.os.Binder;
+import android.os.Build;
import android.os.Handler;
import android.os.LimitExceededException;
import android.os.Looper;
@@ -166,6 +169,14 @@ public class JobSchedulerService extends com.android.server.SystemService
/** The number of the most recently completed jobs to keep track of for debugging purposes. */
private static final int NUM_COMPLETED_JOB_HISTORY = 20;
+ /**
+ * Require the hosting job to specify a network constraint if the included
+ * {@link android.app.job.JobWorkItem} indicates network usage.
+ */
+ @ChangeId
+ @EnabledAfter(targetSdkVersion = Build.VERSION_CODES.TIRAMISU)
+ private static final long REQUIRE_NETWORK_CONSTRAINT_FOR_NETWORK_JOB_WORK_ITEMS = 241104082L;
+
@VisibleForTesting
public static Clock sSystemClock = Clock.systemUTC();
@@ -3147,7 +3158,11 @@ public class JobSchedulerService extends com.android.server.SystemService
return canPersist;
}
- private void validateJobFlags(JobInfo job, int callingUid) {
+ private void validateJob(JobInfo job, int callingUid) {
+ validateJob(job, callingUid, null);
+ }
+
+ private void validateJob(JobInfo job, int callingUid, @Nullable JobWorkItem jobWorkItem) {
job.enforceValidity(
CompatChanges.isChangeEnabled(
JobInfo.DISALLOW_DEADLINES_FOR_PREFETCH_JOBS, callingUid));
@@ -3164,6 +3179,26 @@ public class JobSchedulerService extends com.android.server.SystemService
+ " FLAG_EXEMPT_FROM_APP_STANDBY. Job=" + job);
}
}
+ if (jobWorkItem != null) {
+ jobWorkItem.enforceValidity();
+ if (jobWorkItem.getEstimatedNetworkDownloadBytes() != JobInfo.NETWORK_BYTES_UNKNOWN
+ || jobWorkItem.getEstimatedNetworkUploadBytes()
+ != JobInfo.NETWORK_BYTES_UNKNOWN
+ || jobWorkItem.getMinimumNetworkChunkBytes()
+ != JobInfo.NETWORK_BYTES_UNKNOWN) {
+ if (job.getRequiredNetwork() == null) {
+ final String errorMsg = "JobWorkItem implies network usage"
+ + " but job doesn't specify a network constraint";
+ if (CompatChanges.isChangeEnabled(
+ REQUIRE_NETWORK_CONSTRAINT_FOR_NETWORK_JOB_WORK_ITEMS,
+ callingUid)) {
+ throw new IllegalArgumentException(errorMsg);
+ } else {
+ Slog.e(TAG, errorMsg);
+ }
+ }
+ }
+ }
}
// IJobScheduler implementation
@@ -3184,7 +3219,7 @@ public class JobSchedulerService extends com.android.server.SystemService
}
}
- validateJobFlags(job, uid);
+ validateJob(job, uid);
final long ident = Binder.clearCallingIdentity();
try {
@@ -3212,8 +3247,7 @@ public class JobSchedulerService extends com.android.server.SystemService
throw new NullPointerException("work is null");
}
- work.enforceValidity();
- validateJobFlags(job, uid);
+ validateJob(job, uid, work);
final long ident = Binder.clearCallingIdentity();
try {
@@ -3244,7 +3278,7 @@ public class JobSchedulerService extends com.android.server.SystemService
+ " not permitted to schedule jobs for other apps");
}
- validateJobFlags(job, callerUid);
+ validateJob(job, callerUid);
final long ident = Binder.clearCallingIdentity();
try {