Merge "Pin sched group of service processes with binding flag SLTA at top" into sc-dev
This commit is contained in:
@@ -1864,6 +1864,7 @@ public final class OomAdjuster {
|
|||||||
}
|
}
|
||||||
|
|
||||||
int capabilityFromFGS = 0; // capability from foreground service.
|
int capabilityFromFGS = 0; // capability from foreground service.
|
||||||
|
boolean scheduleLikeTopApp = false;
|
||||||
for (int is = psr.numberOfRunningServices() - 1;
|
for (int is = psr.numberOfRunningServices() - 1;
|
||||||
is >= 0 && (adj > ProcessList.FOREGROUND_APP_ADJ
|
is >= 0 && (adj > ProcessList.FOREGROUND_APP_ADJ
|
||||||
|| schedGroup == ProcessList.SCHED_GROUP_BACKGROUND
|
|| schedGroup == ProcessList.SCHED_GROUP_BACKGROUND
|
||||||
@@ -1975,6 +1976,8 @@ public final class OomAdjuster {
|
|||||||
int clientAdj = cstate.getCurRawAdj();
|
int clientAdj = cstate.getCurRawAdj();
|
||||||
int clientProcState = cstate.getCurRawProcState();
|
int clientProcState = cstate.getCurRawProcState();
|
||||||
|
|
||||||
|
final boolean clientIsSystem = clientProcState < PROCESS_STATE_TOP;
|
||||||
|
|
||||||
// pass client's mAllowStartFgs to the app if client is not persistent process.
|
// pass client's mAllowStartFgs to the app if client is not persistent process.
|
||||||
if (cstate.getAllowedStartFgs() != REASON_DENIED
|
if (cstate.getAllowedStartFgs() != REASON_DENIED
|
||||||
&& cstate.getMaxAdj() >= ProcessList.FOREGROUND_APP_ADJ) {
|
&& cstate.getMaxAdj() >= ProcessList.FOREGROUND_APP_ADJ) {
|
||||||
@@ -2170,8 +2173,10 @@ public final class OomAdjuster {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (schedGroup < ProcessList.SCHED_GROUP_TOP_APP
|
if (schedGroup < ProcessList.SCHED_GROUP_TOP_APP
|
||||||
&& (cr.flags & Context.BIND_SCHEDULE_LIKE_TOP_APP) != 0) {
|
&& (cr.flags & Context.BIND_SCHEDULE_LIKE_TOP_APP) != 0
|
||||||
|
&& clientIsSystem) {
|
||||||
schedGroup = ProcessList.SCHED_GROUP_TOP_APP;
|
schedGroup = ProcessList.SCHED_GROUP_TOP_APP;
|
||||||
|
scheduleLikeTopApp = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!trackedProcState) {
|
if (!trackedProcState) {
|
||||||
@@ -2438,7 +2443,8 @@ public final class OomAdjuster {
|
|||||||
// Put bound foreground services in a special sched group for additional
|
// Put bound foreground services in a special sched group for additional
|
||||||
// restrictions on screen off
|
// restrictions on screen off
|
||||||
if (procState >= PROCESS_STATE_BOUND_FOREGROUND_SERVICE
|
if (procState >= PROCESS_STATE_BOUND_FOREGROUND_SERVICE
|
||||||
&& mService.mWakefulness.get() != PowerManagerInternal.WAKEFULNESS_AWAKE) {
|
&& mService.mWakefulness.get() != PowerManagerInternal.WAKEFULNESS_AWAKE
|
||||||
|
&& !scheduleLikeTopApp) {
|
||||||
if (schedGroup > ProcessList.SCHED_GROUP_RESTRICTED) {
|
if (schedGroup > ProcessList.SCHED_GROUP_RESTRICTED) {
|
||||||
schedGroup = ProcessList.SCHED_GROUP_RESTRICTED;
|
schedGroup = ProcessList.SCHED_GROUP_RESTRICTED;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1359,6 +1359,52 @@ public class MockingOomAdjusterTests {
|
|||||||
SCHED_GROUP_DEFAULT);
|
SCHED_GROUP_DEFAULT);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("GuardedBy")
|
||||||
|
@Test
|
||||||
|
public void testUpdateOomAdj_DoOne_ScheduleLikeTop() {
|
||||||
|
final ProcessRecord app1 = spy(makeDefaultProcessRecord(MOCKAPP_PID, MOCKAPP_UID,
|
||||||
|
MOCKAPP_PROCESSNAME, MOCKAPP_PACKAGENAME, false));
|
||||||
|
final ProcessRecord app2 = spy(makeDefaultProcessRecord(MOCKAPP2_PID, MOCKAPP2_UID,
|
||||||
|
MOCKAPP2_PROCESSNAME, MOCKAPP2_PACKAGENAME, false));
|
||||||
|
final ProcessRecord client1 = spy(makeDefaultProcessRecord(MOCKAPP3_PID, MOCKAPP3_UID,
|
||||||
|
MOCKAPP3_PROCESSNAME, MOCKAPP3_PACKAGENAME, false));
|
||||||
|
final ProcessRecord client2 = spy(makeDefaultProcessRecord(MOCKAPP4_PID, MOCKAPP4_UID,
|
||||||
|
MOCKAPP4_PROCESSNAME, MOCKAPP4_PACKAGENAME, false));
|
||||||
|
bindService(app1, client1, null, Context.BIND_FOREGROUND_SERVICE_WHILE_AWAKE,
|
||||||
|
mock(IBinder.class));
|
||||||
|
bindService(app2, client2, null, Context.BIND_FOREGROUND_SERVICE_WHILE_AWAKE,
|
||||||
|
mock(IBinder.class));
|
||||||
|
client1.mState.setMaxAdj(PERSISTENT_PROC_ADJ);
|
||||||
|
client2.mServices.setHasForegroundServices(true, 0);
|
||||||
|
|
||||||
|
sService.mWakefulness.set(PowerManagerInternal.WAKEFULNESS_AWAKE);
|
||||||
|
sService.mOomAdjuster.updateOomAdjLocked(app1, false, OomAdjuster.OOM_ADJ_REASON_NONE);
|
||||||
|
sService.mOomAdjuster.updateOomAdjLocked(app2, false, OomAdjuster.OOM_ADJ_REASON_NONE);
|
||||||
|
|
||||||
|
assertProcStates(app1, PROCESS_STATE_BOUND_FOREGROUND_SERVICE, VISIBLE_APP_ADJ,
|
||||||
|
SCHED_GROUP_DEFAULT);
|
||||||
|
assertProcStates(app2, PROCESS_STATE_FOREGROUND_SERVICE, PERCEPTIBLE_APP_ADJ,
|
||||||
|
SCHED_GROUP_DEFAULT);
|
||||||
|
|
||||||
|
bindService(app1, client1, null, Context.BIND_SCHEDULE_LIKE_TOP_APP, mock(IBinder.class));
|
||||||
|
bindService(app2, client2, null, Context.BIND_SCHEDULE_LIKE_TOP_APP, mock(IBinder.class));
|
||||||
|
sService.mOomAdjuster.updateOomAdjLocked(app1, false, OomAdjuster.OOM_ADJ_REASON_NONE);
|
||||||
|
sService.mOomAdjuster.updateOomAdjLocked(app2, false, OomAdjuster.OOM_ADJ_REASON_NONE);
|
||||||
|
|
||||||
|
assertProcStates(app1, PROCESS_STATE_BOUND_FOREGROUND_SERVICE, VISIBLE_APP_ADJ,
|
||||||
|
SCHED_GROUP_TOP_APP);
|
||||||
|
assertProcStates(app2, PROCESS_STATE_FOREGROUND_SERVICE, PERCEPTIBLE_APP_ADJ,
|
||||||
|
SCHED_GROUP_DEFAULT);
|
||||||
|
|
||||||
|
sService.mWakefulness.set(PowerManagerInternal.WAKEFULNESS_ASLEEP);
|
||||||
|
sService.mOomAdjuster.updateOomAdjLocked(app1, false, OomAdjuster.OOM_ADJ_REASON_NONE);
|
||||||
|
sService.mOomAdjuster.updateOomAdjLocked(app2, false, OomAdjuster.OOM_ADJ_REASON_NONE);
|
||||||
|
assertProcStates(app1, PROCESS_STATE_IMPORTANT_FOREGROUND, VISIBLE_APP_ADJ,
|
||||||
|
SCHED_GROUP_TOP_APP);
|
||||||
|
assertProcStates(app2, PROCESS_STATE_FOREGROUND_SERVICE, PERCEPTIBLE_APP_ADJ,
|
||||||
|
SCHED_GROUP_DEFAULT);
|
||||||
|
}
|
||||||
|
|
||||||
@SuppressWarnings("GuardedBy")
|
@SuppressWarnings("GuardedBy")
|
||||||
@Test
|
@Test
|
||||||
public void testUpdateOomAdj_UidIdle_StopService() {
|
public void testUpdateOomAdj_UidIdle_StopService() {
|
||||||
|
|||||||
Reference in New Issue
Block a user