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

Commit bc260613 authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge changes from topic "compaction-mem-stats"

* changes:
  Add app compaction westworld stat logging
  Change OOM Adj Reason to IntDef based enum
  Add cancel compaction reason stats
  Add oom adj reason stats to compaction
  Adding compaction metrics for oom adj and proc state
  Add cpu metric for compaction
  Add compaction memory diagnostics
parents 67ae1ea9 4d44d130
Loading
Loading
Loading
Loading
+8 −7
Original line number Original line Diff line number Diff line
@@ -3595,11 +3595,12 @@ public final class ActiveServices {


    /**
    /**
     * Bump the given service record into executing state.
     * Bump the given service record into executing state.
     * @param oomAdjReason The caller requests it to perform the oomAdjUpdate if it's not null.
     * @param oomAdjReason The caller requests it to perform the oomAdjUpdate not {@link
     *         OomAdjuster#OOM_ADJ_REASON_NONE}.
     * @return {@code true} if it performed oomAdjUpdate.
     * @return {@code true} if it performed oomAdjUpdate.
     */
     */
    private boolean bumpServiceExecutingLocked(ServiceRecord r, boolean fg, String why,
    private boolean bumpServiceExecutingLocked(
            @Nullable String oomAdjReason) {
            ServiceRecord r, boolean fg, String why, @OomAdjuster.OomAdjReason int oomAdjReason) {
        if (DEBUG_SERVICE) Slog.v(TAG_SERVICE, ">>> EXECUTING "
        if (DEBUG_SERVICE) Slog.v(TAG_SERVICE, ">>> EXECUTING "
                + why + " of " + r + " in app " + r.app);
                + why + " of " + r + " in app " + r.app);
        else if (DEBUG_SERVICE_EXECUTING) Slog.v(TAG_SERVICE_EXECUTING, ">>> EXECUTING "
        else if (DEBUG_SERVICE_EXECUTING) Slog.v(TAG_SERVICE_EXECUTING, ">>> EXECUTING "
@@ -3651,7 +3652,7 @@ public final class ActiveServices {
            }
            }
        }
        }
        boolean oomAdjusted = false;
        boolean oomAdjusted = false;
        if (oomAdjReason != null && r.app != null
        if (oomAdjReason != OomAdjuster.OOM_ADJ_REASON_NONE && r.app != null
                && r.app.mState.getCurProcState() > ActivityManager.PROCESS_STATE_SERVICE) {
                && r.app.mState.getCurProcState() > ActivityManager.PROCESS_STATE_SERVICE) {
            // Force an immediate oomAdjUpdate, so the client app could be in the correct process
            // Force an immediate oomAdjUpdate, so the client app could be in the correct process
            // state before doing any service related transactions
            // state before doing any service related transactions
@@ -4385,7 +4386,7 @@ public final class ActiveServices {


        final ProcessServiceRecord psr = app.mServices;
        final ProcessServiceRecord psr = app.mServices;
        final boolean newService = psr.startService(r);
        final boolean newService = psr.startService(r);
        bumpServiceExecutingLocked(r, execInFg, "create", null /* oomAdjReason */);
        bumpServiceExecutingLocked(r, execInFg, "create", OomAdjuster.OOM_ADJ_REASON_NONE);
        mAm.updateLruProcessLocked(app, false, null);
        mAm.updateLruProcessLocked(app, false, null);
        updateServiceForegroundLocked(psr, /* oomAdj= */ false);
        updateServiceForegroundLocked(psr, /* oomAdj= */ false);
        // Force an immediate oomAdjUpdate, so the client app could be in the correct process state
        // Force an immediate oomAdjUpdate, so the client app could be in the correct process state
@@ -4511,7 +4512,7 @@ public final class ActiveServices {
            mAm.grantImplicitAccess(r.userId, si.intent, si.callingId,
            mAm.grantImplicitAccess(r.userId, si.intent, si.callingId,
                    UserHandle.getAppId(r.appInfo.uid)
                    UserHandle.getAppId(r.appInfo.uid)
            );
            );
            bumpServiceExecutingLocked(r, execInFg, "start", null /* oomAdjReason */);
            bumpServiceExecutingLocked(r, execInFg, "start", OomAdjuster.OOM_ADJ_REASON_NONE);
            if (r.fgRequired && !r.fgWaiting) {
            if (r.fgRequired && !r.fgWaiting) {
                if (!r.isForeground) {
                if (!r.isForeground) {
                    if (DEBUG_BACKGROUND_CHECK) {
                    if (DEBUG_BACKGROUND_CHECK) {
@@ -4780,7 +4781,7 @@ public final class ActiveServices {
                updateServiceForegroundLocked(r.app.mServices, false);
                updateServiceForegroundLocked(r.app.mServices, false);
                try {
                try {
                    oomAdjusted |= bumpServiceExecutingLocked(r, false, "destroy",
                    oomAdjusted |= bumpServiceExecutingLocked(r, false, "destroy",
                            oomAdjusted ? null : OomAdjuster.OOM_ADJ_REASON_UNBIND_SERVICE);
                            oomAdjusted ? 0 : OomAdjuster.OOM_ADJ_REASON_UNBIND_SERVICE);
                    mDestroyingServices.add(r);
                    mDestroyingServices.add(r);
                    r.destroying = true;
                    r.destroying = true;
                    r.app.getThread().scheduleStopService(r);
                    r.app.getThread().scheduleStopService(r);
+8 −5
Original line number Original line Diff line number Diff line
@@ -15609,7 +15609,7 @@ public class ActivityManagerService extends IActivityManager.Stub
     * {@link #enqueueOomAdjTargetLocked}.
     * {@link #enqueueOomAdjTargetLocked}.
     */
     */
    @GuardedBy("this")
    @GuardedBy("this")
    void updateOomAdjPendingTargetsLocked(String oomAdjReason) {
    void updateOomAdjPendingTargetsLocked(@OomAdjuster.OomAdjReason int oomAdjReason) {
        mOomAdjuster.updateOomAdjPendingTargetsLocked(oomAdjReason);
        mOomAdjuster.updateOomAdjPendingTargetsLocked(oomAdjReason);
    }
    }
@@ -15628,7 +15628,7 @@ public class ActivityManagerService extends IActivityManager.Stub
    }
    }
    @GuardedBy("this")
    @GuardedBy("this")
    final void updateOomAdjLocked(String oomAdjReason) {
    final void updateOomAdjLocked(@OomAdjuster.OomAdjReason int oomAdjReason) {
        mOomAdjuster.updateOomAdjLocked(oomAdjReason);
        mOomAdjuster.updateOomAdjLocked(oomAdjReason);
    }
    }
@@ -15640,7 +15640,8 @@ public class ActivityManagerService extends IActivityManager.Stub
     * @return whether updateOomAdjLocked(app) was successful.
     * @return whether updateOomAdjLocked(app) was successful.
     */
     */
    @GuardedBy("this")
    @GuardedBy("this")
    final boolean updateOomAdjLocked(ProcessRecord app, String oomAdjReason) {
    final boolean updateOomAdjLocked(
            ProcessRecord app, @OomAdjuster.OomAdjReason int oomAdjReason) {
        return mOomAdjuster.updateOomAdjLocked(app, oomAdjReason);
        return mOomAdjuster.updateOomAdjLocked(app, oomAdjReason);
    }
    }
@@ -15873,14 +15874,16 @@ public class ActivityManagerService extends IActivityManager.Stub
        mOomAdjuster.setUidTempAllowlistStateLSP(uid, onAllowlist);
        mOomAdjuster.setUidTempAllowlistStateLSP(uid, onAllowlist);
    }
    }
    private void trimApplications(boolean forceFullOomAdj, String oomAdjReason) {
    private void trimApplications(
            boolean forceFullOomAdj, @OomAdjuster.OomAdjReason int oomAdjReason) {
        synchronized (this) {
        synchronized (this) {
            trimApplicationsLocked(forceFullOomAdj, oomAdjReason);
            trimApplicationsLocked(forceFullOomAdj, oomAdjReason);
        }
        }
    }
    }
    @GuardedBy("this")
    @GuardedBy("this")
    private void trimApplicationsLocked(boolean forceFullOomAdj, String oomAdjReason) {
    private void trimApplicationsLocked(
            boolean forceFullOomAdj, @OomAdjuster.OomAdjReason int oomAdjReason) {
        // First remove any unused application processes whose package
        // First remove any unused application processes whose package
        // has been removed.
        // has been removed.
        boolean didSomething = false;
        boolean didSomething = false;
+31 −16
Original line number Original line Diff line number Diff line
@@ -989,26 +989,40 @@ final class ActivityManagerShellCommand extends ShellCommand {


    @NeverCompile
    @NeverCompile
    int runCompact(PrintWriter pw) {
    int runCompact(PrintWriter pw) {
        ProcessRecord app;
        String op = getNextArgRequired();
        boolean isFullCompact = op.equals("full");
        boolean isSomeCompact = op.equals("some");
        if (isFullCompact || isSomeCompact) {
            String processName = getNextArgRequired();
            String processName = getNextArgRequired();
            String uid = getNextArgRequired();
            String uid = getNextArgRequired();
        String op = getNextArgRequired();
        ProcessRecord app;
            synchronized (mInternal.mProcLock) {
            synchronized (mInternal.mProcLock) {
                app = mInternal.getProcessRecordLocked(processName, Integer.parseInt(uid));
                app = mInternal.getProcessRecordLocked(processName, Integer.parseInt(uid));
            }
            }
            pw.println("Process record found pid: " + app.mPid);
            pw.println("Process record found pid: " + app.mPid);
        if (op.equals("full")) {
            if (isFullCompact) {
                pw.println("Executing full compaction for " + app.mPid);
                pw.println("Executing full compaction for " + app.mPid);
                synchronized (mInternal.mProcLock) {
                synchronized (mInternal.mProcLock) {
                mInternal.mOomAdjuster.mCachedAppOptimizer.compactAppFull(app, true);
                    mInternal.mOomAdjuster.mCachedAppOptimizer.compactApp(app,
                            CachedAppOptimizer.CompactProfile.FULL,
                            CachedAppOptimizer.CompactSource.APP, true);
                }
                }
                pw.println("Finished full compaction for " + app.mPid);
                pw.println("Finished full compaction for " + app.mPid);
        } else if (op.equals("some")) {
            } else if (isSomeCompact) {
                pw.println("Executing some compaction for " + app.mPid);
                pw.println("Executing some compaction for " + app.mPid);
                synchronized (mInternal.mProcLock) {
                synchronized (mInternal.mProcLock) {
                mInternal.mOomAdjuster.mCachedAppOptimizer.compactAppSome(app, true);
                    mInternal.mOomAdjuster.mCachedAppOptimizer.compactApp(app,
                            CachedAppOptimizer.CompactProfile.SOME,
                            CachedAppOptimizer.CompactSource.APP, true);
                }
                }
                pw.println("Finished some compaction for " + app.mPid);
                pw.println("Finished some compaction for " + app.mPid);
            }
        } else if (op.equals("system")) {
            pw.println("Executing system compaction");
            synchronized (mInternal.mProcLock) {
                mInternal.mOomAdjuster.mCachedAppOptimizer.compactAllSystem();
            }
            pw.println("Finished system compaction");
        } else {
        } else {
            getErrPrintWriter().println("Error: unknown compact command '" + op + "'");
            getErrPrintWriter().println("Error: unknown compact command '" + op + "'");
            return -1;
            return -1;
@@ -3570,10 +3584,11 @@ final class ActivityManagerShellCommand extends ShellCommand {
            pw.println("      --allow-background-activity-starts: The receiver may start activities");
            pw.println("      --allow-background-activity-starts: The receiver may start activities");
            pw.println("          even if in the background.");
            pw.println("          even if in the background.");
            pw.println("      --async: Send without waiting for the completion of the receiver.");
            pw.println("      --async: Send without waiting for the completion of the receiver.");
            pw.println("  compact <process_name> <Package UID> [some|full]");
            pw.println("  compact [some|full|system] <process_name> <Package UID>");
            pw.println("      Force process compaction.");
            pw.println("      Force process compaction.");
            pw.println("      some: execute file compaction.");
            pw.println("      some: execute file compaction.");
            pw.println("      full: execute anon + file compaction.");
            pw.println("      full: execute anon + file compaction.");
            pw.println("      system: system compaction.");
            pw.println("  instrument [-r] [-e <NAME> <VALUE>] [-p <FILE>] [-w]");
            pw.println("  instrument [-r] [-e <NAME> <VALUE>] [-p <FILE>] [-w]");
            pw.println("          [--user <USER_ID> | current]");
            pw.println("          [--user <USER_ID> | current]");
            pw.println("          [--no-hidden-api-checks [--no-test-api-access]]");
            pw.println("          [--no-hidden-api-checks [--no-test-api-access]]");
Loading