Merge "UidObserver / Camera: Track the OOM adj of a uid via UidObserver." into udc-dev

This commit is contained in:
Austin Borger
2023-05-02 17:11:07 +00:00
committed by Android (Google) Code Review
8 changed files with 44 additions and 12 deletions

View File

@@ -58,8 +58,9 @@ oneway interface IUidObserver {
* Report a proc oom adj change associated with a uid.
*
* @param uid The uid for which the state change is being reported.
* @param adj The minimum OOM adj among all processes with this uid.
*/
void onUidProcAdjChanged(int uid);
void onUidProcAdjChanged(int uid, int adj);
// =============== End of transactions used on native side as well ============================

View File

@@ -41,7 +41,7 @@ public class UidObserver extends IUidObserver.Stub {
}
@Override
public void onUidProcAdjChanged(int uid) {
public void onUidProcAdjChanged(int uid, int adj) {
}
@Override

View File

@@ -45,7 +45,7 @@ struct UidObserver : public BnUidObserver, public virtual IBinder::DeathRecipien
void onUidIdle(uid_t uid, bool disabled) override;
void onUidStateChanged(uid_t uid, int32_t procState, int64_t procStateSeq,
int32_t capability) override;
void onUidProcAdjChanged(uid_t uid) override;
void onUidProcAdjChanged(uid_t uid, int32_t adj) override;
// IBinder::DeathRecipient implementation
void binderDied(const wp<IBinder>& who) override;
@@ -121,7 +121,7 @@ void UidObserver::onUidActive(uid_t uid __unused) {}
void UidObserver::onUidIdle(uid_t uid __unused, bool disabled __unused) {}
void UidObserver::onUidProcAdjChanged(uid_t uid __unused) {}
void UidObserver::onUidProcAdjChanged(uid_t uid __unused, int32_t adj __unused) {}
void UidObserver::onUidStateChanged(uid_t uid, int32_t procState,
int64_t procStateSeq __unused,

View File

@@ -16060,6 +16060,8 @@ public class ActivityManagerService extends IActivityManager.Stub
final int procState = uidRec != null
? uidRec.getSetProcState() : PROCESS_STATE_NONEXISTENT;
final int procAdj = uidRec != null
? uidRec.getMinProcAdj() : ProcessList.INVALID_ADJ;
final long procStateSeq = uidRec != null ? uidRec.curProcStateSeq : 0;
final int capability = uidRec != null ? uidRec.getSetCapability() : 0;
final boolean ephemeral = uidRec != null ? uidRec.isEphemeral() : isEphemeralLocked(uid);
@@ -16075,7 +16077,7 @@ public class ActivityManagerService extends IActivityManager.Stub
}
final int enqueuedChange = mUidObserverController.enqueueUidChange(
uidRec == null ? null : uidRec.pendingChange,
uid, change, procState, procStateSeq, capability, ephemeral);
uid, change, procState, procAdj, procStateSeq, capability, ephemeral);
if (uidRec != null) {
uidRec.setLastReportedChange(enqueuedChange);
}

View File

@@ -644,6 +644,11 @@ class ProcessRecord implements WindowProcessListener {
}
}
@GuardedBy({"mService", "mProcLock"})
int getSetAdj() {
return mState.getSetAdj();
}
@GuardedBy(anyOf = {"mService", "mProcLock"})
IApplicationThread getThread() {
return mThread;

View File

@@ -96,7 +96,7 @@ public class UidObserverController {
}
int enqueueUidChange(@Nullable ChangeRecord currentRecord, int uid, int change, int procState,
long procStateSeq, int capability, boolean ephemeral) {
int procAdj, long procStateSeq, int capability, boolean ephemeral) {
synchronized (mLock) {
if (mPendingUidChanges.size() == 0) {
if (DEBUG_UID_OBSERVERS) {
@@ -117,6 +117,7 @@ public class UidObserverController {
changeRecord.uid = uid;
changeRecord.change = change;
changeRecord.procState = procState;
changeRecord.procAdj = procAdj;
changeRecord.procStateSeq = procStateSeq;
changeRecord.capability = capability;
changeRecord.ephemeral = ephemeral;
@@ -344,7 +345,7 @@ public class UidObserverController {
}
if ((reg.mWhich & ActivityManager.UID_OBSERVER_PROC_OOM_ADJ) != 0
&& (change & UidRecord.CHANGE_PROCADJ) != 0) {
observer.onUidProcAdjChanged(item.uid);
observer.onUidProcAdjChanged(item.uid, item.procAdj);
}
}
final int duration = (int) (SystemClock.uptimeMillis() - start);
@@ -426,6 +427,7 @@ public class UidObserverController {
public int uid;
public int change;
public int procState;
public int procAdj;
public int capability;
public boolean ephemeral;
public long procStateSeq;
@@ -435,6 +437,7 @@ public class UidObserverController {
changeRecord.uid = uid;
changeRecord.change = change;
changeRecord.procState = procState;
changeRecord.procAdj = procAdj;
changeRecord.capability = capability;
changeRecord.ephemeral = ephemeral;
changeRecord.procStateSeq = procStateSeq;

View File

@@ -50,6 +50,12 @@ public final class UidRecord {
@CompositeRWLock({"mService", "mProcLock"})
private boolean mProcAdjChanged;
@CompositeRWLock({"mService", "mProcLock"})
private int mCurAdj;
@CompositeRWLock({"mService", "mProcLock"})
private int mSetAdj;
@CompositeRWLock({"mService", "mProcLock"})
private int mCurCapability;
@@ -201,11 +207,23 @@ public final class UidRecord {
mProcAdjChanged = false;
}
@GuardedBy({"mService", "mProcLock"})
@GuardedBy(anyOf = {"mService", "mProcLock"})
boolean getProcAdjChanged() {
return mProcAdjChanged;
}
@GuardedBy(anyOf = {"mService", "mProcLock"})
int getMinProcAdj() {
int minAdj = ProcessList.UNKNOWN_ADJ;
for (int i = mProcRecords.size() - 1; i >= 0; i--) {
int adj = mProcRecords.valueAt(i).getSetAdj();
if (adj < minAdj) {
minAdj = adj;
}
}
return minAdj;
}
@GuardedBy(anyOf = {"mService", "mProcLock"})
int getCurCapability() {
return mCurCapability;

View File

@@ -28,6 +28,8 @@ import static android.app.ActivityManager.PROCESS_STATE_RECEIVER;
import static android.app.ActivityManager.PROCESS_STATE_SERVICE;
import static android.app.ActivityManager.PROCESS_STATE_TOP;
import static com.android.server.am.ProcessList.UNKNOWN_ADJ;
import static junit.framework.Assert.assertEquals;
import static junit.framework.Assert.assertNotNull;
import static junit.framework.Assert.assertNull;
@@ -81,7 +83,7 @@ public class UidObserverControllerTest {
public void testEnqueueUidChange() {
int change = mUidObserverController.enqueueUidChange(null, TEST_UID1,
UidRecord.CHANGE_ACTIVE, PROCESS_STATE_FOREGROUND_SERVICE,
PROCESS_CAPABILITY_ALL, 0, false);
UNKNOWN_ADJ, PROCESS_CAPABILITY_ALL, 0, false);
assertEquals("expected=ACTIVE,actual=" + changeToStr(change),
UidRecord.CHANGE_ACTIVE, change);
assertPendingChange(TEST_UID1, UidRecord.CHANGE_ACTIVE, PROCESS_STATE_FOREGROUND_SERVICE,
@@ -91,8 +93,8 @@ public class UidObserverControllerTest {
final ChangeRecord record2 = new ChangeRecord();
change = mUidObserverController.enqueueUidChange(record2, TEST_UID2,
UidRecord.CHANGE_CACHED, PROCESS_STATE_CACHED_RECENT, PROCESS_CAPABILITY_NONE,
99, true);
UidRecord.CHANGE_CACHED, PROCESS_STATE_CACHED_RECENT, UNKNOWN_ADJ,
PROCESS_CAPABILITY_NONE, 99, true);
assertEquals("expected=ACTIVE,actual=" + changeToStr(change),
UidRecord.CHANGE_CACHED, change);
assertPendingChange(TEST_UID1, UidRecord.CHANGE_ACTIVE, PROCESS_STATE_FOREGROUND_SERVICE,
@@ -101,7 +103,8 @@ public class UidObserverControllerTest {
PROCESS_CAPABILITY_NONE, 99, true, record2);
change = mUidObserverController.enqueueUidChange(record1, TEST_UID1,
UidRecord.CHANGE_UNCACHED, PROCESS_STATE_TOP, PROCESS_CAPABILITY_ALL, 0, false);
UidRecord.CHANGE_UNCACHED, PROCESS_STATE_TOP, UNKNOWN_ADJ,
PROCESS_CAPABILITY_ALL, 0, false);
assertEquals("expected=ACTIVE|UNCACHED,actual=" + changeToStr(change),
UidRecord.CHANGE_ACTIVE | UidRecord.CHANGE_UNCACHED, change);
assertPendingChange(TEST_UID1, UidRecord.CHANGE_ACTIVE | UidRecord.CHANGE_UNCACHED,