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; + } } } }