From de9b3c9a4fa26b11aaf9cb1ec1ddb044a2f5dab6 Mon Sep 17 00:00:00 2001 From: Edgar Arriaga Date: Thu, 26 Jan 2023 00:32:30 +0000 Subject: [PATCH] Add debug support for native compactions This allows for performing compactions using shell command which is useful for testing and debugging compaction locally automated tests to allow compacting applications not managed by ActivityManager such as purely native binaries. Test: am compact native full Bug: 267188919 (cherry picked from https://googleplex-android-review.googlesource.com/q/commit:5fa297d3c198ed2e93c788b332c3a79ff8efb8d3) Merged-In: I355bd4c55c96ada392d81cf89381870b9dc79c17 Change-Id: I355bd4c55c96ada392d81cf89381870b9dc79c17 --- .../am/ActivityManagerShellCommand.java | 32 +++++++++++++++++-- .../android/server/am/CachedAppOptimizer.java | 21 ++++++++++++ 2 files changed, 51 insertions(+), 2 deletions(-) diff --git a/services/core/java/com/android/server/am/ActivityManagerShellCommand.java b/services/core/java/com/android/server/am/ActivityManagerShellCommand.java index 86f709b804fa7..72e17d8764aae 100644 --- a/services/core/java/com/android/server/am/ActivityManagerShellCommand.java +++ b/services/core/java/com/android/server/am/ActivityManagerShellCommand.java @@ -1111,6 +1111,28 @@ final class ActivityManagerShellCommand extends ShellCommand { mInternal.mOomAdjuster.mCachedAppOptimizer.compactAllSystem(); } pw.println("Finished system compaction"); + } else if (op.equals("native")) { + op = getNextArgRequired(); + isFullCompact = op.equals("full"); + isSomeCompact = op.equals("some"); + int pid; + String pidStr = getNextArgRequired(); + try { + pid = Integer.parseInt(pidStr); + } catch (Exception e) { + getErrPrintWriter().println("Error: failed to parse '" + pidStr + "' as a PID"); + return -1; + } + if (isFullCompact) { + mInternal.mOomAdjuster.mCachedAppOptimizer.compactNative( + CachedAppOptimizer.CompactProfile.FULL, pid); + } else if (isSomeCompact) { + mInternal.mOomAdjuster.mCachedAppOptimizer.compactNative( + CachedAppOptimizer.CompactProfile.SOME, pid); + } else { + getErrPrintWriter().println("Error: unknown compaction type '" + op + "'"); + return -1; + } } else { getErrPrintWriter().println("Error: unknown compact command '" + op + "'"); return -1; @@ -4028,11 +4050,17 @@ final class ActivityManagerShellCommand extends ShellCommand { pw.println(" --allow-background-activity-starts: The receiver may start activities"); pw.println(" even if in the background."); pw.println(" --async: Send without waiting for the completion of the receiver."); - pw.println(" compact [some|full|system] [--user ]"); - pw.println(" Force process compaction."); + pw.println(" compact [some|full] [--user ]"); + pw.println(" Perform a single process compaction."); pw.println(" some: execute file compaction."); pw.println(" full: execute anon + file compaction."); pw.println(" system: system compaction."); + pw.println(" compact system"); + pw.println(" Perform a full system compaction."); + pw.println(" compact native [some|full] "); + pw.println(" Perform a native compaction for process with ."); + pw.println(" some: execute file compaction."); + pw.println(" full: execute anon + file compaction."); pw.println(" instrument [-r] [-e ] [-p ] [-w]"); pw.println(" [--user | current]"); pw.println(" [--no-hidden-api-checks [--no-test-api-access]]"); diff --git a/services/core/java/com/android/server/am/CachedAppOptimizer.java b/services/core/java/com/android/server/am/CachedAppOptimizer.java index 28b1fc0610d4c..8675bfd9b2cc8 100644 --- a/services/core/java/com/android/server/am/CachedAppOptimizer.java +++ b/services/core/java/com/android/server/am/CachedAppOptimizer.java @@ -169,6 +169,7 @@ public final class CachedAppOptimizer { static final int COMPACT_SYSTEM_MSG = 2; static final int SET_FROZEN_PROCESS_MSG = 3; static final int REPORT_UNFREEZE_MSG = 4; + static final int COMPACT_NATIVE_MSG = 5; // When free swap falls below this percentage threshold any full (file + anon) // compactions will be downgraded to file only compactions to reduce pressure @@ -731,6 +732,11 @@ public final class CachedAppOptimizer { return false; } + void compactNative(CompactProfile compactProfile, int pid) { + mCompactionHandler.sendMessage(mCompactionHandler.obtainMessage( + COMPACT_NATIVE_MSG, pid, compactProfile.ordinal())); + } + private AggregatedProcessCompactionStats getPerProcessAggregatedCompactStat( String processName) { if (processName == null) { @@ -1864,6 +1870,21 @@ public final class CachedAppOptimizer { Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER); break; } + case COMPACT_NATIVE_MSG: { + int pid = msg.arg1; + CompactProfile compactProfile = CompactProfile.values()[msg.arg2]; + Slog.d(TAG_AM, + "Performing native compaction for pid=" + pid + + " type=" + compactProfile.name()); + Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "compactSystem"); + try { + mProcessDependencies.performCompaction(compactProfile, pid); + } catch (Exception e) { + Slog.d(TAG_AM, "Failed compacting native pid= " + pid); + } + Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER); + break; + } } } }