From c3d14d17d7440d530e5c2469d477366c64c1b267 Mon Sep 17 00:00:00 2001 From: Kweku Adams <kwekua@google.com> Date: Tue, 24 Oct 2023 20:02:02 +0000 Subject: [PATCH] Modify wakelock tag. 1. Remove the job ID from the wakelock tag. 2. Lazily load the tag when needed to reduce memory usage of jobs waiting for constraints to be satisfied. 3. Remove redundant log line. Bug: 273758274 Bug: 302348192 Bug: 307556230 Test: atest CtsJobSchedulerTestCases Test: Manually remove output of `adb shell dumpsys jobscheduler` Change-Id: If8547d23ced90b17225ab8efd758ac735655687e --- .../server/job/JobConcurrencyManager.java | 4 ++-- .../server/job/JobSchedulerService.java | 1 - .../android/server/job/JobServiceContext.java | 3 ++- .../server/job/controllers/JobStatus.java | 21 +++++++++++++------ 4 files changed, 19 insertions(+), 10 deletions(-) diff --git a/apex/jobscheduler/service/java/com/android/server/job/JobConcurrencyManager.java b/apex/jobscheduler/service/java/com/android/server/job/JobConcurrencyManager.java index 5bf2eb942a6b1..6550f26436d42 100644 --- a/apex/jobscheduler/service/java/com/android/server/job/JobConcurrencyManager.java +++ b/apex/jobscheduler/service/java/com/android/server/job/JobConcurrencyManager.java @@ -1518,8 +1518,8 @@ class JobConcurrencyManager { @WorkType final int workType) { final List<StateController> controllers = mService.mControllers; final int numControllers = controllers.size(); - final PowerManager.WakeLock wl = - mPowerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, jobStatus.getTag()); + final PowerManager.WakeLock wl = mPowerManager.newWakeLock( + PowerManager.PARTIAL_WAKE_LOCK, jobStatus.getWakelockTag()); wl.setWorkSource(mService.deriveWorkSource( jobStatus.getSourceUid(), jobStatus.getSourcePackageName())); wl.setReferenceCounted(false); 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 bbe1485ddcd49..592aff80f618c 100644 --- a/apex/jobscheduler/service/java/com/android/server/job/JobSchedulerService.java +++ b/apex/jobscheduler/service/java/com/android/server/job/JobSchedulerService.java @@ -5512,7 +5512,6 @@ public class JobSchedulerService extends com.android.server.SystemService pw.print("Evaluated bias: "); pw.println(JobInfo.getBiasString(bias)); - pw.print("Tag: "); pw.println(job.getTag()); pw.print("Enq: "); TimeUtils.formatDuration(job.madePending - nowUptime, pw); pw.decreaseIndent(); diff --git a/apex/jobscheduler/service/java/com/android/server/job/JobServiceContext.java b/apex/jobscheduler/service/java/com/android/server/job/JobServiceContext.java index f47766ed0393f..79653f0e0a918 100644 --- a/apex/jobscheduler/service/java/com/android/server/job/JobServiceContext.java +++ b/apex/jobscheduler/service/java/com/android/server/job/JobServiceContext.java @@ -398,7 +398,8 @@ public final class JobServiceContext implements ServiceConnection { // it was inflated from disk with not-yet-coherent delay/deadline bounds. job.clearPersistedUtcTimes(); - mWakeLock = mPowerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, job.getTag()); + mWakeLock = mPowerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, + job.getWakelockTag()); mWakeLock.setWorkSource( mService.deriveWorkSource(job.getSourceUid(), job.getSourcePackageName())); mWakeLock.setReferenceCounted(false); 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 458ff35c30ee9..1fb54d59179b3 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 @@ -253,7 +253,12 @@ public final class JobStatus { /** An ID that can be used to uniquely identify the job when logging statsd metrics. */ private final long mLoggingJobId; - final String tag; + /** + * Tag to identify the wakelock held for this job. Lazily loaded in + * {@link #getWakelockTag()} since it's not typically needed until the job is about to run. + */ + @Nullable + private String mWakelockTag; /** Whether this job was scheduled by one app on behalf of another. */ final boolean mIsProxyJob; @@ -627,7 +632,6 @@ public final class JobStatus { this.batteryName = this.sourceTag != null ? bnNamespace + this.sourceTag + ":" + job.getService().getPackageName() : bnNamespace + job.getService().flattenToShortString(); - this.tag = "*job*/" + this.batteryName + "#" + job.getId(); final String componentPackage = job.getService().getPackageName(); mIsProxyJob = !this.sourcePackageName.equals(componentPackage); @@ -1321,8 +1325,13 @@ public final class JobStatus { return batteryName; } - public String getTag() { - return tag; + /** Return the String to be used as the tag for the wakelock held for this job. */ + @NonNull + public String getWakelockTag() { + if (mWakelockTag == null) { + mWakelockTag = "*job*/" + this.batteryName; + } + return mWakelockTag; } public int getBias() { @@ -2639,7 +2648,7 @@ public final class JobStatus { @NeverCompile // Avoid size overhead of debugging code. public void dump(IndentingPrintWriter pw, boolean full, long nowElapsed) { UserHandle.formatUid(pw, callingUid); - pw.print(" tag="); pw.println(tag); + pw.print(" tag="); pw.println(getWakelockTag()); pw.print("Source: uid="); UserHandle.formatUid(pw, getSourceUid()); pw.print(" user="); pw.print(getSourceUserId()); @@ -2955,7 +2964,7 @@ public final class JobStatus { final long token = proto.start(fieldId); proto.write(JobStatusDumpProto.CALLING_UID, callingUid); - proto.write(JobStatusDumpProto.TAG, tag); + proto.write(JobStatusDumpProto.TAG, getWakelockTag()); proto.write(JobStatusDumpProto.SOURCE_UID, getSourceUid()); proto.write(JobStatusDumpProto.SOURCE_USER_ID, getSourceUserId()); proto.write(JobStatusDumpProto.SOURCE_PACKAGE_NAME, getSourcePackageName()); -- GitLab