Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ec8b14d0 authored by Makoto Onuki's avatar Makoto Onuki
Browse files

Prioritize FGS jobs over BFGS jobs

Also improve dumpsys output for priorities.

Also now "evaluated priority" is always printed, for easier debugging.

Bug: 111360323
Test: atest CtsJobSchedulerTestCases

Change-Id: Iee74eda5fb290cf46e7c8fdd74a0804d03328d29
parent 5d2308b3
Loading
Loading
Loading
Loading
+38 −2
Original line number Diff line number Diff line
@@ -200,12 +200,23 @@ public class JobInfo implements Parcelable {
    public static final int PRIORITY_SYNC_INITIALIZATION = 20;

    /**
     * Value of {@link #getPriority} for a foreground app (overrides the supplied
     * Value of {@link #getPriority} for a BFGS app (overrides the supplied
     * JobInfo priority if it is smaller).
     * @hide
     */
    public static final int PRIORITY_BOUND_FOREGROUND_SERVICE = 30;

    /** @hide For backward compatibility. */
    @UnsupportedAppUsage
    public static final int PRIORITY_FOREGROUND_APP = PRIORITY_BOUND_FOREGROUND_SERVICE;

    /**
     * Value of {@link #getPriority} for a FG service app (overrides the supplied
     * JobInfo priority if it is smaller).
     * @hide
     */
    @UnsupportedAppUsage
    public static final int PRIORITY_FOREGROUND_APP = 30;
    public static final int PRIORITY_FOREGROUND_SERVICE = 35;

    /**
     * Value of {@link #getPriority} for the current top app (overrides the supplied
@@ -1593,4 +1604,29 @@ public class JobInfo implements Parcelable {
            return new JobInfo(this);
        }
    }

    /**
     * Convert a priority integer into a human readable string for debugging.
     * @hide
     */
    public static String getPriorityString(int priority) {
        switch (priority) {
            case PRIORITY_DEFAULT:
                return PRIORITY_DEFAULT + " [DEFAULT]";
            case PRIORITY_SYNC_EXPEDITED:
                return PRIORITY_SYNC_EXPEDITED + " [SYNC_EXPEDITED]";
            case PRIORITY_SYNC_INITIALIZATION:
                return PRIORITY_SYNC_INITIALIZATION + " [SYNC_INITIALIZATION]";
            case PRIORITY_BOUND_FOREGROUND_SERVICE:
                return PRIORITY_BOUND_FOREGROUND_SERVICE + " [BFGS_APP]";
            case PRIORITY_FOREGROUND_SERVICE:
                return PRIORITY_FOREGROUND_SERVICE + " [FGS_APP]";
            case PRIORITY_TOP_APP:
                return PRIORITY_TOP_APP + " [TOP_APP]";

                // PRIORITY_ADJ_* are adjustments and not used as real priorities.
                // No need to convert to strings.
        }
        return priority + " [UNKNOWN]";
    }
}
+13 −16
Original line number Diff line number Diff line
@@ -1159,8 +1159,10 @@ public class JobSchedulerService extends com.android.server.SystemService
                // with just the foreground priority.  This means that persistent processes
                // can never be the top app priority...  that is fine.
                mUidPriorityOverride.put(uid, JobInfo.PRIORITY_TOP_APP);
            } else if (procState <= ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE) {
                mUidPriorityOverride.put(uid, JobInfo.PRIORITY_FOREGROUND_SERVICE);
            } else if (procState <= ActivityManager.PROCESS_STATE_BOUND_FOREGROUND_SERVICE) {
                mUidPriorityOverride.put(uid, JobInfo.PRIORITY_FOREGROUND_APP);
                mUidPriorityOverride.put(uid, JobInfo.PRIORITY_BOUND_FOREGROUND_SERVICE);
            } else {
                mUidPriorityOverride.delete(uid);
            }
