diff options
5 files changed, 25 insertions, 1 deletions
diff --git a/core/java/android/content/Context.java b/core/java/android/content/Context.java index efb3bfc1f6d2..49a29f0ac80d 100644 --- a/core/java/android/content/Context.java +++ b/core/java/android/content/Context.java @@ -338,6 +338,16 @@ public abstract class Context { public static final int BIND_ADJUST_BELOW_PERCEPTIBLE = 0x0100; /** + * Flag for {@link #bindService}: This flag is intended to be used only by the system to adjust + * the scheduling policy for IMEs (and any other out-of-process user-visible components that + * work closely with the top app) so that UI hosted in such services can have the same + * scheduling policy (e.g. SCHED_FIFO when it is enabled and TOP_APP_PRIORITY_BOOST otherwise) + * as the actual top-app. + * @hide + */ + public static final int BIND_SCHEDULE_LIKE_TOP_APP = 0x00080000; + + /** * Flag for {@link #bindService}: allow background activity starts from the bound service's * process. * This flag is only respected if the caller is holding diff --git a/services/core/java/com/android/server/am/ActiveServices.java b/services/core/java/com/android/server/am/ActiveServices.java index 627010606b31..e357ce8ce929 100644 --- a/services/core/java/com/android/server/am/ActiveServices.java +++ b/services/core/java/com/android/server/am/ActiveServices.java @@ -1600,6 +1600,11 @@ public final class ActiveServices { "BIND_TREAT_LIKE_ACTIVITY"); } + if ((flags & Context.BIND_SCHEDULE_LIKE_TOP_APP) != 0 && !isCallerSystem) { + throw new SecurityException("Non-system caller (pid=" + Binder.getCallingPid() + + ") set BIND_SCHEDULE_LIKE_TOP_APP when binding service " + service); + } + if ((flags & Context.BIND_ALLOW_WHITELIST_MANAGEMENT) != 0 && !isCallerSystem) { throw new SecurityException( "Non-system caller " + caller + " (pid=" + Binder.getCallingPid() diff --git a/services/core/java/com/android/server/am/ConnectionRecord.java b/services/core/java/com/android/server/am/ConnectionRecord.java index af1031e5b887..a1c941e085a6 100644 --- a/services/core/java/com/android/server/am/ConnectionRecord.java +++ b/services/core/java/com/android/server/am/ConnectionRecord.java @@ -192,6 +192,9 @@ final class ConnectionRecord { if ((flags&Context.BIND_TREAT_LIKE_ACTIVITY) != 0) { sb.append("LACT "); } + if ((flags & Context.BIND_SCHEDULE_LIKE_TOP_APP) != 0) { + sb.append("SLTA "); + } if ((flags&Context.BIND_VISIBLE) != 0) { sb.append("VIS "); } diff --git a/services/core/java/com/android/server/am/OomAdjuster.java b/services/core/java/com/android/server/am/OomAdjuster.java index 4e03b72e6ce6..9056f76c4086 100644 --- a/services/core/java/com/android/server/am/OomAdjuster.java +++ b/services/core/java/com/android/server/am/OomAdjuster.java @@ -1294,6 +1294,11 @@ public final class OomAdjuster { ActivityManager.PROCESS_STATE_IMPORTANT_BACKGROUND; } } + if (schedGroup < ProcessList.SCHED_GROUP_TOP_APP + && (cr.flags & Context.BIND_SCHEDULE_LIKE_TOP_APP) != 0) { + schedGroup = ProcessList.SCHED_GROUP_TOP_APP; + } + if (!trackedProcState) { cr.trackProcState(clientProcState, mAdjSeq, now); } diff --git a/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java b/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java index 150303aa6a46..647e95284534 100644 --- a/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java +++ b/services/core/java/com/android/server/inputmethod/InputMethodManagerService.java @@ -231,7 +231,8 @@ public class InputMethodManagerService extends IInputMethodManager.Stub Context.BIND_AUTO_CREATE | Context.BIND_TREAT_LIKE_ACTIVITY | Context.BIND_FOREGROUND_SERVICE - | Context.BIND_SHOWING_UI; + | Context.BIND_SHOWING_UI + | Context.BIND_SCHEDULE_LIKE_TOP_APP; @Retention(SOURCE) @IntDef({HardKeyboardBehavior.WIRELESS_AFFORDANCE, HardKeyboardBehavior.WIRED_AFFORDANCE}) |