Use the correct UID for proc state evaluation.

JS policy is primarily based on the source UID, not the calling UID.
Update the code and tests to evaluate the source UID state.

Bug: 253815639
Bug: 253820921
Test: atest FrameworksMockingServicesTests:FlexibilityControllerTest
Change-Id: I193b69e0809f10f38e11fe956f8dbb9c325d993b
This commit is contained in:
Kweku Adams
2022-10-17 22:18:59 +00:00
parent c81b5c685e
commit bce9f378ba
2 changed files with 20 additions and 13 deletions

View File

@@ -237,7 +237,7 @@ public final class FlexibilityController extends StateController {
@GuardedBy("mLock")
boolean isFlexibilitySatisfiedLocked(JobStatus js) {
return !mFlexibilityEnabled
|| mService.getUidBias(js.getUid()) == JobInfo.BIAS_TOP_APP
|| mService.getUidBias(js.getSourceUid()) == JobInfo.BIAS_TOP_APP
|| mService.isCurrentlyRunningLocked(js)
|| getNumSatisfiedRequiredConstraintsLocked(js)
>= js.getNumRequiredFlexibleConstraints();
@@ -587,7 +587,7 @@ public final class FlexibilityController extends StateController {
}
if (latest - nowElapsed < mDeadlineProximityLimitMs) {
if (DEBUG) {
Slog.d(TAG, "deadline proximity met: " + js.getUid());
Slog.d(TAG, "deadline proximity met: " + js);
}
mFlexibilityTracker.adjustJobsRequiredConstraints(js,
-js.getNumRequiredFlexibleConstraints(), nowElapsed);
@@ -600,7 +600,7 @@ public final class FlexibilityController extends StateController {
}
if (latest - nextTimeElapsed <= mDeadlineProximityLimitMs) {
if (DEBUG) {
Slog.d(TAG, "last alarm set: " + js.getUid());
Slog.d(TAG, "last alarm set: " + js);
}
addAlarm(js, latest - mDeadlineProximityLimitMs);
return;

View File

@@ -48,6 +48,7 @@ import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import android.app.AlarmManager;
import android.app.AppGlobals;
import android.app.job.JobInfo;
import android.content.ComponentName;
import android.content.Context;
@@ -80,11 +81,13 @@ public class FlexibilityControllerTest {
private static final String SOURCE_PACKAGE = "com.android.frameworks.mockingservicestests";
private static final int SOURCE_USER_ID = 0;
private static final long FROZEN_TIME = 100L;
private MockitoSession mMockingSession;
private FlexibilityController mFlexibilityController;
private DeviceConfig.Properties.Builder mDeviceConfigPropertiesBuilder;
private JobStore mJobStore;
private FlexibilityController.FcConfig mFcConfig;
private int mSourceUid;
@Mock
private AlarmManager mAlarmManager;
@@ -98,7 +101,7 @@ public class FlexibilityControllerTest {
private PackageManager mPackageManager;
@Before
public void setup() {
public void setup() throws Exception {
mMockingSession = mockitoSession()
.initMocks(this)
.strictness(Strictness.LENIENT)
@@ -144,6 +147,8 @@ public class FlexibilityControllerTest {
mPrefetchController);
mFcConfig = mFlexibilityController.getFcConfig();
mSourceUid = AppGlobals.getPackageManager().getPackageUid(SOURCE_PACKAGE, 0, 0);
setDeviceConfigString(KEY_PERCENTS_TO_DROP_NUM_FLEXIBLE_CONSTRAINTS, "50,60,70,80");
setDeviceConfigLong(KEY_DEADLINE_PROXIMITY_LIMIT, 0L);
setDeviceConfigBoolean(KEY_FLEXIBILITY_ENABLED, true);
@@ -648,20 +653,22 @@ public class FlexibilityControllerTest {
public void testTopAppBypass() {
JobInfo.Builder jb = createJob(0);
JobStatus js = createJobStatus("testTopAppBypass", jb);
js.adjustNumRequiredFlexibleConstraints(100);
mJobStore.add(js);
// Needed because if before and after Uid bias is the same, nothing happens.
when(mJobSchedulerService.getUidBias(js.getUid()))
when(mJobSchedulerService.getUidBias(mSourceUid))
.thenReturn(JobInfo.BIAS_FOREGROUND_SERVICE);
synchronized (mFlexibilityController.mLock) {
setUidBias(js.getUid(), JobInfo.BIAS_TOP_APP);
mFlexibilityController.maybeStartTrackingJobLocked(js, null);
assertFalse(mFlexibilityController.isFlexibilitySatisfiedLocked(js));
setUidBias(mSourceUid, JobInfo.BIAS_TOP_APP);
assertTrue(mFlexibilityController.isFlexibilitySatisfiedLocked(js));
assertTrue(js.isConstraintSatisfied(CONSTRAINT_FLEXIBLE));
setUidBias(js.getUid(), JobInfo.BIAS_FOREGROUND_SERVICE);
setUidBias(mSourceUid, JobInfo.BIAS_FOREGROUND_SERVICE);
assertFalse(mFlexibilityController.isFlexibilitySatisfiedLocked(js));
assertFalse(js.isConstraintSatisfied(CONSTRAINT_FLEXIBLE));
@@ -858,18 +865,18 @@ public class FlexibilityControllerTest {
final ArraySet<String> pkgs = new ArraySet<>();
pkgs.add(js.getSourcePackageName());
when(mJobSchedulerService.getPackagesForUidLocked(js.getUid())).thenReturn(pkgs);
when(mJobSchedulerService.getPackagesForUidLocked(mSourceUid)).thenReturn(pkgs);
setUidBias(js.getUid(), BIAS_TOP_APP);
setUidBias(js.getUid(), BIAS_FOREGROUND_SERVICE);
setUidBias(mSourceUid, BIAS_TOP_APP);
setUidBias(mSourceUid, BIAS_FOREGROUND_SERVICE);
assertEquals(100L, (long) mFlexibilityController.mPrefetchLifeCycleStart
.getOrDefault(js.getSourceUserId(), js.getSourcePackageName(), 0L));
JobSchedulerService.sElapsedRealtimeClock =
Clock.fixed(Instant.ofEpochMilli(50L), ZoneOffset.UTC);
setUidBias(js.getUid(), BIAS_TOP_APP);
setUidBias(js.getUid(), BIAS_FOREGROUND_SERVICE);
setUidBias(mSourceUid, BIAS_TOP_APP);
setUidBias(mSourceUid, BIAS_FOREGROUND_SERVICE);
assertEquals(100L, (long) mFlexibilityController
.mPrefetchLifeCycleStart.get(js.getSourceUserId(), js.getSourcePackageName()));