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

Commit 5cdd221f authored by Treehugger Robot's avatar Treehugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Add IActivityManager.getUidLastIdleElapsedTime()" into main

parents ae929258 5dfae2dd
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
@@ -8015,6 +8015,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
@@ -3681,7 +3681,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"})