diff options
author | 2024-12-05 20:44:40 +0000 | |
---|---|---|
committer | 2024-12-18 06:36:40 -0800 | |
commit | 56931489233ab0049a6541ef698f55517a0e051c (patch) | |
tree | 85dc1be1f578fdc26c74839085db3957686e9faf /apex | |
parent | 147826dd28a7209f1109d3084e3705ba089da237 (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')
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; } |