diff --git a/core/proto/android/server/jobscheduler.proto b/core/proto/android/server/jobscheduler.proto index 2d31c5ad6696f..69abed30234db 100644 --- a/core/proto/android/server/jobscheduler.proto +++ b/core/proto/android/server/jobscheduler.proto @@ -36,6 +36,11 @@ message JobSchedulerServiceDumpProto { optional ConstantsProto settings = 1; + optional int32 current_heartbeat = 14; + repeated int32 next_heartbeat = 15; + optional int64 last_heartbeat_time_millis = 16; + optional int64 next_heartbeat_time_millis = 17; + repeated int32 started_users = 2; message RegisteredJob { @@ -54,6 +59,8 @@ message JobSchedulerServiceDumpProto { optional bool is_job_currently_active = 6; optional bool is_uid_backing_up = 7; optional bool is_component_present = 8; + + optional int64 last_run_heartbeat = 9; } repeated RegisteredJob registered_jobs = 3; diff --git a/services/core/java/com/android/server/job/JobSchedulerService.java b/services/core/java/com/android/server/job/JobSchedulerService.java index 55d578519e907..0e7e5401caafd 100644 --- a/services/core/java/com/android/server/job/JobSchedulerService.java +++ b/services/core/java/com/android/server/job/JobSchedulerService.java @@ -87,6 +87,7 @@ import com.android.server.FgThread; import com.android.server.LocalServices; import com.android.server.job.JobSchedulerServiceDumpProto.ActiveJob; import com.android.server.job.JobSchedulerServiceDumpProto.PendingJob; +import com.android.server.job.JobSchedulerServiceDumpProto.RegisteredJob; import com.android.server.job.controllers.AppIdleController; import com.android.server.job.controllers.BackgroundJobsController; import com.android.server.job.controllers.BatteryController; @@ -2937,6 +2938,23 @@ public final class JobSchedulerService extends com.android.server.SystemService synchronized (mLock) { mConstants.dump(pw); pw.println(); + + pw.println(" Heartbeat:"); + pw.print(" Current: "); pw.println(mHeartbeat); + pw.println(" Next"); + pw.print(" ACTIVE: "); pw.println(mNextBucketHeartbeat[0]); + pw.print(" WORKING: "); pw.println(mNextBucketHeartbeat[1]); + pw.print(" FREQUENT: "); pw.println(mNextBucketHeartbeat[2]); + pw.print(" RARE: "); pw.println(mNextBucketHeartbeat[3]); + pw.print(" Last heartbeat: "); + TimeUtils.formatDuration(mLastHeartbeatTime, nowElapsed, pw); + pw.println(); + pw.print(" Next heartbeat: "); + TimeUtils.formatDuration(mLastHeartbeatTime + mConstants.STANDBY_HEARTBEAT_TIME, + nowElapsed, pw); + pw.println(); + pw.println(); + pw.println("Started users: " + Arrays.toString(mStartedUsers)); pw.print("Registered "); pw.print(mJobs.size()); @@ -2954,6 +2972,10 @@ public final class JobSchedulerService extends com.android.server.SystemService } job.dump(pw, " ", true, nowElapsed); + pw.print(" Last run heartbeat: "); + pw.print(heartbeatWhenJobsLastRun(job)); + pw.println(); + pw.print(" Ready: "); pw.print(isReadyToBeExecutedLocked(job)); pw.print(" (job="); @@ -3096,6 +3118,16 @@ public final class JobSchedulerService extends com.android.server.SystemService synchronized (mLock) { mConstants.dump(proto, JobSchedulerServiceDumpProto.SETTINGS); + proto.write(JobSchedulerServiceDumpProto.CURRENT_HEARTBEAT, mHeartbeat); + proto.write(JobSchedulerServiceDumpProto.NEXT_HEARTBEAT, mNextBucketHeartbeat[0]); + proto.write(JobSchedulerServiceDumpProto.NEXT_HEARTBEAT, mNextBucketHeartbeat[1]); + proto.write(JobSchedulerServiceDumpProto.NEXT_HEARTBEAT, mNextBucketHeartbeat[2]); + proto.write(JobSchedulerServiceDumpProto.NEXT_HEARTBEAT, mNextBucketHeartbeat[3]); + proto.write(JobSchedulerServiceDumpProto.LAST_HEARTBEAT_TIME_MILLIS, + mLastHeartbeatTime - nowUptime); + proto.write(JobSchedulerServiceDumpProto.NEXT_HEARTBEAT_TIME_MILLIS, + mLastHeartbeatTime + mConstants.STANDBY_HEARTBEAT_TIME - nowUptime); + for (int u : mStartedUsers) { proto.write(JobSchedulerServiceDumpProto.STARTED_USERS, u); } @@ -3134,6 +3166,7 @@ public final class JobSchedulerService extends com.android.server.SystemService } proto.write(JobSchedulerServiceDumpProto.RegisteredJob.IS_COMPONENT_PRESENT, componentPresent); + proto.write(RegisteredJob.LAST_RUN_HEARTBEAT, heartbeatWhenJobsLastRun(job)); proto.end(rjToken); }