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

Commit 5dfae2dd authored by Makoto Onuki's avatar Makoto Onuki
Browse files

Add IActivityManager.getUidLastIdleElapsedTime()

To let CameraService know if a given UID ever became idle
since it opened the camera.

Bug: 299879396
Test: eyeball debugging

Change-Id: I665621b84525c2ff0b422dbe36ecd1961dcead51
parent da3a3284
Loading
Loading
Loading
Loading
+8 −0
Original line number Diff line number Diff line
@@ -962,4 +962,12 @@ interface IActivityManager {
     */
    oneway void frozenBinderTransactionDetected(int debugPid, int code, int flags, int err);
    int getBindingUidProcessState(int uid, in String callingPackage);

    /**
     * Return the timestampe (in the elapsed timebase) when the UID became idle from active
     * last time (regardless of if the UID is still idle, or became active again).
     * This is useful when trying to detect whether an UID has ever became idle since a certain
     * time in the past.
     */
    long getUidLastIdleElapsedTime(int uid, in String callingPackage);
}
+12 −0
Original line number Diff line number Diff line
@@ -7948,6 +7948,18 @@ public class ActivityManagerService extends IActivityManager.Stub
        return uidRecord != null && !uidRecord.isSetIdle();
    }
    @Override
    public long getUidLastIdleElapsedTime(int uid, String callingPackage) {
        if (!hasUsageStatsPermission(callingPackage)) {
            enforceCallingPermission(android.Manifest.permission.PACKAGE_USAGE_STATS,
                    "getUidLastIdleElapsedTime");
        }
        synchronized (mProcLock) {
            final UidRecord uidRecord = mProcessList.getUidRecordLOSP(uid);
            return uidRecord != null ? uidRecord.getRealLastIdleTime() : 0;
        }
    }
    @GuardedBy("mUidFrozenStateChangedCallbackList")
    private final RemoteCallbackList<IUidFrozenStateChangedCallback>
            mUidFrozenStateChangedCallbackList = new RemoteCallbackList<>();
+1 −1
Original line number Diff line number Diff line
@@ -3759,7 +3759,7 @@ public class OomAdjuster {
        for (int i = N - 1; i >= 0; i--) {
            final UidRecord uidRec = mActiveUids.valueAt(i);
            final long bgTime = uidRec.getLastBackgroundTime();
            final long idleTime = uidRec.getLastIdleTime();
            final long idleTime = uidRec.getLastIdleTimeIfStillIdle();
            if (bgTime > 0 && (!uidRec.isIdle() || idleTime == 0)) {
                if (bgTime <= maxBgTime) {
                    EventLogTags.writeAmUidIdle(uidRec.getUid());
+31 −5
Original line number Diff line number Diff line
@@ -17,6 +17,7 @@
package com.android.server.am;

import android.Manifest;
import android.annotation.ElapsedRealtimeLong;
import android.app.ActivityManager;
import android.content.pm.PackageManager;
import android.os.SystemClock;
@@ -65,8 +66,19 @@ public final class UidRecord {
    @CompositeRWLock({"mService", "mProcLock"})
    private long mLastBackgroundTime;

    /**
     * Last time the UID became idle. This is set to 0, once the UID becomes active.
     */
    @ElapsedRealtimeLong
    @CompositeRWLock({"mService", "mProcLock"})
    private long mLastIdleTime;
    private long mLastIdleTimeIfStillIdle;

    /**
     * Last time the UID became idle. Unlike {@link #mLastIdleTimeIfStillIdle}, we never clear it.
     */
    @ElapsedRealtimeLong
    @CompositeRWLock({"mService", "mProcLock"})
    private long mRealLastIdleTime;

    @CompositeRWLock({"mService", "mProcLock"})
    private boolean mEphemeral;
@@ -257,14 +269,28 @@ public final class UidRecord {
        mLastBackgroundTime = lastBackgroundTime;
    }

    /**
     * Last time the UID became idle. This is set to 0, once the UID becomes active.
     */
    @GuardedBy(anyOf = {"mService", "mProcLock"})
    long getLastIdleTimeIfStillIdle() {
        return mLastIdleTimeIfStillIdle;
    }

    /**
     * Last time the UID became idle. Unlike {@link #getLastIdleTimeIfStillIdle}, we never clear it.
     */
    @GuardedBy(anyOf = {"mService", "mProcLock"})
    long getLastIdleTime() {
        return mLastIdleTime;
    long getRealLastIdleTime() {
        return mRealLastIdleTime;
    }

    @GuardedBy({"mService", "mProcLock"})
    void setLastIdleTime(long lastActiveTime) {
        mLastIdleTime = lastActiveTime;
    void setLastIdleTime(@ElapsedRealtimeLong long lastIdleTime) {
        mLastIdleTimeIfStillIdle = lastIdleTime;
        if (lastIdleTime > 0) {
            mRealLastIdleTime = lastIdleTime;
        }
    }

    @GuardedBy(anyOf = {"mService", "mProcLock"})