summaryrefslogtreecommitdiff
path: root/apex
diff options
context:
space:
mode:
author Xin Guan <guanxin@google.com> 2024-12-05 20:44:40 +0000
committer Xin Guan <guanxin@google.com> 2024-12-18 06:36:40 -0800
commit56931489233ab0049a6541ef698f55517a0e051c (patch)
tree85dc1be1f578fdc26c74839085db3957686e9faf /apex
parent147826dd28a7209f1109d3084e3705ba089da237 (diff)
JobScheduler: Update wakelock tag with additional job type info
Apply the job type info to the wakelock tag for a better attribution Bug: 381880530 Test: atest CtsJobSchedulerTestCases:android.jobscheduler.cts.JobSchedulingTest Flag: android.app.job.add_type_info_to_wakelock_tag Change-Id: Ib05f00a575d9055999cd843622e801b654172325
Diffstat (limited to 'apex')
-rw-r--r--apex/jobscheduler/framework/aconfig/job.aconfig11
-rw-r--r--apex/jobscheduler/service/java/com/android/server/job/JobSchedulerService.java38
-rw-r--r--apex/jobscheduler/service/java/com/android/server/job/JobSchedulerShellCommand.java48
-rw-r--r--apex/jobscheduler/service/java/com/android/server/job/controllers/JobStatus.java7
4 files changed, 103 insertions, 1 deletions
diff --git a/apex/jobscheduler/framework/aconfig/job.aconfig b/apex/jobscheduler/framework/aconfig/job.aconfig
index 63624d8cad4a..8b1a40c7f833 100644
--- a/apex/jobscheduler/framework/aconfig/job.aconfig
+++ b/apex/jobscheduler/framework/aconfig/job.aconfig
@@ -55,3 +55,14 @@ flag {
description: "Introduce a new getPendingJobReasonsHistory() API which returns a limited historical view of getPendingJobReasons()."
bug: "372031023"
}
+
+
+flag {
+ name: "add_type_info_to_wakelock_tag"
+ namespace: "backstage_power"
+ description: "Append the job type info to wakelock tag"
+ bug: "381880530"
+ metadata {
+ purpose: PURPOSE_BUGFIX
+ }
+}
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 4335cae65a3c..fe6daa57ecd0 100644
--- a/apex/jobscheduler/service/java/com/android/server/job/JobSchedulerService.java
+++ b/apex/jobscheduler/service/java/com/android/server/job/JobSchedulerService.java
@@ -5766,6 +5766,41 @@ public class JobSchedulerService extends com.android.server.SystemService
}
// Shell command infrastructure
+ int getJobWakelockTag(PrintWriter pw, String pkgName, int userId, @Nullable String namespace,
+ int jobId) {
+ try {
+ final int uid = AppGlobals.getPackageManager().getPackageUid(pkgName, 0,
+ userId != UserHandle.USER_ALL ? userId : UserHandle.USER_SYSTEM);
+ if (uid < 0) {
+ pw.print("unknown(");
+ pw.print(pkgName);
+ pw.println(")");
+ return JobSchedulerShellCommand.CMD_ERR_NO_PACKAGE;
+ }
+
+ synchronized (mLock) {
+ final JobStatus js = mJobs.getJobByUidAndJobId(uid, namespace, jobId);
+ if (DEBUG) {
+ Slog.d(TAG, "get-job-wakelock-tag " + namespace
+ + "/" + uid + "/" + jobId + ": " + js);
+ }
+ if (js == null) {
+ pw.print("unknown(");
+ UserHandle.formatUid(pw, uid);
+ pw.print("/jid");
+ pw.print(jobId);
+ pw.println(")");
+ return JobSchedulerShellCommand.CMD_ERR_NO_JOB;
+ }
+
+ pw.println(js.getWakelockTag());
+ }
+ } catch (RemoteException e) {
+ // can't happen
+ }
+ return 0;
+ }
+
int getJobState(PrintWriter pw, String pkgName, int userId, @Nullable String namespace,
int jobId) {
try {
@@ -5945,6 +5980,9 @@ public class JobSchedulerService extends com.android.server.SystemService
pw.print(android.app.job.Flags.FLAG_GET_PENDING_JOB_REASONS_HISTORY_API,
android.app.job.Flags.getPendingJobReasonsHistoryApi());
pw.println();
+ pw.print(android.app.job.Flags.FLAG_ADD_TYPE_INFO_TO_WAKELOCK_TAG,
+ android.app.job.Flags.addTypeInfoToWakelockTag());
+ pw.println();
pw.decreaseIndent();
pw.println();
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 42c8250a6185..633598e85fa9 100644
--- a/apex/jobscheduler/service/java/com/android/server/job/JobSchedulerShellCommand.java
+++ b/apex/jobscheduler/service/java/com/android/server/job/JobSchedulerShellCommand.java
@@ -86,6 +86,8 @@ public final class JobSchedulerShellCommand extends BasicShellCommandHandler {
return getTransferredNetworkBytes(pw, BYTE_OPTION_DOWNLOAD);
case "get-transferred-upload-bytes":
return getTransferredNetworkBytes(pw, BYTE_OPTION_UPLOAD);
+ case "get-job-wakelock-tag":
+ return getJobWakelockTag(pw);
case "get-job-state":
return getJobState(pw);
case "heartbeat":
@@ -424,6 +426,9 @@ public final class JobSchedulerShellCommand extends BasicShellCommandHandler {
case android.app.job.Flags.FLAG_JOB_DEBUG_INFO_APIS:
pw.println(android.app.job.Flags.jobDebugInfoApis());
break;
+ case android.app.job.Flags.FLAG_ADD_TYPE_INFO_TO_WAKELOCK_TAG:
+ pw.println(android.app.job.Flags.addTypeInfoToWakelockTag());
+ break;
case com.android.server.job.Flags.FLAG_BATCH_ACTIVE_BUCKET_JOBS:
pw.println(com.android.server.job.Flags.batchActiveBucketJobs());
break;
@@ -581,6 +586,49 @@ public final class JobSchedulerShellCommand extends BasicShellCommandHandler {
}
}
+ private int getJobWakelockTag(PrintWriter pw) throws Exception {
+ checkPermission("get job wakelock tag");
+
+ int userId = UserHandle.USER_SYSTEM;
+ String namespace = null;
+
+ String opt;
+ while ((opt = getNextOption()) != null) {
+ switch (opt) {
+ case "-u":
+ case "--user":
+ userId = UserHandle.parseUserArg(getNextArgRequired());
+ break;
+
+ case "-n":
+ case "--namespace":
+ namespace = getNextArgRequired();
+ break;
+
+ default:
+ pw.println("Error: unknown option '" + opt + "'");
+ return -1;
+ }
+ }
+
+ if (userId == UserHandle.USER_CURRENT) {
+ userId = ActivityManager.getCurrentUser();
+ }
+
+ final String pkgName = getNextArgRequired();
+ final String jobIdStr = getNextArgRequired();
+ final int jobId = Integer.parseInt(jobIdStr);
+
+ final long ident = Binder.clearCallingIdentity();
+ try {
+ int ret = mInternal.getJobWakelockTag(pw, pkgName, userId, namespace, jobId);
+ printError(ret, pkgName, userId, namespace, jobId);
+ return ret;
+ } finally {
+ Binder.restoreCallingIdentity(ident);
+ }
+ }
+
private int getJobState(PrintWriter pw) throws Exception {
checkPermission("get job state");
diff --git a/apex/jobscheduler/service/java/com/android/server/job/controllers/JobStatus.java b/apex/jobscheduler/service/java/com/android/server/job/controllers/JobStatus.java
index 5a33aa0ab7eb..4b9d7364e27b 100644
--- a/apex/jobscheduler/service/java/com/android/server/job/controllers/JobStatus.java
+++ b/apex/jobscheduler/service/java/com/android/server/job/controllers/JobStatus.java
@@ -1459,7 +1459,12 @@ public final class JobStatus {
@NonNull
public String getWakelockTag() {
if (mWakelockTag == null) {
- mWakelockTag = "*job*/" + this.batteryName;
+ mWakelockTag = "*job*";
+ if (android.app.job.Flags.addTypeInfoToWakelockTag()) {
+ mWakelockTag += (isRequestedExpeditedJob()
+ ? "e" : (getJob().isUserInitiated() ? "u" : "r"));
+ }
+ mWakelockTag += "/" + this.batteryName;
}
return mWakelockTag;
}