@@ -2196,7 +2198,7 @@ public class JobSchedulerService extends com.android.server.SystemService

    int evaluateJobPriorityLocked(JobStatus job) {
        int priority = job.getPriority();
        if (priority >= JobInfo.PRIORITY_FOREGROUND_APP) {
        if (priority >= JobInfo.PRIORITY_BOUND_FOREGROUND_SERVICE) {
            return adjustJobPriority(priority, job);
        }
        int override = mUidPriorityOverride.get(job.getSourceUid(), 0);
@@ -3130,9 +3132,9 @@ public class JobSchedulerService extends com.android.server.SystemService
                pw.println(job.toShortString());
                job.dump(pw, "    ", false, nowElapsed);
                int priority = evaluateJobPriorityLocked(job);
                if (priority != JobInfo.PRIORITY_DEFAULT) {
                    pw.print("    Evaluated priority: "); pw.println(priority);
                }
                pw.print("    Evaluated priority: ");
                pw.println(JobInfo.getPriorityString(priority));

                pw.print("    Tag: "); pw.println(job.getTag());
                pw.print("    Enq: ");
                TimeUtils.formatDuration(job.madePending - nowUptime, pw);
@@ -3163,9 +3165,9 @@ public class JobSchedulerService extends com.android.server.SystemService
                    pw.println();
                    job.dump(pw, "    ", false, nowElapsed);
                    int priority = evaluateJobPriorityLocked(jsc.getRunningJobLocked());
                    if (priority != JobInfo.PRIORITY_DEFAULT) {
                        pw.print("    Evaluated priority: "); pw.println(priority);
                    }
                    pw.print("    Evaluated priority: ");
                    pw.println(JobInfo.getPriorityString(priority));

                    pw.print("    Active at ");
                    TimeUtils.formatDuration(job.madeActive - nowUptime, pw);
                    pw.print(", pending for ");
@@ -3283,10 +3285,7 @@ public class JobSchedulerService extends com.android.server.SystemService

                job.writeToShortProto(proto, PendingJob.INFO);
                job.dump(proto, PendingJob.DUMP, false, nowElapsed);
                int priority = evaluateJobPriorityLocked(job);
                if (priority != JobInfo.PRIORITY_DEFAULT) {
                    proto.write(PendingJob.EVALUATED_PRIORITY, priority);
                }
                proto.write(PendingJob.EVALUATED_PRIORITY, evaluateJobPriorityLocked(job));
                proto.write(PendingJob.ENQUEUED_DURATION_MS, nowUptime - job.madePending);

                proto.end(pjToken);
@@ -3318,10 +3317,8 @@ public class JobSchedulerService extends com.android.server.SystemService

                    job.dump(proto, ActiveJob.RunningJob.DUMP, false, nowElapsed);

                    int priority = evaluateJobPriorityLocked(jsc.getRunningJobLocked());
                    if (priority != JobInfo.PRIORITY_DEFAULT) {
                        proto.write(ActiveJob.RunningJob.EVALUATED_PRIORITY, priority);
                    }
                    proto.write(ActiveJob.RunningJob.EVALUATED_PRIORITY,
                            evaluateJobPriorityLocked(jsc.getRunningJobLocked()));

                    proto.write(ActiveJob.RunningJob.TIME_SINCE_MADE_ACTIVE_MS,
                            nowUptime - job.madeActive);
+2 −1
Original line number Diff line number Diff line
@@ -1321,7 +1321,8 @@ public final class JobStatus {
                pw.print(prefix); pw.println("  PERSISTED");
            }
            if (job.getPriority() != 0) {
                pw.print(prefix); pw.print("  Priority: "); pw.println(job.getPriority());
                pw.print(prefix); pw.print("  Priority: ");
                pw.println(JobInfo.getPriorityString(job.getPriority()));
            }
            if (job.getFlags() != 0) {
                pw.print(prefix); pw.print("  Flags: ");