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

Commit 530a7fd8 authored by Dianne Hackborn's avatar Dianne Hackborn Committed by Android (Google) Code Review
Browse files

Merge "Fix another problem with procstats bucketing."

parents b8fc83f3 85df4e0c
Loading
Loading
Loading
Loading
+4 −2
Original line number Diff line number Diff line
@@ -14786,10 +14786,11 @@ public final class ActivityManagerService extends ActivityManagerNative
            }
            int curLevel = ComponentCallbacks2.TRIM_MEMORY_COMPLETE;
            allChanged = mProcessTracker.setMemFactorLocked(memFactor, !mSleeping, now);
            final int trackerMemFactor = mProcessTracker.getMemFactorLocked();
            for (int i=N-1; i>=0; i--) {
                ProcessRecord app = mLruProcesses.get(i);
                if (allChanged || app.procStateChanged) {
                    app.setProcessTrackerState(memFactor, now);
                    app.setProcessTrackerState(trackerMemFactor, now);
                }
                if (app.curProcState >= ActivityManager.PROCESS_STATE_HOME
                        && !app.killedBackground) {
@@ -14874,10 +14875,11 @@ public final class ActivityManagerService extends ActivityManagerNative
        } else {
            allChanged = mProcessTracker.setMemFactorLocked(
                    ProcessTracker.ADJ_MEM_FACTOR_NORMAL, !mSleeping, now);
            final int trackerMemFactor = mProcessTracker.getMemFactorLocked();
            for (int i=N-1; i>=0; i--) {
                ProcessRecord app = mLruProcesses.get(i);
                if (allChanged || app.procStateChanged) {
                    app.setProcessTrackerState(ProcessTracker.ADJ_MEM_FACTOR_NORMAL, now);
                    app.setProcessTrackerState(trackerMemFactor, now);
                }
                if ((app.curProcState >= ActivityManager.PROCESS_STATE_IMPORTANT_BACKGROUND
                        || app.systemNoUi) && app.pendingUiClean) {
+88 −52
Original line number Diff line number Diff line
@@ -72,6 +72,12 @@ public final class ProcessTracker {
            STATE_CACHED_ACTIVITY_CLIENT, STATE_CACHED_EMPTY
    };

    static final int[] NON_CACHED_PROC_STATES = new int[] { STATE_PERSISTENT,
            STATE_TOP, STATE_IMPORTANT_FOREGROUND,
            STATE_IMPORTANT_BACKGROUND, STATE_BACKUP, STATE_HEAVY_WEIGHT,
            STATE_SERVICE, STATE_RECEIVER, STATE_HOME
    };

    public static final int PSS_SAMPLE_COUNT = 0;
    public static final int PSS_MINIMUM = 1;
    public static final int PSS_AVERAGE = 2;
@@ -116,7 +122,7 @@ public final class ProcessTracker {
    static final String[] STATE_NAMES = new String[] {
            "Persistent", "Top       ", "Imp Fg    ", "Imp Bg    ",
            "Backup    ", "Heavy Wght", "Service   ", "Receiver  ", "Home      ",
            "Last Act  ", "Cch Actvty", "Cch Client", "Cch Empty "
            "Last Act  ", "Cch Act   ", "Cch CliAct", "Cch Empty "
    };

    static final String[] ADJ_SCREEN_NAMES_CSV = new String[] {
@@ -1370,6 +1376,8 @@ public final class ProcessTracker {
        }

        void dumpLocked(PrintWriter pw, String reqPackage, long now, boolean dumpAll) {
            long totalTime = dumpSingleTime(null, null, mMemFactorDurations, mMemFactor,
                    mStartTime, now);
            ArrayMap<String, SparseArray<PackageState>> pkgMap = mPackages.getMap();
            boolean printedHeader = false;
            for (int ip=0; ip<pkgMap.size(); ip++) {
@@ -1391,6 +1399,7 @@ public final class ProcessTracker {
                        pw.print("  * "); pw.print(pkgName); pw.print(" / ");
                                UserHandle.formatUid(pw, uid); pw.println(":");
                    }
                    if (dumpAll) {
                        for (int iproc=0; iproc<NPROCS; iproc++) {
                            ProcessState proc = pkgState.mProcesses.valueAt(iproc);
                            pw.print("      Process ");
@@ -1404,29 +1413,32 @@ public final class ProcessTracker {
                            dumpProcessPss(pw, "        ", proc, ALL_SCREEN_ADJ, ALL_MEM_ADJ,
                                    ALL_PROC_STATES);
                        }
                    } else {
                        ArrayList<ProcessState> procs = new ArrayList<ProcessState>();
                        for (int iproc=0; iproc<NPROCS; iproc++) {
                            procs.add(pkgState.mProcesses.valueAt(iproc));
                        }
                        dumpProcessSummaryLocked(pw, "      ", procs, ALL_SCREEN_ADJ, ALL_MEM_ADJ,
                                NON_CACHED_PROC_STATES, now, totalTime);
                    }
                    for (int isvc=0; isvc<NSRVS; isvc++) {
                        if (dumpAll) {
                            pw.print("      Service ");
                        } else {
                            pw.print("      * ");
                        }
                        pw.print(pkgState.mServices.keyAt(isvc));
                        pw.println(":");
                        ServiceState svc = pkgState.mServices.valueAt(isvc);
                        if (svc.mStartedCount != 0) {
                            pw.print("        Started op count "); pw.print(svc.mStartedCount);
                            pw.println(":");
                            dumpSingleTime(pw, "          ", svc.mStartedDurations, svc.mStartedState,
                                    svc.mStartedStartTime, now);
                        }
                        if (svc.mBoundCount != 0) {
                            pw.print("        Bound op count "); pw.print(svc.mBoundCount);
                            pw.println(":");
                            dumpSingleTime(pw, "          ", svc.mBoundDurations, svc.mBoundState,
                                    svc.mBoundStartTime, now);
                        }
                        if (svc.mExecCount != 0) {
                            pw.print("        Executing op count "); pw.print(svc.mExecCount);
                            pw.println(":");
                            dumpSingleTime(pw, "          ", svc.mExecDurations, svc.mExecState,
                                    svc.mExecStartTime, now);
                        }
                        dumpServiceStats(pw, "        ", "          ", "    ", "Started",
                                svc.mStartedCount, svc.mStartedDurations, svc.mStartedState,
                                svc.mStartedStartTime, now, totalTime, dumpAll);
                        dumpServiceStats(pw, "        ", "          ", "      ", "Bound",
                                svc.mBoundCount, svc.mBoundDurations, svc.mBoundState,
                                svc.mBoundStartTime, now, totalTime, dumpAll);
                        dumpServiceStats(pw, "        ", "          ", "  ", "Executing",
                                svc.mExecCount, svc.mExecDurations, svc.mExecState,
                                svc.mExecStartTime, now, totalTime, dumpAll);
                    }
                }
            }
@@ -1462,6 +1474,9 @@ public final class ProcessTracker {
                pw.println();
                pw.println("Summary:");
                dumpSummaryLocked(pw, reqPackage, now);
            } else {
                pw.println();
                dumpTotalsLocked(pw, now);
            }

            if (dumpAll) {
@@ -1474,15 +1489,36 @@ public final class ProcessTracker {
            }
        }

        void dumpServiceStats(PrintWriter pw, String prefix, String prefixInner,
                String headerPrefix, String header,
                int count, long[] durations, int state, long startTime, long now, long totalTime,
                boolean dumpAll) {
            if (count != 0) {
                if (dumpAll) {
                    pw.print(prefix); pw.print(header);
                    pw.print(" op count "); pw.print(count); pw.println(":");
                    dumpSingleTime(pw, prefixInner, durations, state, startTime, now);
                } else {
                    long myTime = dumpSingleTime(null, null, durations, state, startTime, now);
                    pw.print(prefix); pw.print(headerPrefix); pw.print(header);
                    pw.print(" count "); pw.print(count);
                    pw.print(" / time ");
                    printPercent(pw, (double)myTime/(double)totalTime);
                    pw.println();
                }
            }
        }

        void dumpSummaryLocked(PrintWriter pw, String reqPackage, long now) {
            long totalTime = dumpSingleTime(null, null, mMemFactorDurations, mMemFactor,
                    mStartTime, now);
            dumpFilteredSummaryLocked(pw, null, "  ", ALL_SCREEN_ADJ, ALL_MEM_ADJ,
                    new int[] { STATE_PERSISTENT, STATE_TOP, STATE_IMPORTANT_FOREGROUND,
                            STATE_IMPORTANT_BACKGROUND, STATE_BACKUP, STATE_HEAVY_WEIGHT,
                            STATE_SERVICE, STATE_RECEIVER, STATE_HOME },
                    now, totalTime, reqPackage);
                    NON_CACHED_PROC_STATES, now, totalTime, reqPackage);
            pw.println();
            dumpTotalsLocked(pw, now);
        }

        void dumpTotalsLocked(PrintWriter pw, long now) {
            pw.println("Run time Stats:");
            dumpSingleTime(pw, "  ", mMemFactorDurations, mMemFactor, mStartTime, now);
            pw.println();
@@ -1986,15 +2022,7 @@ public final class ProcessTracker {
        }

        void print(PrintWriter pw, long overallTime, boolean full) {
            double percent = ((double)totalTime/(double)overallTime) * 100;
            if (percent < 1) {
                pw.print(String.format("%.2f", percent));
            } else if (percent < 10) {
                pw.print(String.format("%.1f", percent));
            } else {
                pw.print(String.format("%.0f", percent));
            }
            pw.print("%");
            printPercent(pw, (double)totalTime/(double)overallTime);
            if (numPss > 0) {
                pw.print(" (");
                printSizeValue(pw, minPss * 1024);
@@ -2341,12 +2369,24 @@ public final class ProcessTracker {
            dumpProcessSummaryDetails(pw, proc, prefix, "    (Last Act): ", screenStates, memStates,
                    new int[] {STATE_LAST_ACTIVITY}, now, totalTime, true);
            dumpProcessSummaryDetails(pw, proc, prefix, "      (Cached): ", screenStates, memStates,
                    new int[] {STATE_CACHED_ACTIVITY_CLIENT, STATE_CACHED_ACTIVITY_CLIENT,
                    new int[] {STATE_CACHED_ACTIVITY, STATE_CACHED_ACTIVITY_CLIENT,
                            STATE_CACHED_EMPTY}, now, totalTime, true);
        }
    }

    private static void printSizeValue(PrintWriter pw, long number) {
    static void printPercent(PrintWriter pw, double fraction) {
        fraction *= 100;
        if (fraction < 1) {
            pw.print(String.format("%.2f", fraction));
        } else if (fraction < 10) {
            pw.print(String.format("%.1f", fraction));
        } else {
            pw.print(String.format("%.0f", fraction));
        }
        pw.print("%");
    }

    static void printSizeValue(PrintWriter pw, long number) {
        float result = number;
        String suffix = "";
        if (result > 900) {
@@ -2579,11 +2619,7 @@ public final class ProcessTracker {
        boolean csvSepMemStats = false;
        int[] csvMemStats = new int[] {ADJ_MEM_FACTOR_CRITICAL};
        boolean csvSepProcStats = true;
        int[] csvProcStats = new int[] {
                STATE_PERSISTENT, STATE_TOP, STATE_IMPORTANT_FOREGROUND,
                STATE_IMPORTANT_BACKGROUND, STATE_BACKUP, STATE_HEAVY_WEIGHT, STATE_SERVICE,
                STATE_RECEIVER, STATE_HOME, STATE_LAST_ACTIVITY,
                STATE_CACHED_ACTIVITY, STATE_CACHED_ACTIVITY_CLIENT, STATE_CACHED_EMPTY };
        int[] csvProcStats = ALL_PROC_STATES;
        if (args != null) {
            for (int i=0; i<args.length; i++) {
                String arg = args[i];