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

Commit 690c1ed1 authored by Austin Borger's avatar Austin Borger
Browse files

UidObserver / Camera: Track the OOM adj of a uid via UidObserver.

Previously, onUidProcAdjChanged merely signaled that the OOM adj of a
uid changed, but did not provide the actual OOM adj score. Having this
information allows the camera service to cut out redundant calls to
onCameraAccessPrioritiesChanged and avoid overwhelming apps.

The number of calls to onCameraAccessPrioritiesChanged is reduced by
only signaling when it's likely the uid owning a camera would lose
access to it if another uid tried to open that camera. This is opposed
to the status quo, which signals every time a watched uid changes its
OOM adj, which is highly inefficient.

Bug: 274486653
Test: -- on physical device:
      -- testCamera2AccessCallbackInSplitMode x10
      -- ActivityManagerServiceTest
      -- ActivityManagerProcessStateTest
      -- ActivityManagerFgsBgStartTest
      -- UidObserverControllerTest
      -- Alternate focus in split screen between Camera2 + GCA x20
Change-Id: I994bf56d8e1687460149626a3a658851ca9513c4
parent 49faea59
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -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 ============================

+1 −1
Original line number Diff line number Diff line
@@ -41,7 +41,7 @@ public class UidObserver extends IUidObserver.Stub {
    }

    @Override
    public void onUidProcAdjChanged(int uid) {
    public void onUidProcAdjChanged(int uid, int adj) {
    }

    @Override
+2 −2
Original line number Diff line number Diff line
@@ -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,
+3 −1
Original line number Diff line number Diff line
@@ -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);
        }
+5 −0
Original line number Diff line number Diff line
@@ -644,6 +644,11 @@ class ProcessRecord implements WindowProcessListener {
        }
    }

    @GuardedBy({"mService", "mProcLock"})
    int getSetAdj() {
        return mState.getSetAdj();
    }

    @GuardedBy(anyOf = {"mService", "mProcLock"})
    IApplicationThread getThread() {
        return mThread;
Loading