summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Kweku Adams <kwekua@google.com> 2024-02-08 15:30:01 +0000
committer Kweku Adams <kwekua@google.com> 2024-02-08 23:04:50 +0000
commit21fd192f5b9d053c133b49b6572538873a7326b3 (patch)
treea33e125d9254c67661c044f544ccf1923d2268ce
parente7143188377ea9a5967d73538311874e7414f557 (diff)
Make it possible to check processed DeviceConfig flags.
Make it possible to track the most recently processed DeviceConfig flags and get the value that was processed to help deflake tests. Bug: 271128261 Bug: 322031031 Bug: 322871938 Bug: 323084558 Bug: 323621598 Test: atest --rerun-until-failure 25 CtsJobSchedulerTestCases:FlexibilityConstraintTest Change-Id: Iaec284b6670cef490a1ea93b5849fd5065cefe80
-rw-r--r--apex/jobscheduler/service/java/com/android/server/job/JobSchedulerService.java44
-rw-r--r--apex/jobscheduler/service/java/com/android/server/job/JobSchedulerShellCommand.java56
2 files changed, 96 insertions, 4 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 e6ee975ea6f3..2b2752620c43 100644
--- a/apex/jobscheduler/service/java/com/android/server/job/JobSchedulerService.java
+++ b/apex/jobscheduler/service/java/com/android/server/job/JobSchedulerService.java
@@ -485,6 +485,32 @@ public class JobSchedulerService extends com.android.server.SystemService
private class ConstantsObserver implements DeviceConfig.OnPropertiesChangedListener,
EconomyManagerInternal.TareStateChangeListener {
+ @Nullable
+ @GuardedBy("mLock")
+ private DeviceConfig.Properties mLastPropertiesPulled;
+ @GuardedBy("mLock")
+ private boolean mCacheConfigChanges = false;
+
+ @Nullable
+ @GuardedBy("mLock")
+ public String getValueLocked(String key) {
+ if (mLastPropertiesPulled == null) {
+ return null;
+ }
+ return mLastPropertiesPulled.getString(key, null);
+ }
+
+ @GuardedBy("mLock")
+ public void setCacheConfigChangesLocked(boolean enabled) {
+ if (enabled && !mCacheConfigChanges) {
+ mLastPropertiesPulled =
+ DeviceConfig.getProperties(DeviceConfig.NAMESPACE_JOB_SCHEDULER);
+ } else {
+ mLastPropertiesPulled = null;
+ }
+ mCacheConfigChanges = enabled;
+ }
+
public void start() {
DeviceConfig.addOnPropertiesChangedListener(DeviceConfig.NAMESPACE_JOB_SCHEDULER,
AppSchedulingModuleThread.getExecutor(), this);
@@ -513,11 +539,15 @@ public class JobSchedulerService extends com.android.server.SystemService
}
synchronized (mLock) {
+ if (mCacheConfigChanges) {
+ mLastPropertiesPulled =
+ DeviceConfig.getProperties(DeviceConfig.NAMESPACE_JOB_SCHEDULER);
+ }
for (String name : properties.getKeyset()) {
if (name == null) {
continue;
}
- if (DEBUG) {
+ if (DEBUG || mCacheConfigChanges) {
Slog.d(TAG, "DeviceConfig " + name
+ " changed to " + properties.getString(name, null));
}
@@ -5554,6 +5584,18 @@ public class JobSchedulerService extends com.android.server.SystemService
}
}
+ void setCacheConfigChanges(boolean enabled) {
+ synchronized (mLock) {
+ mConstantsObserver.setCacheConfigChangesLocked(enabled);
+ }
+ }
+
+ String getConfigValue(String key) {
+ synchronized (mLock) {
+ return mConstantsObserver.getValueLocked(key);
+ }
+ }
+
int getStorageSeq() {
synchronized (mLock) {
return mStorageController.getTracker().getSeq();
diff --git a/apex/jobscheduler/service/java/com/android/server/job/JobSchedulerShellCommand.java b/apex/jobscheduler/service/java/com/android/server/job/JobSchedulerShellCommand.java
index 90b4630e9cff..43e28888c381 100644
--- a/apex/jobscheduler/service/java/com/android/server/job/JobSchedulerShellCommand.java
+++ b/apex/jobscheduler/service/java/com/android/server/job/JobSchedulerShellCommand.java
@@ -16,6 +16,7 @@
package com.android.server.job;
+import android.Manifest;
import android.annotation.Nullable;
import android.app.ActivityManager;
import android.app.AppGlobals;
@@ -66,6 +67,8 @@ public final class JobSchedulerShellCommand extends BasicShellCommandHandler {
return getBatteryCharging(pw);
case "get-battery-not-low":
return getBatteryNotLow(pw);
+ case "get-config-value":
+ return getConfigValue(pw);
case "get-estimated-download-bytes":
return getEstimatedNetworkBytes(pw, BYTE_OPTION_DOWNLOAD);
case "get-estimated-upload-bytes":
@@ -82,6 +85,8 @@ public final class JobSchedulerShellCommand extends BasicShellCommandHandler {
return getJobState(pw);
case "heartbeat":
return doHeartbeat(pw);
+ case "cache-config-changes":
+ return cacheConfigChanges(pw);
case "reset-execution-quota":
return resetExecutionQuota(pw);
case "reset-schedule-quota":
@@ -100,13 +105,16 @@ public final class JobSchedulerShellCommand extends BasicShellCommandHandler {
}
private void checkPermission(String operation) throws Exception {
+ checkPermission(operation, Manifest.permission.CHANGE_APP_IDLE_STATE);
+ }
+
+ private void checkPermission(String operation, String permission) throws Exception {
final int uid = Binder.getCallingUid();
if (uid == 0) {
// Root can do anything.
return;
}
- final int perm = mPM.checkUidPermission(
- "android.permission.CHANGE_APP_IDLE_STATE", uid);
+ final int perm = mPM.checkUidPermission(permission, uid);
if (perm != PackageManager.PERMISSION_GRANTED) {
throw new SecurityException("Uid " + uid
+ " not permitted to " + operation);
@@ -339,7 +347,7 @@ public final class JobSchedulerShellCommand extends BasicShellCommandHandler {
}
private int getAconfigFlagState(PrintWriter pw) throws Exception {
- checkPermission("get aconfig flag state");
+ checkPermission("get aconfig flag state", Manifest.permission.DUMP);
final String flagName = getNextArgRequired();
@@ -390,6 +398,20 @@ public final class JobSchedulerShellCommand extends BasicShellCommandHandler {
return 0;
}
+ private int getConfigValue(PrintWriter pw) throws Exception {
+ checkPermission("get device config value", Manifest.permission.DUMP);
+
+ final String key = getNextArgRequired();
+
+ final long ident = Binder.clearCallingIdentity();
+ try {
+ pw.println(mInternal.getConfigValue(key));
+ return 0;
+ } finally {
+ Binder.restoreCallingIdentity(ident);
+ }
+ }
+
private int getEstimatedNetworkBytes(PrintWriter pw, int byteOption) throws Exception {
checkPermission("get estimated bytes");
@@ -540,6 +562,28 @@ public final class JobSchedulerShellCommand extends BasicShellCommandHandler {
return -1;
}
+ private int cacheConfigChanges(PrintWriter pw) throws Exception {
+ checkPermission("change config caching", Manifest.permission.DUMP);
+ String opt = getNextArgRequired();
+ boolean enabled;
+ if ("on".equals(opt)) {
+ enabled = true;
+ } else if ("off".equals(opt)) {
+ enabled = false;
+ } else {
+ getErrPrintWriter().println("Error: unknown option " + opt);
+ return 1;
+ }
+ final long ident = Binder.clearCallingIdentity();
+ try {
+ mInternal.setCacheConfigChanges(enabled);
+ pw.println("Config caching " + (enabled ? "enabled" : "disabled"));
+ } finally {
+ Binder.restoreCallingIdentity(ident);
+ }
+ return 0;
+ }
+
private int resetExecutionQuota(PrintWriter pw) throws Exception {
checkPermission("reset execution quota");
@@ -726,6 +770,9 @@ public final class JobSchedulerShellCommand extends BasicShellCommandHandler {
pw.println(" is null (no namespace).");
pw.println(" heartbeat [num]");
pw.println(" No longer used.");
+ pw.println(" cache-config-changes [on|off]");
+ pw.println(" Control caching the set of most recently processed config flags.");
+ pw.println(" Off by default. Turning on makes get-config-value useful.");
pw.println(" monitor-battery [on|off]");
pw.println(" Control monitoring of all battery changes. Off by default. Turning");
pw.println(" on makes get-battery-seq useful.");
@@ -738,6 +785,9 @@ public final class JobSchedulerShellCommand extends BasicShellCommandHandler {
pw.println(" Return whether the battery is currently considered to be charging.");
pw.println(" get-battery-not-low");
pw.println(" Return whether the battery is currently considered to not be low.");
+ pw.println(" get-config-value KEY");
+ pw.println(" Return the most recently processed and cached config value for the KEY.");
+ pw.println(" Only useful if caching is turned on with cache-config-changes.");
pw.println(" get-estimated-download-bytes [-u | --user USER_ID]"
+ " [-n | --namespace NAMESPACE] PACKAGE JOB_ID");
pw.println(" Return the most recent estimated download bytes for the job.");